2012-09-11 50 views
1

我正在使用從ffmpeg.org文檔頁[tutorial] [sample]鏈接到的教程編寫我的第一個ffmpeg應用程序。這裏是我的初始代碼:應用程序使用ffmpeg段錯誤,因爲for循環?

const char * fnmVideoIn = argv [1]; 
const char * fnmImageOut = argv [2]; 

av_register_all(); 

// [] Open the file 
AVFormatContext * pcxFormat; 
if (avformat_open_input (&pcxFormat, fnmVideoIn, NULL, NULL)) { 
    fprintf (stderr, "Could not open file %s for reading\n", 
      fnmVideoIn); 
    return -1; 
} 

// [] Get stream information 
if (avformat_find_stream_info (pcxFormat, NULL) < 0) { 
    fprintf (stderr, "Could not find stream info\n"); 
    return -1; 
} 

// [log] print stream info 
av_dump_format (pcxFormat, 0, fnmVideoIn, 0); 

一切都很好。該程序運行無誤並正確轉儲視頻信息。但隨後我進入下一步...

... 
// [log] print stream info 
av_dump_format (pcxFormat, 0, fnmVideoIn, 0); 

int ixVideoStream = -1, ixStrm; 
for (ixStrm = 0; ixStrm < pcxFormat->nb_streams; ++ixStrm) { 
    if (pcxFormat->streams [ixStrm]->codec->codec_type == AVMEDIA_TYPE_VIDEO) { 
     ixVideoStream = ixStrm; 
     break; 
    } 
} 

並且它以段錯誤退出。 GDB說:

(gdb) r test.mp4 out 
... 
Program received signal SIGSEGV, Segmentation fault. 
0xb7f572c5 in avformat_open_input() from /usr/lib/libavformat.so.53 

怎麼可能是因爲代碼avformat_open_input段錯誤後添加它叫什麼名字?我甚至用普通的i = 0來測試它;我< 100 for循環,它仍然segfaults!這是一個錯誤?作爲參考,我的系統是:

$ gcc --version 
gcc (GCC) 4.7.0 20120414 (prerelease) 

$ uname -srvmpio 
Linux 3.3.4-1-ARCH #1 SMP PREEMPT Sat Apr 28 06:04:27 UTC 2012 i686 Intel(R) Core(TM)2 Duo CPU P7450 @ 2.13GHz GenuineIntel GNU/Linux 

$ ffmpeg -version 
ffmpeg version 0.10.2 
built on Mar 17 2012 08:53:01 with gcc 4.6.3 
configuration: --prefix=/usr --enable-libmp3lame --enable-libvorbis --enable-libxvid --enable-libx264 --enable-libvpx --enable-libtheora --enable-libgsm --enable-libspeex --enable-postproc --enable-shared --enable-x11grab --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libschroedinger --enable-libopenjpeg --enable-librtmp --enable-libpulse --enable-gpl --enable-version3 --enable-runtime-cpudetect --disable-debug --disable-static 
libavutil  51. 35.100/51. 35.100 
libavcodec  53. 61.100/53. 61.100 
libavformat 53. 32.100/53. 32.100 
libavdevice 53. 4.100/53. 4.100 
libavfilter  2. 61.100/2. 61.100 
libswscale  2. 1.100/2. 1.100 
libswresample 0. 6.100/0. 6.100 
libpostproc 52. 0.100/52. 0.100 
+0

嘗試使用'gcc -g -O0'來編譯代碼並運行gdb來打印完整的回溯 – Mine

回答

2

我不知道在他們的解決方案是在別處發現問題的禮儀,但我會自我答案在這裏,無論如何,留給後人。

不管怎麼說,第一個參數avformat_open_input是一個指針的指針AVFormatContext結構使用avformat_alloc_context分配的,或者如果你想要的功能分配爲你,一個空指針。

在這裏,我犯了一個錯誤,提供一個未初始化的指針,這會觸發偶爾的段錯誤錯誤。與for循環的連接只是附帶的,可能與編譯器如何構造結果機器代碼有關。

+0

,但這裏的示例也不會初始化指針[http://ffmpeg.mplayerhq.hu/doxygen/trunk /filtering_8c-source.html](http://ffmpeg.mplayerhq.hu/doxygen/trunk/filtering_8c-source.html) – Zyoo

+0

靜態全局變量的初始化規則可能不同。無論如何,這是非常依賴編譯器的,你應該初始化,只是爲了安全起見。 – larvyde