av_seek_frame
1980 ワード
オープンソースプロジェクトを書くときはseek機能が必要で、av_を使いましたseek_frameの機能は、以下のように記録されています.まずセグメントドキュメントを参照
説明####
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 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