2015-10-02 2 views
3

Я пытаюсь декодировать кадр H264, используя библиотеку libav. После инициализации библиотеки путем выделения кадра и контекста, я использую следующий код для декодирования:libav - Декодирование H264 Ошибка кадра

AVPacket pkt; 
int got_picture, len; 
av_init_packet(&pkt); 
pkt.size = size; 
pkt.data = buffer; 
while(pkt.size > 0) { 
    if((len = avcodec_decode_video2(context, frame, &got_picture, &pkt)) < 0) { 
     break; 
    } 

    if(got_picture) { 
     // Do something with the picture... 
    } 

    avPkt.size -= len; 
    avPkt.data += len; 
} 

Однако всякий раз, когда я называю avcodec_decode_video2 печатает следующее сообщение об ошибке в консоли:

[...]  
[h264 @ 000000000126db40] AVC: The buffer size 210 is too short to read the nal length size 0 at the offset 210. 
[h264 @ 000000000126db40] AVC: The buffer size 283997 is too short to read the nal length size 0 at the offset 283997. 
[h264 @ 000000000126db40] AVC: The buffer size 17137 is too short to read the nal length size 0 at the offset 17137. 
[...] 

Что я Я пропустил? Я попытался найти темы, касающиеся аналогичной проблемы, но ничего не получилось. Или я могу отладить ошибку, чтобы получить больше информации об этом?

+0

Что такое возвращаемое значение avcodec_decode_video2()? –

+0

Возвращаемое значение равно количеству оставшихся байтов. Кроме того, указатель got_picture отличен от нуля, поэтому я предполагаю, что декомпрессия прошла успешно. Тем не менее, я всегда получаю эту ошибку. – chrisp

+0

Я даже не знаю, что пытается сказать сообщение об ошибке. О каком буфере относится ошибка? – chrisp

ответ

1

Во-первых, я предполагаю, что вы правильно распределите выходной кадр.

И @AntonAngelov, я использую 11.04. Знаете ли вы, что ошибка должна сказать? О каком буфере относится ошибка?

Я просто посмотрел источник 11.04 (в /avcodec/h264.c), но я не видел, где эта ошибка генерируется, а в старых версиях она присутствует.

Похоже, что ошибка говорит о том, что размер пакетов NALU, который вы отправляете на декодер, составляет 0.

Я думаю, что вы должны получить SPS и PPS заголовки как-то из LIVE555 и предоставлять их в декодер через это extradata (также вы должны установить extradata_size), перед вызовом avcodec_open2() ,

Еще одна идея - просто сбросить все пакеты, которые вы получаете, в один файл .h264. Затем используйте программное обеспечение для разбора потоковых потоков h264 (see here for example). Также попробуйте воспроизвести его с помощью avplay или VLC, чтобы узнать, правильно ли настроен бит.

Редактировать: Here Ответ на подобный вопрос.

+0

Благодарим за отзыв. Это сужает мне ошибку. Я еще раз рассмотрю декодирование блоков PPS и SPS. В настоящий момент я использую функцию 'fmtp_spropparametersets' LIVE555 для приема единиц. Возможно, есть проблема, когда я пытаюсь декодировать набор параметров. Кроме того, я перепроверю версию libav, которую я использую. Я вернусь к вам относительно всего этого завтра (а не дома в данный момент). Ваша вторая идея хорошая, однако, я уже делал это в прошлом, используя ffplay. Таким образом, бит-поток кажется прекрасным. – chrisp

+0

@ Крис. Вы выяснили, в чем проблема? Я в той же ситуации Live555 + Libav. Он отлично декодирует, но он постоянно выводит ошибку размера буфера. –

+1

@chuckleplant Я повторно скачал libav + работал над исправлением SPS и PPS-инициализации. – chrisp

1
AVPacket pkt; 
int got_picture, len; 
av_init_packet(&pkt); 
pkt.size = size; 
pkt.data = buffer; 
while(pkt.size > 0) { 
    if((len = avcodec_decode_video2(context, frame, &got_picture, &pkt)) < 0) { 

Ваш код беспокоит меня, так как вы вручную инициализации AVPacket, но ты не говоришь нам, где буфер/размер пришел. Я почти уверен, учитывая сообщение об ошибке, что вы читаете необработанные данные из файла, сокета или чего-то подобного, как если бы это был необработанный поток приложений.

FFmpeg (или Libav, если на то пошло) не принимает такие данные, как ввод в свой декодер H.264. Чтобы решить эту проблему, используйте AVParser, как объяснялось ранее в сообщении this.

+0

Спасибо за ваш ответ. Однако, это не так. Буфер включает один кадр, поставляемый LIVE555. Проблема, похоже, имеет отношение к значениям SPS и PPS. Я отправлю обновление в мой исходный поток за мгновение. :) – chrisp