FFMPEG Обнаружен искаженный поток битов AAC: используйте фильтр аудио потока битов ‘aac_adtstoasc’, чтобы исправить ошибку

Я работаю с ffmpeg transcoding.c пример.
Когда я установил кодек видеокодера в AV_CODEC_ID_H264 и кодек аудиокодера в AV_CODEC_ID_AAC, я получил следующую ошибку.

введите описание изображения здесь

Как я могу решить эту проблему.

4

Решение

Ваши аудио-кадры aac по-прежнему имеют заголовки adts, когда они передаются блоку обработки, который ожидает необработанный aac. Заголовок объявления позволяет вывести данные AAC непосредственно в файл, вызвать его foo.aac и откройте его с другой программой.

В этом случае единицей является код контейнера MP4. MP4 контейнер требует AV_CODEC_FLAG_GLOBAL_HEADER, что означает, что весь поток должен содержать только данные потока, а другие данные предоставляются настройкой AVCodecContext.extradata, Поскольку MP4 имеет свой собственный способ передачи метаинформации (здесь информация о транспортировке), запись этого префикса транспорта перед каждым кадром сделает данные нечитаемыми.

Вы уверены, что у вас есть следующие строки и что флаг CODEC_FLAG_GLOBAL_HEADER установлен?

//ofmt_ctx is AVFormatContext
//enc_ctx is the AVCodecContext of the current stream
if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)
enc_ctx->flags |= CODEC_FLAG_GLOBAL_HEADER;

Без них кодер может добавлять метаданные в данные, которые отправляются в контейнер. За AAC это ADTS заголовок, для H264 это SPS а также PPS данные.

4

Другие решения

Прежде всего, спасибо за ответы.

Решением моей проблемы является AVBitStreamFilterContext *. Я добавил следующие строки в метод «encode_write_frame», и это нормально.

if(ifmt_ctx->streams[stream_index]->codec->codec_type == AVMEDIA_TYPE_VIDEO && ifmt_ctx->streams[stream_index]->codec->codec_id == AV_CODEC_ID_H264){
AVBitStreamFilterContext* h264BitstreamFilterContext = av_bitstream_filter_init("h264_mp4toannexb");
av_bitstream_filter_filter(h264BitstreamFilterContext, ofmt_ctx->streams[stream_index]->codec, NULL, &enc_pkt.data, &enc_pkt.size, enc_pkt.data, enc_pkt.size, 0);
} else if(ifmt_ctx->streams[stream_index]->codec->codec_id == AV_CODEC_ID_AAC) {
AVBitStreamFilterContext* aacBitstreamFilterContext = av_bitstream_filter_init("aac_adtstoasc");
av_bitstream_filter_filter(aacBitstreamFilterContext, ofmt_ctx->streams[stream_index]->codec, NULL, &enc_pkt.data, &enc_pkt.size, enc_pkt.data, enc_pkt.size, 0);
}
4

По вопросам рекламы [email protected]