【发布时间】:2022-01-30 22:49:14
【问题描述】:
我在图形应用程序中使用 ffmpeg 视频播放器。
现在我需要实施正确的方法来以特定帧开始视频(不仅是第一帧)。我找到了很好的例子here,起初我认为它非常适合我:
bool seek(uint64_t frame)
{
int64_t timeBase = (static_cast<int64_t>(_pContext->time_base.num) * AV_TIME_BASE)
/ static_cast<int64_t>(_pContext->time_base.den);
auto seekTarget = static_cast<int64_t>(frame) * timeBase;
if( av_seek_frame(_pFile, -1, seekTarget, AVSEEK_FLAG_ANY) < 0)
return false;
avcodec_flush_buffers( _pContext );
return true;
}
但是,最近我注意到它只搜索每 12 帧:
seek(10); //gives 0 frame
seek(12); //gives 12 frame
seek(20); //gives 12 frame
seek(80); //gives 72 frame
我想我错误地计算了timeBase,但实际上我找不到如何以正确方式进行计算的信息。有很多代码示例,但我已经尝试了很多,但它根本不起作用。甚至奇怪的是,我发现了太多不同的方法来计算同一个变量。
附:如果有人向我解释 timeBase 值的含义,或者分享好的解释,那就太好了。
【问题讨论】:
-
av_seek_frame寻找关键帧。 -
这取决于标志 AVSEEK_FLAG_ANY/AVSEEK_FLAG_FRAME,是吗?
-
来源是否可搜索?