ffplay中的播放控制有哪些?
简单来说就是开始、结束、暂停、继续、跳转。
开始和结束前面都有说明,
所以主要分析暂停/恢复和跳转,
暂停 / 恢复
暂停恢复主要通过,stream_toggle_pause接口实现,
这个接口虽然看起来只有暂停的功能,实际上它负责暂停和继续状态的转换,上一次如果是暂停,这一次就继续,反之亦然。当然,如果用户想知道目前是开始还是暂停的状态,可以通过监听开始和暂停的状态来实现,不用自己再去记录状态。
/* pause or resume the video */
static void stream_toggle_pause(VideoState *is)
{
if (is->paused) {
// 这里表示当前是暂停状态,将切换到继续播放状态。在继续播放之前,先将暂停期间流逝的时间加到frame_timer中
is->frame_timer += av_gettime_relative() / 1000000.0 - is->vidclk.last_updated;
//TODO
if (is->read_pause_return != AVERROR(ENOSYS)) {
is->vidclk.paused = 0;
}
//设置视频时钟
set_clock(&is->vidclk, get_clock(&is->vidclk), is->vidclk.serial);
}
//设置外部时钟
set_clock(&is->extclk, get_clock(&is->extclk), is->extclk.serial);
//设置所有clock的状态
is->paused = is->audclk.paused = is->vidclk.paused = is->extclk.paused = !is->paused;
}
使用到get_clock的地方,会发现时间仿佛静止了。。。。。
static double get_clock(Clock *c)
{
if (*c->queue_serial != c->serial)
return NAN;
if (c->paused) {
//当暂停时,返回当前pts,即时间不再流逝了
return c->pts;
} else {
double time = av_gettime_relative() / 1000000.0;
return c

最低0.47元/天 解锁文章
416

被折叠的 条评论
为什么被折叠?



