2016-06-02 14 views
7

Я использую api FFMpeg для кодирования изображений в потоке H.264, код выглядит так: encode code. Когда я вызвал функцию avcodec_encode_video2, у меня есть данные AVPacket, затем я сохранил ее в файл. Я использую несколько изображений для получения нескольких файлов для тестирования. Основываясь на стартовом коде 00 00 00 01 или 00 00 01, я обнаружил, что данные 1-го и 2-го файлов содержат несколько H.264 NAL Uints. Но начните с третьего файла, я не могу найти начальный код. Как последующее изображение. PictureКакова связь между AVPacket в FFMpeg и H.264 NAL Uint?

Я чувствую смущение. Основы кода FFMpeg Я думаю, что данные одного из AVPacket должны содержать хотя бы один NAL Uint, но результат является неожиданным. Это означает, что один NAL Uint может быть разделен на две данные AVPackets? Какова связь между AVPacket и H.264 NAL Uint?

+0

Вы можете показать свой код? Я подозреваю, что ваш кодовый вызов фактически не возвратил пакет (got_packet_ptr == 0) или что-то в этом роде. –

+0

Из [FFmpeg doxygen] (http://ffmpeg.org/doxygen/trunk/group__lavc__encoding.html#gaa2dc9e9ea2567ebb2801a08153c7306b) на 'avcodec_encode_video2': * Принимает исходные необработанные видеоданные из фрейма и записывает следующий выходной пакет, если он доступен, в avpkt , Выходной пакет ** не обязательно содержит данные для самого последнего кадра **, поскольку кодеры могут задерживать и переупорядочивать входные кадры по мере необходимости. * Так что, вероятно, он разбит. Можете ли вы объединить данные и передать их декодеру, чтобы узнать, не жалуется или нет? – incBrain

+0

@ RonaldS.Bultje Я отлаживаю свою программу, 'got_output' на самом деле будет правдой каждый раз. – Ello

ответ

0

После некоторого теста я обнаружил, что это просто моя глупая ошибка.
У меня есть avpkt и setRawData для QByteArray в Qt, а затем сохраните bytearray в файл. Перед сохранением я позвонил av_packet_unref, чтобы сбросить avpkt. Я думал, что setRawData скопирует данные avpkt, но на самом деле QByteArray содержит только указатель данных. Таким образом, данные AVPacket содержат по крайней мере один полный NAL Uint, это правильно.

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

После того, как я проверил, кроме начинающих, следующий NAL, все разделенные 00 00 01, и типа NAL, такой же, тоже. Таким образом, каждый AVPacket должен включать по крайней мере один NAL.