当前位置: 首页 > news >正文

ffplay播放器剖析(7)----音视频暂停模块分析

文章目录

  • 1. 暂停触发流程
  • 2. toggle_pause
  • 3. stream_toggle_pause

1. 暂停触发流程

1.通过SDL触发事件调用toggle_pause

2.toggle_pause调用stream_toggle_pause

3.stream_toggle_pause修改暂停变量

2. toggle_pause

static void toggle_pause(VideoState *is)
{stream_toggle_pause(is);is->step = 0;
}

3. stream_toggle_pause

static void stream_toggle_pause(VideoState *is)
{// 如果当前是暂停 -> 恢复播放// 正常播放 -> 暂停if (is->paused) {// 当前是暂停,那这个时候进来这个函数就是要恢复播放/* 恢复暂停状态时也需要恢复时钟,需要更新vidclk */// 加上 暂停->恢复 经过的时间is->frame_timer += av_gettime_relative() / 1000000.0 - is->vidclk.last_updated;if (is->read_pause_return != AVERROR(ENOSYS)) {is->vidclk.paused = 0;}// 设置时钟的意义,暂停状态下读取的是单纯pts// 重新矫正video时钟set_clock(&is->vidclk, get_clock(&is->vidclk), is->vidclk.serial);}set_clock(&is->extclk, get_clock(&is->extclk), is->extclk.serial);// 切换 pause/resume 两种状态is->paused = is->audclk.paused = is->vidclk.paused = is->extclk.paused = !is->paused;printf("is->step = %d; stream_toggle_pause\n", is->step);
}

这个函数可以知道,如果当前状态是暂停的话,那么就会进入if函数

看一下if函数流程,首先我们知道我们

is->frame_timer += av_gettime_relative() / 1000000.0 - is->vidclk.last_updated;

这个就是在之前的基础上加上暂停到开始的时间

set_clock(&is->vidclk, get_clock(&is->vidclk), is->vidclk.serial);

get_clock当是暂停状态时就是获取时钟的pts

set_clock(&is->extclk, get_clock(&is->extclk), is->extclk.serial);

同理是设置外部时钟的

is->paused = is->audclk.paused = is->vidclk.paused = is->extclk.paused = !is->paused;

就是将paused取反

看一下这4个pause会影响那些函数

  1. video_refresh 如果是暂停并且没有强制刷新的话就不会调用该函数,什么时候强制刷新之前有说过,比如修改ffplay窗口大小
  2. read_thread中的pause只会对网络流有效,而其他情况下pause并不会对read_thread有影响,而是继续读数据写入到队列中
  3. get_master_clock中会调用get_clock,而get_clock中如果是paused状态的话就会直接返回pts
  4. audio_decode_frame函数会受到paused影响,会直接返回-1,然后sdl_audio_callback接受到会进行判断,然后输出静音数据,并未有暂停
http://www.lryc.cn/news/96598.html

相关文章:

  • ceph-mon运行原理分析
  • 听GPT 讲K8s源代码--pkg(八)
  • 差速驱动机器人的车轮里程计模型
  • Pytorch个人学习记录总结 09
  • 代码随想录算法训练营day51 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费
  • 做UI设计需要具备什么平面技能呢优漫动游
  • cass--单选不累加设置
  • 线程结构——链表
  • freeRTOS:基于(信号量+线程)的日志系统设计
  • 数据可视化(1)
  • Llama 2: Open Foundation and Fine-Tuned Chat Models
  • BTY-DNS AMA回顾:致力于创建Web3领域中的去中心化身份(DID)
  • 【设计模式——学习笔记】23种设计模式——装饰器模式Decorator(原理讲解+应用场景介绍+案例介绍+Java代码实现)
  • 《golang设计模式》第一部分·创建型模式-01-单例模式(Singleton)
  • 若依微服务整合activiti7.1.0.M6
  • Ubuntu 下安装软件,卸载,查看已经安装的软件
  • 微信小程序导入微信地址
  • 如何在Debian中配置代理服务器?
  • 在外远程NAS群晖Drive - 群晖Drive挂载电脑磁盘同步备份【无需公网IP】
  • [SQL挖掘机] - 标量子查询
  • MTK 进META的两种方式
  • AutoSAR系列讲解(实践篇)9.2-信息发送的Filter机制
  • JVM详解(超详细)
  • Vue学习Day3——生命周期\组件化
  • Rust vs Go:常用语法对比(八)
  • pytorch学习-线性神经网络——softmax回归+损失函数+图片分类数据集
  • Docker compose(容器编排)
  • xmind latex【记录备忘】
  • RocketMQ(1.NameServer源码)
  • 责任链vs金融登录