av_seek_frame

1980 ワード

オープンソースプロジェクトを書くときはseek機能が必要で、av_を使いましたseek_frameの機能は、以下のように記録されています.まずセグメントドキュメントを参照

int av_seek_frame   (   AVFormatContext * s,

int stream_index,

int64_t timestamp,

int flags

)

Seek to the keyframe at timestamp.

'timestamp' in 'stream_index'.

Parameters

s   media file handle

stream_index    If stream_index is (-1), a default stream is selected, and timestamp is automatically converted from AV_TIME_BASE units to the stream specific time_base.

timestamp   Timestamp in AVStream.time_base units or, if no stream is specified, in AV_TIME_BASE units.

flags   flags which select direction and seeking mode

#define AVSEEK_FLAG_BACKWARD 1 ///< seek backward

#define AVSEEK_FLAG_BYTE    2 ///< seeking based on position in bytes

#define AVSEEK_FLAG_ANY      4 ///< seek to any frame, even non-keyframes

#define AVSEEK_FLAG_FRAME    8 ///< seeking based on frame number

Returns

>= 0 on success


説明####
timebaseとはタイムスタンプを指し、ptsタイムスタンプに対応し、indexが-1の場合はAV_TIMEBASEはtimebaseとしてffmpegによって自動的にデフォルトタイムスタンプに変換され、streamが指定されている場合は対応するstreamのtimebaseを使用してptsを計算します.ここで注意したいのは、例えばseekから32 sは簡単に直接32*AV_TIMEBASEはタイムスタンプを計算します.ptsは必ずしも0から始まるとは限らないので、開始のptsを加えます.
stream_indexは、どのメディアストリームに対してseekを行うかを選択します.
flagは、検索するIフレームと指定点との位置関係を指定するために使用される.seekの過去の時点がIフレームの場所にあるとは限らないため、復号化はIフレームに依存する必要があるため、この場合、現在のフレームの前のIフレームにekをseekするか、それとも後のIフレームにseekするかを示す近くのIフレームを選択しなければならない.
seekから32 sの例###

int ret = av_seek_frame(inputFormatContext, -1, ((double)ms/(double)1000)*AV_TIME_BASE + (double)inputFormatContext->start_time, AVSEEK_FLAG_BACKWARD);//   stream  seek

int ret = av_seek_frame(inputFormatContext, videoIndex, (double)videoTimeBase.den/(double)videoTimeBase.num * ((double)ms/(double)1000)*AV_TIME_BASE + (double)inputFormatContext->start_time/(double)AV_TIME_BASE*((double)videoTimeBase.den/(double)videoTimeBase.num)*/, AVSEEK_FLAG_BACKWARD);//  stream  seek