2012-09-11 3 views
1

ffmpeg.org 설명서 페이지 [tutorial] [sample]에서 링크 된 자습서를 사용하여 첫 번째 ffmpeg 응용 프로그램을 작성하고 있습니다. 여기에 내 초기 코드가 있습니다 :for 루프 때문에 ffmpeg segfaults를 사용하는 응용 프로그램이 있습니까?

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 세그먼테이션 폴트 (segfault)가 후 를 추가하는 것이 가능합니까? 심지어 정규 i = 0으로 테스트했습니다. 나는 < for-loop를 100으로 만들었고 여전히 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

코드를 컴파일하고 gdb를 실행하여 전체 backtrace를 인쇄하려고 시도하십시오. – Mine

답변

2

나는 솔루션을 다른 곳에서 발견 된 문제에 대한 에티켓 잘 모르겠지만, 나는 후손를 들어, 어쨌든 여기에 자기 대답을거야.

어쨌든, avformat_open_input에 첫 번째 인수는 avformat_alloc_context를 사용하여 할당 된 AVFormatContext 구조에 대한 포인터에 대한 포인터, 또는 당신이 원하는 경우 함수는, 당신을 위해 널 포인터를을 할당 할 수 있습니다.

여기서, 초기화되지 않은 포인터과 함께 함수를 제공하는 실수를 범했습니다.이 포인터는 가끔씩 세분화 오류 오류를 유발합니다. for-loop와의 연결은 부수적 일 뿐이며, 아마도 컴파일러가 결과 머신 코드를 어떻게 구성하는지와 관련이 있습니다.

+0

그러나 여기 예제는 또한 포인터를 초기화하지 않습니다 [http://ffmpeg.mplayerhq.hu/doxygen/trunk /filtering_8c-source.html](http://ffmpeg.mplayerhq.hu/doxygen/trunk/filtering_8c-source.html) – Zyoo

+0

초기화 규칙은 정적 전역 변수와 다를 수 있습니다. 어쨌든 이것은 매우 컴파일러에 의존적이므로 어쨌든 안전한면에 초기화해야합니다. – larvyde