我正在使用ffmpeg transcoding.c示例。 當我將視頻編碼器編解碼器設置爲AV_CODEC_ID_H264並將音頻編碼器編解碼器設置爲AV_CODEC_ID_AAC時,出現以下錯誤。FFMPEG檢測到格式錯誤的AAC比特流:使用音頻比特流過濾器'aac_adtstoasc'來修復它錯誤
我怎樣才能解決這個問題。
我正在使用ffmpeg transcoding.c示例。 當我將視頻編碼器編解碼器設置爲AV_CODEC_ID_H264並將音頻編碼器編解碼器設置爲AV_CODEC_ID_AAC時,出現以下錯誤。FFMPEG檢測到格式錯誤的AAC比特流:使用音頻比特流過濾器'aac_adtstoasc'來修復它錯誤
我怎樣才能解決這個問題。
首先,感謝您的答案。
我的問題的解決方案是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
它是SPS
和PPS
數據。
我會在源文件中尋找'av_bitstream_filter_init'和'av_bitstream_filter_filter'。 – aergistal
進行編碼的AAC編解碼器的名稱是什麼?它是libfaac嗎? – UmNyobe
爲什麼WIndows用戶傾向於製作控制檯輸出的屏幕截圖,而不是複製和粘貼文本? – LordNeckbeard