FFMPEG检测到损坏的AAC比特流:使用音频比特流过滤器“aac_adtstoasc”来修复错误。

5
我正在使用ffmpeg的transcoding.c示例进行工作。 当我将视频编码器编解码器设置为AV_CODEC_ID_H264并将音频编码器编解码器设置为AV_CODEC_ID_AAC时,我遇到了以下错误。

enter image description here

我该如何解决这个问题?


我会在源文件中查找 av_bitstream_filter_initav_bitstream_filter_filter - aergistal
进行编码的AAC编解码器的名称是什么?是libfaac吗? - UmNyobe
7
为什么Windows用户倾向于截取控制台输出的屏幕截图,而不是复制和粘贴文本? - llogan
2个回答

6

首先,感谢您提供的答案。

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

你能说一下在那个函数中你添加了它吗?或许作为一个补丁文件。 - Ryan
1
我在使用av_packet_rescale_ts方法之前尝试过。代码运行完成,但生成的文件只有音频... - Setheron

4
当您提供AAC音频帧到期望原始AAC的处理单元时,仍然存在ADTS头。 ADTS头允许您直接将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 中,它是 SPSPPS 数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接