2

pフレーム(H.264など)でエンコードされたビデオを検索する方法を理解しようとしています。現在、すべてのフレームがキーフレーム(MJPEGなど)であるコーデックでエンコードされたビデオを検索する方法しかわかりません。

タイムスタンプが与えられると、最終的にはそのタイムスタンプのフレームを再生する必要があります。しかし今のところ、私はタイムスタンプの近くでキーフレームを再生しようとしています。だから、最初に-

ret = av_seek_frame(pFormatCtx, videoStream, avTime, 0); 
avcodec_flush_buffers(pCodecCtx);

次に、を含むいくつかの介在コードav_read_frame。それで -

ret = avcodec_decode_video2(pCodecCtx, captureFrame, &gotPicture, &packet); 

観察:

  • 一部のビデオでは、これは機能します。その他の場合avcodec_decode_video2は、エラー(負の数)を返します。動作するビデオの例:ここ。動作しないビデオの例:ここ

  • MJPEGビデオの場合、これは機能します。

  • を取り出してav_seek_frame、フレームを順番に再生するようにすると、動作します。

4

1 に答える 1

1

これを交換してください-

ret = av_seek_frame(pFormatCtx, videoStream, avTime, isPlayingBackward ? AVSEEK_FLAG_BACKWARD : 0); 
avcodec_flush_buffers(pCodecCtx);

これとともに -

ret = avformat_seek_file(pFormatCtx, videoStream, 0, avTime, avTime, 0); 

(警告:avformat_seek_file「これはまだ作成中の新しいseek APIの一部です。したがって、まだ使用しないでください。いつでも変更される可能性があります。ABIとの互換性はまだ期待できません!」)

于 2011-05-22T18:09:22.677 に答える