Что означает недопустимый размер блока NAL для декодера h.264?

Я хочу преобразовать файл .mkv в .mp4 с помощью Libav, но когда я пытаюсь декодировать видеопоток h.264, в моем коде возникает сбой

Неверный размер блока NAL 21274662>141

Ошибка разделения ввода на единицы NAL

Похоже, что поток содержит экстраданные AVCC с форматированными данными Приложения B, которые являются недействительными. без рамы!

Не удалось отправить пакет на декодирование ("ошибка недопустимых данных при обработке ввода")

Соответствующий раздел кода доступен ниже.

while(!(ret = av_read_frame(ifmt_ctx, &input_packet))&&(ret>=0)){

         if ((ret = avcodec_send_packet(avctx, &input_packet)) < 0) {
            fprintf(stderr, "Could not send packet for decoding (error '%s')\n",get_error_text(ret));
            return ret;
        }

        ret = avcodec_receive_frame(avctx, iframe);
        if (ret == AVERROR(EAGAIN)) {
            goto read_another_frame;
            /* If the end of the input file is reached, stop decoding. */
        } else if (ret == AVERROR_EOF) {
            break;
        } else if (ret < 0) {
            fprintf(stderr, "Could not decode frame (error '%s')\n",get_error_text(ret));
            break;
        }
        // Default case: encode data
         else {

        }

Я использую в основном новый API (отправить/получить пакет/кадр), и путаница существует, потому что кажется, что h.264 нуждается в специальной реализации. Я с нетерпением жду любой идеи, с чего мне начать отладку.


person Community    schedule 16.08.2019    source источник


Ответы (2)


Это означает, что формат ES несовместим с контейнером. Прочитайте это: Возможные местоположения для параметра Sequence/Picture Набор(ы) для потока H.264

person szatmary    schedule 16.08.2019
comment
Есть ли возможность использовать только декодер Libav h.264 для декодирования данных? - person ; 16.08.2019
comment
В отличие от чего? Если вы просто хотите заполнить AVPacket модулем доступа и вызвать декодирование, тогда да. Если вы хотите обойти эту абстракцию, все равно да, но гораздо сложнее. В любом случае, вы должны сначала развернуть ES из контейнера. - person szatmary; 16.08.2019
comment
Спасибо! Под данными ES вы имеете в виду avctx->extradata_size (в моем случае 35) и avctx->extradata (в моем случае 0x16125e0 \001M@\037\377)? Извините за глупый вопрос... Я не смог найти подходящую документацию. - person ; 16.08.2019
comment
Нет, я имею в виду необработанный элементарный поток (деконтейнеризованный) - person szatmary; 16.08.2019

Я думаю, это потому, что вы не проверяете, является ли пакет видеопотоком. Другими словами, ваш код отправляет все пакеты из всех потоков в кодек h.264.

В этом случае способом решения проблемы было бы добавление простого условия, которое пропускает паровые пакеты без видео как таковые:

if (input_packet->stream_index != video_stream->index) continue;

Предположим, что video_stream — это первый видеопоток, обнаруженный в массиве потоков контекста формата ifmt_ctx-›streams.

person emdou    schedule 07.10.2020