@kiwi, @alle: Aber bitte hier nur kurz, das ist sonst einfach zu viel und zu komplex.
MPEG-Video ist in 6 hierarchischen Layern angeordnet, jeder Layer hat einen Header, der im Datenstrom eindeutig erkannt werden kann.
Alle Header beginnen mit 00 00 01 xx, in jedem Header sind für die Decodierung wichtige Daten, meist bitweise angeordnet, enthalten.
Sequence (xx=B3) GOP (Group of Pictures) (xx=B8) Picture (xx=00) Slice (xx=01..AF)
ohne Header : Macroblock, Block
Weiterhin gibt es Sequence-Extensions (xx=B5), Userdata (xx=B2) und Sequence-error (xx=B4) und die Systemstartcodes (xx=B9..FF)
Im Sequence-Header stehen u.a. Bildhöhe, Breite, Framerate, Bitrate, im GOP-Header der Time-Code std:min:sec:frame aber nicht für jedes Bild sondern für eine Gruppe von Bildern. Aber Achtung, diese Zeit hat nichts mit den Timestamps zu tun. Im Picture-Header steht u.a. der Frame-Codingtyp I,P,B
I=Intra coded P=predictive coded B=bidirectional predictive coded
Dann kommen die Slices, Makroblock, Motionvektoren ... ist alles für den Decoder
Die Videodaten wurden vom Demultiplexer wie auch Audio aus dem Transportstrom extrahiert, sie stellen einen packetized elementary stream (PES) dar, der hat -na klar- einen Header - den PES-Header. Für uns ist wichtig, daß dieser den PTS und DTS enthält.
PTS - Presentation Time Stamp DTS - Decoding Time Stamp
Die jeweiligen Systemstartcodes sind Video: 00 00 01 Ex x = Stream-Nummer -> wir finden E1 Audio: 00 00 01 Cx x = "" -> wir finden C0 ----------------------------------------------------------------- Jetzt holen wir mal beispielhaft den Videostream von der Platte und synchronisieren ihn mit dem Audiostream:
Den Offset kennst Du ja aus der FAT. Die ersten Bytes sind nutzlos, weil es wahrscheinlich mitten in irgendeinem Frame losgeht. Wir überlesen solange Bytes, bis wir einen Sequence-Header finden. Ab hier holen wir uns die Daten - bis zum letzten ganzen Picture.
Ich lasse Extensions usw. weg
Es folgt der GOP, das erste Bild nach dem GOP ist immer ein I-Frame. Es kann zu einem sichtaren Bild decodiert werden, P u. B- Frames stellen nur Differenzen zu I-Frames dar und sind alleine nicht verwertbar.
Der Film wird so gesehen : IBBPBBPBBI Übertragen wird er aber so : IPBBPBBIBB
Deshalb auch die beiden Zeitstempel.
Das ist nur eine Beispielfolge, meistens kommt im realen Stream aller 12 Frames ein I-Frame, d.h. bei 25f/sec kürzen wir den Film max. 1/2 Sekunde (macht die Box genauso!)
Wir holen uns den PTS des ersten Bildes aus dem PES-Header - jetzt haben die C- oder Asm-Coder leichte Vorteile wegen der hübschen Bitfummelei und erhalten einen 33-Bit-Wert. Das ist die Zahl der Schwingungen eines 90-kHz-Signals und soll 24 Std. ohne Überlauf abdecken. Rechnet nach: 32 Bit reichen nicht aus. Jetzt müssen wir "nur" noch im Audiostream nach einem Frame suchen, der den gleichen PTS hat und alle Frames davor verwerfen. Audio ist übrigens viel einfacher aufgebaut, die Frames haben gleiche Länge - aber nicht jeder Frame hat einen PTS!! Also muß man ggf. interpolieren und den zeitlich dichtesten Frame nehmen.
Erwähnen muß ich noch, daß anschließend die PES-Daten vor allem aus dem Audio-Stream entfernt werden müssen, nicht alle Decoder kommen damit klar (quietschen). Was da genau stört -> noch klären!
Nun ist der Ton absolut synchron zum Bild. In der Set-Top-Box werden PTS/DTS so verwendet, daß eine PLL den Ton synchron zum Bild hält. Das klappt natürlich auch bei der HD-Wiedergabe, weil eigentlich kein Unterschied zum direkten Gucken besteht, die Daten wurden ja nur mal eben auf der Platte geparkt.
Wir können on the fly weder Bild noch Ton auseinanderziehen oder stauchen. Das heißt u.U. daß die Synchronität über den ganzen Film schlechter wird z.B. auf CD.
Aber da gibt es wohl genug Stoff in den Foren...
So, zum Schluß vielen Dank für die nette Frage nach der Research. Das muß auch nicht 100pro so stimmen, ich habe die Specs eher aus Neugier gelesen wie DVB denn so funktioniert und noch lange nicht alles verstanden. Außerdem mache ich beruflich was gaaanz anderes.
Tiefere Zusammenhänge sollten dann im konkreten Projekt geklärt werden, ich bin auch bereit zu helfen, aber vielleicht doch nicht alles hier im Board durchzukauen.
Wer dann keinen Briefkasten hat, geht leer aus...
So gute Nacht und Cu Happy Jack
_________________ Happy Jack
|