繁体   English   中英

检测到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时,出现以下错误。

在此输入图像描述

我该如何解决这个问题。

首先,感谢答案。

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

当提供给期望原始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数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM