2016-06-02 24 views
7

Używam api FFMpeg do kodowania obrazów do strumienia H.264, kod jest taki jak ten encode code. Kiedy zadzwoniłem do funkcji avcodec_encode_video2 otrzymałem jedno dane AVPacket, a następnie zapisałem je do pliku. Używam kilku obrazów, aby uzyskać kilka plików do testu. Na podstawie kodu startowego 00 00 00 01 lub , znalazłem, że dane pierwszego i drugiego pliku zawierają obie H.264 NAL Uints. Ale zacznij od trzeciego pliku, nie mogę znaleźć kodu początkowego. Podobnie jak obserwowany obraz. PictureJaki jest związek między AVPacket w FFMpeg i H.264 NAL Uint?

Czuję się zdezorientowany. Bazując na kodzie FFMpeg, uważam, że dane jednego pakietu AVPacket powinny zawierać co najmniej jedną NAL Uint, ale wynik jest nieoczekiwany. Czy to oznacza, że ​​jeden NAL Uint może być podzielony na dwa dane AVPackets? Jaki jest związek między AVPacket a H.264 NAL Uint?

+0

Czy możesz pokazać swój kod? Podejrzewam, że twoje wywołanie kodowania w rzeczywistości nie zwróciło pakietu (got_packet_ptr == 0) lub coś podobnego. –

+0

Od [FFmpeg doxygen] (http://ffmpeg.org/doxygen/trunk/group__lavc__encoding.html#gaa2dc9e9ea2567ebb2801a08153c7306b) na 'avcodec_encode_video2': * Wprowadza wejściowe surowe dane wideo z ramki i zapisuje następny pakiet wyjściowy, jeśli jest dostępny, do avpkt . Pakiet wyjściowy ** niekoniecznie zawiera dane dla najnowszej ramki **, ponieważ kodery mogą wewnętrznie opóźniać i zmieniać kolejność ramek w razie potrzeby. * Prawdopodobnie jest on podzielony. Czy możesz połączyć dane i przekazać je do dekodera, aby sprawdzić, czy narzeka, czy nie? – incBrain

+0

@ RonaldS.Bultje I debugować mój program, 'got_output' faktycznie tak naprawdę za każdym razem. – Ello

Odpowiedz

0

Po pewnym teście odkryłem, że to tylko mój głupi błąd.
Mam avpkt i setRawData do QByteArray w Qt, a następnie zapisz plik bytearray do pliku. Przed zapisaniem zadzwoniłem pod numer av_packet_unref, aby zresetować AVPkt. Myślałem, że setRawData skopiuje dane avpkt, ale faktycznie QByteArray zawierają tylko wskaźnik danych. Tak więc jeden pakiet AVPacket zawiera co najmniej jedną kompletną wersję NAL Uint, to prawda.

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

Po testowane, z wyjątkiem początkujących następujące NAL wszystkie oddzielone 00 00 01 i typu NAL jest taka sama, za. Dlatego każdy pakiet AVP powinien zawierać przynajmniej jedną NAL.

Powiązane problemy