检测到 FFMPEG 格式错误的 AAC 比特流:使用音频比特流过滤器 'aac_adtstoasc' 修复错误

FFMPEG Malformed AAC bitstream detected : use the audio bitstream filter 'aac_adtstoasc' to fix it error

我正在使用 ffmpeg transcoding.c 示例。 当我将视频编码器编解码器设置为 AV_CODEC_ID_H264 并将音频编码器编解码器设置为 AV_CODEC_ID_AAC 时,出现以下错误。

我该如何解决这个问题。

当提供给需要原始 aac 的处理单元时,您的 aac 音频帧仍然有 adts headers。 Adts header 允许您将 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;

没有它们,编码器可能会在发送到容器的数据中添加元数据。 AACADTS header,H264SPSPPS 数据。

首先感谢您的回答。

我的问题的解决方案是 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);
}