2012-04-03 16 views
0

FLV-Format-Spezifikation ist hier: http://www.adobe.com/content/dam/Adobe/en/devnet/flv/pdfs/video_file_format_spec_v10.pdfWie entspricht das IPacket von Xuggler einem FLV-Tag oder -Tag?

1) FLV Körper besteht aus Tags

2) Jeder Tag von Kopf- und Daten

4 besteht kann

3) Daten sein AUDIODATA oder ) AUDIODATA besteht aus Deskriptor-Byte und Audio-Frames.

Meine Frage ist: Was ist in IPacket beim Lesen von FLV mit Xuggler?

Derzeit extrahiere ich Audio-Frames von AUDIODATA in meinem Code. Ich analysiere erstes Byte, folge Format, schneide andere Daten, wickle es in IPacket und sende es an IStreamCoder Decoder, der mit abgeleiteten Format eingerichtet wurde.

Aber vielleicht kann ich dies Xuggler anvertrauen? Kann ich IContainer des FLV-Formats erstellen und Peek-Pakete daraus erstellen?

Angenommen, ich übergebe InputStream an IContainer. Kann dieser Stream nur FLV-Körper enthalten? Werden Audiopakete korrekt extrahiert?

Antwort

1

Das IContainer-Objekt in Xuggler analysiert den FLV-Stream und verwendet ihn, um die IStreams im Container zu ermitteln. Wenn Sie dann jedes Paket vom IContainer lesen, überprüfen Sie den IPacket # getStreamIndex() Wert. Dies gibt Ihnen den Stream #, den Sie dann auf dem IContainer verwenden können, um das IStream-Objekt mit den Metadaten zu erhalten.

Die Methode IPacket # getData() gibt die Nutzdaten des Audiomaterials, aber keines der Header-Bytes zurück. Das liegt daran, dass das IContainer/IStream-Objekt diese Bytes isst (und sie sind nicht unabhängig voneinander über Xuggler zugänglich).

All dies funktioniert, weil IContainer Delegaten zu FFmpeg libavformat C-Code, der die Aufgabe der Analyse von FLV-Streams (verwendet von VLC, mPlayer und alle Arten von anderen Bibliotheken).

Hoffnung, dass

Art

+0

Wenn ich 'IPacket # getStreamIndex()' kann ich vermeiden, mit 'IContainer # getStream() + IStream # getStreamCoder()' und nur schaffen 'IStreamCoder' hilft unabhängig mit seiner 'make()' Methode? – Dims

+0

jetzt; Sie müssen das vom IContainer holen, da es tatsächlich der IContainer ist, der die Metadaten verwaltet. –

+0

Was für die Überprüfung der Stream-Nummer des Pakets dann? Wenn ich Coder aus dem Container nehme, muss ich diese Nummer schon angeben. Hab ich recht? Oder ist das eine andere Stream-Nummer? – Dims