2015-10-15 30 views
4

我正在使用ffmpeg transcoding.c示例。 當我將視頻編碼器編解碼器設置爲AV_CODEC_ID_H264並將音頻編碼器編解碼器設置爲AV_CODEC_ID_AAC時,出現以下錯誤。FFMPEG檢測到格式錯誤的AAC比特流:使用音頻比特流過濾器'aac_adtstoasc'來修復它錯誤

enter image description here

我怎樣才能解決這個問題。

+0

我會在源文件中尋找'av_bitstream_filter_init'和'av_bitstream_filter_filter'。 – aergistal

+0

進行編碼的AAC編解碼器的名稱是什麼?它是libfaac嗎? – UmNyobe

+3

爲什麼WIndows用戶傾向於製作控制檯輸出的屏幕截圖,而不是複製和粘貼文本? – LordNeckbeard

回答

4

首先,感謝您的答案。

我的問題的解決方案是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); 
} 
+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數據。