CodecがP-Framesを使用すると、av_seek_frameがavcodec_decode_video2を分割します
-
09-09-2020 - |
質問
P-Framesでエンコードされたビデオを求める方法を理解しようとしています(例:H.264) - すべてのフレームがキーフレームでエンコードされた動画で符号化されたビデオに求める方法を知っています(例:MJPEGなど)。
タイムスタンプを与えられた、最終的にはそのタイムスタンプのフレームを再生する必要があります。 しかし今のところ、私はタイムスタンプの近くのキーフレームを再生しようとしています。 so、first--
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
を取り出すならば、それが順番にフレームを介して再生されるだけで、それは機能します。
解決
この
を置換します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
のドキュメントは次のように言う: "これはまだ建設中の新しいシークAPIの一部です。これはまだ使用しないでください。
所属していません StackOverflow