14

I am trying to get the av_seek_frame() function to go to a byte position I specify. I am implementing a frame accurate seeking mechanism for my application, and the way I see it, I will scan the entire video file, and store byte positions for each keyframe in a struct. I found out where to get the current byte position: AVPacket.pos. I now test this position with av_seek_frame like this:

av_seek_frame( pFormatCtx, videoStream, 110285594, AVSEEK_FLAG_BYTE);

However, this does not seem to do the right thing, when I call av_read_frame, it just starts with frame 23. If I do not seek, it starts at frame 1.

4

2 に答える 2

10

興味のある人のために、解決策を見つけました。何時間にもわたるグーグル検索と単純化された形式のリバース エンジニアリングの後、開いているビデオのバイト位置を取得および設定する方法を見つけました。

ファイルの位置を取得するには: AVFormatContext.pb.pos

例えば:

int64_t byteposition = pFormatCtx->pb->pos;

ファイルの位置を設定するには: url_seek(AVFormatContext.pb, Position, SEEK_SET);

例えば:

url_seek(pFormatCtx->pb, 27909056, SEEK_SET);

プレイ中に場所を変更した場合は、バッファをフラッシュすることを忘れないでください。初めて av_read_frame を実行する前にこれを実行すると、フラッシュは必要ありません。

敬具、ニック・バーリンデン

于 2010-06-17T15:18:01.140 に答える
4

libavの最近のバージョンでは、url_seekが内部関数になっています。ここで、次の関数を使用する必要があります。

/**
* fseek() equivalent for AVIOContext.
* @return new position or AVERROR.
*/
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence);
于 2012-07-16T00:49:24.803 に答える