9

私はffmpegを広範囲に使用するいくつかのソフトウェアを書いています、そしてそれは複数のクラスインスタンスを持つマルチスレッドです。

ネットワーク接続が切断された場合、ffmpegは読み取りを停止します。ffmpegが定期的に起動するコールバックを割り当てて、中止する必要があるかどうかを確認するメソッドを見つけました。

static int interrupt_cb(void *ctx) 
{ 

// do something 
    return 0;
} 

static const libffmpeg::AVIOInterruptCB int_cb = { interrupt_cb, NULL }; 

..。

AVFormatContext* formatContext = libffmpeg::avformat_alloc_context( );
formatContext->interrupt_callback = int_cb; 
if ( libffmpeg::avformat_open_input( &formatContext, fileName, NULL, NULL ) !=0 ) {...}

これはすべて問題ありませんが、* ctxに含まれるものと、コールバックが1または0を返すかどうかを判断する方法をWeb上のどこにも見つけることができません。クラスには多くのインスタンスがあるため、静的な「abort」フラグを割り当てることができません。また、何らかの理由でVisual Studioが戻り値0にブレークポイントを設定することを拒否しているため、コードをデバッグできません。行、実行可能コードが場所に関連付けられていないと主張します。何か案は?

4

2 に答える 2

8

ffmpegのドキュメントにあります:

ブロッキング操作中に、パラメータとして不透明を使用してコールバックが呼び出されます。コールバックが1を返す場合、ブロッキング操作は中止されます。

コードからのタイプAVIOInterruptCBstructの宣言int_cb変数は次のとおりです。

static const libffmpeg::AVIOInterruptCB int_cb = { interrupt_cb, NULL };

不透明なパラメータをとして宣言しましNULLた。

初期化コードを次のように書き直すことをお勧めします。

AVFormatContext* formatContext = libffmpeg::avformat_alloc_context( );
formatContext->interrupt_callback.callback = interrupt_cb;
formatContext->interrupt_callback.opaque = formatContext;

次の内部のformatContextインスタンスにアクセスできるようになりますinterrupt_cb

static int interrupt_cb(void *ctx) 
{ 
    AVFormatContext* formatContext = reinterpret_cast<AVFormatContext*>(ctx);
// do something 
    return 0;
}
于 2012-05-19T15:14:06.673 に答える
2

AVFormatContext * formatContextだけでなく、タイムアウトしたスレッドを判別するための有用なデータを含むインスタンスへのその他の有用なポインターを渡すことができます。

于 2015-05-19T09:06:18.280 に答える