Я работаю с ffmpeg transcoding.c пример.
Когда я установил кодек видеокодера в AV_CODEC_ID_H264 и кодек аудиокодера в AV_CODEC_ID_AAC, я получил следующую ошибку.
Как я могу решить эту проблему.
Ваши аудио-кадры 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
данные.
Прежде всего, спасибо за ответы.
Решением моей проблемы является 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);
}