2

ffmpeg.orgのドキュメントページ[チュートリアル][サンプル]からリンクされているチュートリアルを使用して、最初のffmpegアプリケーションを作成しています。これが私の最初のコードです:

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でテストしました。i <100 for-loopであり、それでも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
4

1 に答える 1

3

他の場所で解決策が見つかった質問のエチケットはわかりませんが、後世のために、とにかくここで自己回答します。

とにかく、への最初の引数は、を使用して割り当てられた構造体avformat_open_inputへのポインターへのポインターです。関数にそれを割り当てたい場合は、nullポインターです。AVFormatContextavformat_alloc_context

ここで、初期化されていないポインタを関数に提供するという間違いを犯しました。これにより、セグメンテーション違反エラーが発生することがあります。forループとの接続は偶発的なものであり、おそらくコンパイラーが結果のマシンコードを構造化する方法と関係があります。

于 2012-09-11T09:05:46.963 に答える