Jump to content
Sign in to follow this  
Lower

Falsche Uhrzeit im Teletext

Recommended Posts

Lower

Wenn ich mithilfe der Funktion "Videotext.Getpage(100,0)" des Com-Interface der neuen DVBViewer Version 3.2.1 die Daten aus dem Teletext Seite 100 abfrage, wird dort nicht die aktuelle Uhrzeit angezigt.

 

Bsp:

Wenn ich jede Sekunde die Daten aus dem Teletext (Seite egal) abrufe, müsste bei jeder Abfrage eine andere Uhrzeit vorkommen (1 Sekunde später).

Das ist aber nicht der Fall. Die Uhrzeit bleibt "stehen".

Manchmal wird erst nach etwa 10 Sekunden die aktuelle Zeit angezeigt.

 

Ausnahme:

Wenn ich nun allerdings vom DVBViewer das Teletextfenster öffne und offen lasse und dann den Teletext abfrage, wird die richtige Uhrzeit angezeigt (ändert sich jede Sekunde).

 

Woran liegt das?

Ist das ein Fehler des COM-Interface oder des DVB-Viewers oder ...?

 

Gruß

Lower

;)

Share this post


Link to post
Guest Lars_MQ

Hmm, hab ich noch nie probiert. Die daten werden direkt aus dem seitenpuffer des DVBViewer entnommen.

Da der gesamte videotextkram eh grade umgestellt wurde auf grigas neue klasse, hat sich auch der bereich geändert (nur intern). Ich werde mal testen ob das immer noch so ist.

Share this post


Link to post
Griga

Die Ursache ist, dass Teletextseiten nicht im Sekundenrythmus upgedatet werden. Bei manchen eher unwichtigen kann es länger als eine Minute dauern.

 

Die laufende Uhrzeit im Teletext-Fenster ist "getrickst". Und zwar wird von *jeder* empfangenen Seite die Kopfzeile in einem separaten Puffer gespeichert.

 

Die rechte Hälfte der *originalen* Kopfzeile der dargestellten Seite überschreibt der DVBViewer dann im Sekundenrhythmus durch die rechte Hälfte der *zuletzt empfangenen* Kopfzeile.

 

Was das COM-Interface liefert, ist dagegen die unverfälschte Seite. An der Uhrzeit kann man sehen, wann sie zuletzt upgedatet wurde. Allerdings ließe sich der gleichen Trick mit etwas Bastelei auch hier anwenden.

Share this post


Link to post
Guest Lars_MQ

Wobei ich den sinn einer synthetischen zeit dort bezweifle, da es die computer und nicht die "teletextzeit" widerspiegelt.

 

Ich bin da offen, wird das benötigt? dann füge ich das ein.

Share this post


Link to post
Griga
Wobei ich den sinn einer synthetischen zeit dort bezweifle

 

Ebenfalls. Die Uhrzeit ist durch die Teletext-Spezifikationen nicht zwingend vorgeschrieben. Das Format und die genaue Position ist je nach Sender verschieden (insbesondere bei ausländischen Kanälen), manche blenden an der Stelle zeitweise Laufschrift oder sonstwas ein...

 

Ich habe mich auch schon gefragt, ob das im DVBViewer sein muss. Das sekündliche Neu-Rendern der Teletext-Seite verbrät nämlich einiges an Rechenzeit (gibt schöne Zacken in der Taskmanager-Prozessorlast-Kurve).

 

Allerdings sind es viele Anwender vom Fernseher und dessen Hardware-Teletextdecoder gewohnt, dass die Uhr läuft, und wenn sie es beim DVBViewer nicht tut, wird dies - wie sollte es auch anders sein - als "Bug" bemängelt. ;)

 

Was für das Plugin- oder COM-Interface eher Sinn machen würde, wäre eine Art Callback, der aufgerufen wird, sobald eine bestimmte Seite (oder meinetwegen irgendeine Seite) neu eingetroffen ist - gerade Lowers Anwendung könnte dann noch präziser und ohne ständiges Polling arbeiten.

 

Allerdings müsste dieser Callback sauber von dem Thread entkoppelt werden, der die Teletext-Daten anliefert, weil es der gleiche Thread ist, der alle DVB-Daten (also auch Video & Audio) verteilt. Sonst könnte ein Fehler in einem COM-Client den ganzen DVBViewer zum Absturz bringen, und zwar heftigst. Ich würde deshalb intern ein PostMessage zwischenschalten.

Share this post


Link to post
Guest Lars_MQ
Allerdings müsste dieser Callback sauber von dem Thread entkoppelt werden, der die Teletext-Daten anliefert, weil es der gleiche Thread ist, der alle DVB-Daten (also auch Video & Audio) verteilt. Sonst könnte ein Fehler in einem COM-Client den ganzen DVBViewer zum Absturz bringen, und zwar heftigst. Ich würde deshalb intern ein PostMessage zwischenschalten.

Das war genau der grund, warum ich die Events aus dem COM wieder rausgenommen hatte. ;)

 

Ein Absturz wäre zwar auch denkbar, aber der gesamte thread würde für die verarbeitungszeit angehalten und das wäre genauso fatal...

 

Ein ständiges Callback würde das system sicherlich auch unnötig belasten, daher müsste man dort wohl mit registrierung für einzelne Seiten arbeiten. Oh, ich sehe schon, dort sind noch so einige Möglichkeiten B)

Share this post


Link to post
Lower

Was für das Plugin- oder COM-Interface eher Sinn machen würde, wäre eine Art Callback, der aufgerufen wird, sobald eine bestimmte Seite (oder meinetwegen irgendeine Seite) neu eingetroffen ist - gerade Lowers Anwendung könnte dann noch präziser und ohne ständiges Polling arbeiten.

 

Allerdings müsste dieser Callback sauber von dem Thread entkoppelt werden, der die Teletext-Daten anliefert, weil es der gleiche Thread ist, der alle DVB-Daten (also auch Video & Audio) verteilt. Sonst könnte ein Fehler in einem COM-Client den ganzen DVBViewer zum Absturz bringen, und zwar heftigst. Ich würde deshalb intern ein PostMessage zwischenschalten.

 

Wäre optimal, wenn mein Programm benachrichtigt werden würde, sobald sich der Teletext Seite X geändert hat.

Ich müsste nicht jede Sekunde oder noch schneller den Teletext öffnen und überprüfen, ob ein neues Lied angefangen hat.

 

Allerdings weis ich nicht, wie man mit der SendMessage beim Empfang umgeht.

D.h. ich weis nicht, wie ich abrufen kann, ob eine Message für mich angekommen ist oder nicht, und was diese beinhaltet.

 

Müsste ich da wieder auf eine API zurückgreifen - was für eine API?

 

Gruß

Lower

;)

Share this post


Link to post
Guest Lars_MQ
Allerdings weis ich nicht, wie man mit der SendMessage beim Empfang umgeht.

D.h. ich weis nicht, wie ich abrufen kann, ob eine Message für mich angekommen ist oder nicht, und was diese beinhaltet.

 

Müsste ich da wieder auf eine API zurückgreifen - was für eine API?

Also wenn ich das einbaue, würde das komplett über COM passieren.

Du würdest dann mit "with events" arbeiten.

 

Das mit dem Postmessage ist für das DVBViewer interne handling ;)

Share this post


Link to post
Griga
Ein ständiges Callback würde das system sicherlich auch unnötig belasten

 

Nicht unbedingt. Die Datenrate bei Teletext liegt ungefähr im Bereich von Audio. Sagen wir mal über den Daumen gepeilt 240 kbit/s = 40 KB/s. Jede Seite ist 1 KB groß, macht 40 Callbacks pro Sekunde. Die Größenordnung wäre noch zu verkraften.

 

Eine flexible Lösung, die unnötigen Callback-Overhead vermeidet, könnte darin bestehen, dass der Client einen Seitenbereich für den Callback angibt: Von...bis. Ein Programm, das Programminformationen oder Teletext-Börsenkurse auswertet, wäre darüber sicher glücklich. ;)

Share this post


Link to post
Lower

@ Lars_MQ:

Ich habe mir soeben die neue DVBViewer Version heruntergeladen als auch die neue Com-Interface Beschreibung.

 

Mir ist aufgefallen, dass wenn ich den Teletext abrufe erhalte ich nun die aktuelle auf die Sekunde genaue Uhrzeit.

In der alten Version des DVBViewer konnte ich nur die um paar Sekunden verzögerte Uhrzeit abrufen.

 

Wie haste du das nun in COM-Interface abgeändert?

Ist die dort nun angezeige Uhrzeit nun sehr genau (auf die 1/10 Sekunde)?

Ich brauche nämlich für den DVB-MR eine sehr genaue Teletextuhrzeit.

 

Konntest du eigentlich die Benachrichtigung bei Teletextaktuallisierung durch das 'WithEvent' realisieren?

 

 

Gruß

Lower

:bye:

Share this post


Link to post
Guest Lars_MQ

Ich habe dort nichts geändert. Allerdings wurde die interne Teletextengine umgestellt auf die neue engine von Griga. Ich vermute, das hängt damit zusammen. (Ich glaube die zeit wird synthetisch generiert, aber sicher bin ich nicht).

 

Die Eventunterstützung wird für die nächste grössere version kommen, dafür muss ich einiges ergänzen und testen vorher. :bye:

Share this post


Link to post
Griga
Ich glaube die zeit wird synthetisch generiert

 

Nicht ganz. Beim Ermitteln der zu einer Nummer gehörenden Teletext-Seite mit

 

function TTeleParser.FindPage(PageNr,SubNr: Integer; var Page: TPageClass): Boolean;

 

wird deren Header-Zeile teilweise ausgetauscht (exakt die zweite Hälfte ab Spaltenposition 20), und zwar gegen die Headerzeile der zuletzt vom Sender empfangenen Seite (mit beliebiger Nummer).

 

Die Präzision hängt also vom Rhythmus ab, in dem Teletextseiten gesendet werden, und davon, wie der Sender das Einfügen der Uhrzeit in die Kopfzeile handhabt.

 

Man kann nicht davon ausgehen, dass die Zeit bei verschiedenen Sendern immer im gleichen Format an der gleichen Stelle auftaucht. Ich habe es schon erlebt, dass anstelle der Uhr zeitweise Werbe-Laufschrift erschien. Also eine wackelige Angelegenheit. :bye:

Share this post


Link to post
Lower

Lasst sich eigenlich irgendwie ermitteln in was für einem Abstand eine bestimmte Teletextseite gesendet wird?

 

Lower

Share this post


Link to post
Griga

Mit der alten Version ja, durch Vergleich der Uhrzeit in der Kopfzeile, sobald sie sich geändert hat. Mit der neuen nicht. Da musst du auf den Event-Mechanismus warten.

 

Aber gerade bei Seiten, die "just in time" außerhalb der normalen Reihenfolge gesendet werden, wie z.B. Untertitelseiten, kann der Abstand sehr unregelmäßig sein.

Share this post


Link to post
Lower

@ Griga: Dann muss ich wohl wieder jede Sekunde oder noch schneller den Teletext abfragen. Belastet aber zum Glück die heutigen PC's nicht besonders. :)

 

Wäre toll, wenn der 'Event'-Mechanismus in der nächst größeren DVBViewer Version mit eingebaut würde. Freue mich schon auf diese Funktion.

 

Gruß

Lower

:bye:

Share this post


Link to post
Guest Lars_MQ

Um das alte thema wieder aufzuwärmen:

ich habe jetzt angefangen die events zu integrieren. es gibt für teletext ein event, das aufgerufen wird bei eintrag einer neuen seite in den teletext seiten buffer. Das event meldet die Page und die Subpage. Ich habe das mal mit Word und VB probiert, innerhalb von 5 minutenhatte ich über 400 A4 seiten voller teletext :) Gut das system leidet etwas, aber die grösste last lag bei dem word teil, also wenn man die seiten gleich filtert, sollte das nicht so schlimm werden...

 

Jetzt überlege ich was man noch für events braucht... OnChannelchange habe ich schon :D

Share this post


Link to post
Klausing
Ich habe das mal mit Word und VB probiert, innerhalb von 5 minutenhatte ich über 400 A4 seiten voller teletext
Würdest Du das einem Nichtprogrammierer vielleicht als Schritt für Schritt-Anleitung mal erklären wie das geht? :D

Ich würde so etwas gern in die FAQ aufnehmen, hab aber absolut keinen Plan davon. :)

Share this post


Link to post
Guest Lars_MQ

Wenn das ganze fertig ist, baue ich das in die COM-Doku mit ein und werde versuchen für jede Funktion ein Worddokument mit integriertem VB-Code als Demo zur verfügung zu stellen (die nutze ich ja auch zum testen ;)).

 

Ob das nun anwendungen sind, die in ein allgemeinen Faq passen, wage ich zu bezweifeln, aber wir können ja eine kleine ecke mit kochrezepten für programmierungen mit dem COM kram einrichten :) Dort könnten wir auch alle comscripte die hier veröffentlicht wurden sammeln, wenn deren autoren zustimmen :D Da haben wir das wenigstens mal zentral.

Share this post


Link to post
Lower
Um das alte thema wieder aufzuwärmen:

ich habe jetzt angefangen die events zu integrieren. es gibt für teletext ein event, das aufgerufen wird bei eintrag einer neuen seite in den teletext seiten buffer. Das event meldet die Page und die Subpage. Ich habe das mal mit Word und VB probiert, innerhalb von 5 minutenhatte ich über 400 A4 seiten voller teletext ;) Gut das system leidet etwas, aber die grösste last lag bei dem word teil, also wenn man die seiten gleich filtert, sollte das nicht so schlimm werden...

 

Jetzt überlege ich was man noch für events braucht... OnChannelchange habe ich schon ;)

 

@ Lars_MQ

 

Das ist ja suuuuper!! :D(w00t):bounce:

 

Hab die neue Version des DVB-MR fast fertig - habe dort den Teletext eben zwischen 1 und 10 mal in der Sekunde abgefragt. Das würde nun wegfallen. Ich müsste also nur auf des Event warten. Das ist schonmal viel angenehmer.

 

Wann würde dann ungefähr der DVBViewer mit neuem COM-Interface herauskommen?

Oder lässt sich das COM-Interface auch schon in die jetzige DVBViewer Version intigrieren (nachrüsten)?

 

Wäre super wenn ich nächste Woche das neue COM-Interface zur Verfügung hätte. Dann könnte ich den DVB-MR nämlich in den Herbstferien umbauen bzw. vielleicht schon fertig stellen.

 

 

Ein Event, das beim Staten oder Beenden des DVBViewer ausgelöst wird wäre vielleicht auch noch nützlich. Sonst fäll mir auf die Schnelle kein weiteres Event ein.

 

 

 

Mfg.

Florian :)

Share this post


Link to post
Guest Lars_MQ
Wäre super wenn ich nächste Woche das neue COM-Interface zur Verfügung hätte. Dann könnte ich den DVB-MR nämlich in den Herbstferien umbauen bzw. vielleicht schon fertig stellen.

Na da werden wir mal mit Christian reden, ob man da nicht was regeln kann. (w00t)

 

Ein Event, das beim Staten oder Beenden des DVBViewer ausgelöst wird wäre vielleicht auch noch nützlich. Sonst fäll mir auf die Schnelle kein weiteres Event ein.

Also ein Close event habe ich.

Ein start event ist etwas schwierig, weil, um an das event zu kommen, brauchst du das DVBViewer interface und das kriegste nur, wenn der DVBViewer schon gestartet ist... :D

 

Diese events hab ich schon (plus das onTeletext event)

  function OnChannelChange(ChannelNr: Integer): 
 function onRDS(RDS: WideString): HResult
 function onOSDWindow(WindowID: Integer): HResult 
 function onDVBVClose: HResult
 function onStartRecord(ID: Integer): HResult 
 function onEndRecord: HResult 
 function onPlaybackstart: HResult
 function OnPlaybackEnd: HResult 
 function OnPlaystatechange(State: Integer): HResult

Share this post


Link to post
Lower
Na da werden wir mal mit Christian reden, ob man da nicht was regeln kann. :)

 

Das wäre einfach toll, wenn sich da so schnell was machen würde. :D

 

Also ein Close event habe ich.

Ein start event ist etwas schwierig, weil, um an das event zu kommen, brauchst du das DVBViewer interface und das kriegste nur, wenn der DVBViewer schon gestartet ist... :bounce:

 

Das Starten-Event würde dann also nur verzögert gesendet werden - sobald das COM-Interface vom DVBViewer "eingerichtet" würde.

 

Diese events hab ich schon (plus das onTeletext event)

  function OnChannelChange(ChannelNr: Integer): 
 function onRDS(RDS: WideString): HResult
 function onOSDWindow(WindowID: Integer): HResult 
 function onDVBVClose: HResult
 function onStartRecord(ID: Integer): HResult 
 function onEndRecord: HResult 
 function onPlaybackstart: HResult
 function OnPlaybackEnd: HResult 
 function OnPlaystatechange(State: Integer): HResult

 

Das sind ja schon richtig viele. (w00t) Das RDS-Event könnte bei der Musikaufnahme von Radio auch sehr hilfreich sein - baue ich aber vorerst noch nicht in den DVB-MR ein.

 

Mfg.

Florian

Share this post


Link to post
Lower
Ich habe das mal mit Word und VB probiert, innerhalb von 5 minutenhatte ich über 400 A4 seiten voller teletext :)

 

Die neue DVBViewer Pro EXE mit dem neuen COM-Interface ist ja schon seit gestern auf dem FTP. Das ging ja schnell. :bye:

 

Ich habe auch gleich gestern die neue EXE gedownloadet und versucht die Events zu nutzen (in VB.Net und in VB 6.0), doch komsischweise hat es in keiner Programmiersprache funktioniert. Entweder ich habe irgend etwas Grundlegendes vergessen, oder die Events des COM-Interface funktionieren bei mir nicht - was ich eigentlich nicht glaube. :P

 

Kannst du mir mal die Source von deinem VB-Testprogramm, in dem du ein Event genutzt hast zur Verfügung stellen, damit ich weis was ich falsch gemacht habe?

 

Gruß

Florian

Share this post


Link to post
Guest Lars_MQ

Das beispiel ist aus Word, sollte sich aber problemlos anpassen lassen.

Eine klasse:

 

Klasse1

Public WithEvents FVideotext As DVBViewerServer.Teletextmanager
Public WithEvents FDVBEvents As DVBViewerServer.DVBViewerEvents


Private Sub FDVBEvents_OnChannelChange(ByVal ChannelNr As Long)
 If Not FDVBEvents Is Nothing Then
   Selection.InsertAfter ChannelNr
End If
End Sub

Private Sub FVideotext_onDataArrive(ByVal PageNr As Long, ByVal SubPageNr As Long)
If Not FVideotext Is Nothing Then
   Selection.InsertAfter FVideotext.GetPage(PageNr, SubPageNr)
End If
End Sub

 

im hauptcode:

Dim DVBViewer As IDVBViewer
Dim MyEvents As New Klasse1

Private Sub HookItUp()
  Set DVBViewer = GetObject(, "DVBViewerServer.DVBViewer")
  Set MyEvents.FVideotext = DVBViewer.Videotext
  Set MyEvents.FDVBEvents = DVBViewer.Events
End Sub

 

Zu beachten ist:

- DVBViewerServer.DVBViewerEvents implementiert nur die Events, keiner methoden oder properties.

- DVBViewerServer.Teletextmanager implementiert das event und zur bequemlichkeit auch gleich das IVideotext Interface.

 

Beide Objekte müssen über das IDVBViewer Interface bezogen werden.

 

gruss

Lars

Share this post


Link to post
Lower

@ Lars_MQ:

 

Der Code hat mir sehr geholfen.

Jetzt funktionieren die Events bei mir in VB.Net sowohl als auch in VB 6.0. Ich hatte einen kleinen Denkfehler ("Set" vergessen). :)

 

Das neue COM-Interface ist einfach super! Ich werde gleich mal alle Events ausprobieren. :P:bye:

 

Mfg.

Florian

Share this post


Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...