簡體   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