2012-03-29 186 views
1

這段代碼有什麼問題?它在av_find_stream_info處中斷(訪問衝突)。在調試時,ctx-> filename是「3」而不是「1.MP3」:前4個字符被忽略,也檢查其他文件,結果相同。C++ ffmpeg訪問衝突

av_register_all(); 
AVFormatContext *ctx=0; 
ctx=avformat_alloc_context(); 
avformat_open_input(&ctx,"1.MP3",0,0); 
av_find_stream_info(ctx); 
int istream; 
for(int i=0;i<ctx->nb_streams;i++){ 
if(ctx->streams[i]->codec->codec_type==AVMEDIA_TYPE_AUDIO){ 
     istream=i; 
     break; 
} 
+1

您將永遠無法調試不包含錯誤檢查的代碼。 'avformat_open_input'的返回值是什麼? – 2012-03-29 09:57:02

+2

avformat_open_input返回-2。 – user1288043 2012-03-29 10:11:11

回答

4

avformat_open_input失敗。使用av_strerror找出爲什麼avformat_open_input不合格。由avformat_open_input返回的負值表示錯誤情況。

+0

av_strerror正在執行訪問衝突。 – user1288043 2012-03-29 10:50:17

+1

您需要顯示該代碼。 – JimR 2012-03-29 10:56:00

1

您的代碼包含一個錯誤 - 即使avformat_open_input失敗,它也會調用av_find_stream_info

-2可能是-ENOENT - 沒有這樣的文件或目錄。也許你在錯誤的目錄中。也許該文件的名稱是1.mp3,而不是1.MP3,並且您的文件系統區分大小寫。

但是,您不能調試不檢查錯誤的代碼。

+0

將完整路徑「F:\\ 1.mp3」放入後,avformat_open_input返回0(成功),但同時ctx-> filename爲「.mp3」,前4個字符被修剪。 – user1288043 2012-03-29 11:49:30

+1

你在問我調試我看不到的代碼。沒有辦法做到這一點。 – 2012-03-29 12:05:24

+0

問題是avformatcontext有所有錯誤的信息(它顯示了數以百萬計的流)。有沒有其他的方式來讀取單一的流而不是使用格式,只使用avcodec?我知道這個文件有一個音頻流。 – user1288043 2012-03-29 12:22:38