2016-06-02 35 views
7

Ich benutze FFMpeg's API, um Bilder in H.264-Stream zu kodieren, der Code ist wie folgt encode code. Als ich die Funktion avcodec_encode_video2 anrief, bekam ich die Daten eines AVPackets, dann speicherte ich es in der Datei. Ich benutze mehrere Bilder, um mehrere Dateien zum Test zu bekommen. Basierend auf dem Startcode 00 00 00 01 oder 00 00 01, fand ich, dass die Daten der 1. und 2. Datei beide mehrere H.264 NAL Uints enthalten. Aber ab der dritten Datei kann ich den Startcode nicht finden. Wie das folgende Bild. PictureWelche Beziehung besteht zwischen AVPacket in FFMpeg und H.264 NAL Uint?

Ich fühle mich verwirrt. Basierend auf dem Code von FFMpeg denke ich, dass die Daten eines AVPackets mindestens eine NAL Uint enthalten sollten, aber das Ergebnis ist unerwartet. Bedeutet das, dass eine NAL Uint in zwei AVPackets Daten aufgeteilt werden kann? Welche Beziehung besteht zwischen AVPacket und H.264 NAL Uint?

+0

Können Sie Ihren Code anzeigen? Ich vermute, dass Ihr Encoding-Aufruf nicht wirklich ein Paket zurückgab (got_packet_ptr == 0) oder so ähnlich. –

+0

Von [FFmpeg doxygen] (http://ffmpeg.org/doxygen/trunk/group__lavc__encoding.html#gaa2dc9e9ea2567ebb2801a08153c7306b) auf 'avcodec_encode_video2': * Nimmt rohe Videodaten aus dem Frame und schreibt das nächste Ausgabepaket, falls verfügbar, an avpkt . Das Ausgabepaket ** enthält nicht unbedingt Daten für den letzten Frame **, da Encoder interne Frames je nach Bedarf intern verzögern und neu anordnen können. * Wahrscheinlich ist es also aufgeteilt. Können Sie die Daten verketten und sie dem Decoder zuführen, um zu sehen, ob sie sich beschweren oder nicht? – incBrain

+0

@ RonaldS.Bultje Ich debugge mein Programm, die 'got_output' tatsächlich jedes Mal wahr. – Ello

Antwort

0

Nach ein paar Tests habe ich festgestellt, dass es nur mein blöder Fehler ist.
Ich habe die Avpkt und setRawData auf QByteArray in Qt, dann speichern Sie das Bytearray in Datei. Vor dem Speichern rief ich av_packet_unref an, um das avpkt zurückzusetzen. Ich dachte, dass setRawData die Daten des AVPKT kopieren würde, aber das QByteArray enthält eigentlich nur den Datenzeiger. Die Daten eines AVPackets enthalten also mindestens eine vollständige NAL Uint, das ist korrekt.

1
00 00 00 01 41..... 
........00 00 01 41 
....00 00 01 41...... 
....... 

Nach I getestet, mit Ausnahme der Anfänger, alle folgenden NAL durch 00 00 01 getrennt und NAL-Typ ist die gleiche, auch. Also sollte jedes AVPacket mindestens eine NAL enthalten.