当前位置: 首页 > 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接受到会进行判断,然后输出静音数据,并未有暂停

相关文章:

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

文章目录 1. 暂停触发流程2. toggle_pause3. 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_to…...

ceph-mon运行原理分析

一、流程:ceph-deploy部署ceph-mon组建集群 1.ceph-deploy部署ceph-mon的工作流程及首次启动 1)通过命令创建ceph-mon,命令为:ceph-deploy create mon keyring def mon(args):if args.subcommand create:mon_create(args)elif…...

听GPT 讲K8s源代码--pkg(八)

k8s项目中 pkg/kubelet/envvars,pkg/kubelet/events,pkg/kubelet/eviction,pkg/kubelet/images,pkg/kubelet/kubeletconfig这些目录都是 kubelet 组件的不同功能模块所在的代码目录。 pkg/kubelet/envvars 目录中包含了与容器运行…...

差速驱动机器人的车轮里程计模型

一、说明 车轮测程法是指使用旋转编码器(即连接到车轮电机以测量旋转的传感器)的测程法(即估计运动和位置)。这是轮式机器人和自动驾驶汽车定位的有用技术。 在本文中,我们将通过探索差速驱动机器人的车轮里程计模型来深入研究车轮里...

Pytorch个人学习记录总结 09

目录 损失函数与反向传播 L1Loss MSELOSS CrossEntropyLoss 损失函数与反向传播 所需的Loss计算函数都在torch.nn的LossFunctions中,官方网址是:torch.nn — PyTorch 2.0 documentation。举例了L1Loss、MSELoss、CrossEntropyLoss。 在这些Loss函数…...

代码随想录算法训练营day51 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费

题目链接309.最佳买卖股票时机含冷冻期 class Solution {public int maxProfit(int[] prices) {if (prices null || prices.length < 2) {return 0;}int[][] dp new int[prices.length][2];dp[0][0] -prices[0];dp[0][1] 0;dp[1][0] Math.max(dp[0][0], dp[0][1] - pr…...

做UI设计需要具备什么平面技能呢优漫动游

想要成为一名合格的UI设计师&#xff0c;那么需要学会的技能是非常多的&#xff0c;UI设计包含的知识点也比较多&#xff0c;那么具体做UI设计需要具备什么技能呢?来看看下面小编的详细介绍吧。 —、软件能力 一位好的ui设计师除了需要精通Photoshop.IlustratorDW.C4D等设…...

cass--单选不累加设置

打开软件&#xff0c;在空白处右击--选项--选择&#xff0c;如下&#xff1a; 完成后&#xff0c;点击确定按钮即可。...

线程结构——链表

C中的链表是一种非常常见的数据结构&#xff0c;它由一系列节点组成&#xff0c;每个节点包含一个数据元素和一个指向下一个节点的指针。 链表结构包括单向链表、双向链表和循环链表&#xff1b; 1.单向链表 单向链表由一系列节点组成&#xff0c;每个节点包含一个数据元素和…...

freeRTOS:基于(信号量+线程)的日志系统设计

1.日志的重要性 故障排查与调试&#xff1a;嵌入式系统通常运行在资源有限的环境中&#xff0c;故障排查和调试变得尤为复杂。日志系统可以记录系统在运行过程中的各种操作、状态和事件信息&#xff0c;方便开发人员追踪和定位问题所在。通过分析日志&#xff0c;可以快速找到故…...

数据可视化(1)

使用python带的matplotlib库进行简单的绘图。使用之前先进行安装&#xff0c;pip install matplotlib。如果安装了Anaconda,则无需安装matplotlib。 1.简单折线图 #绘制简单图表 import matplotlib.pyplot as plt plt.plot([1,2,3,4,5]) plt.show() import matplotlib.pyp…...

Llama 2: Open Foundation and Fine-Tuned Chat Models

文章目录 TL;DRIntroduction背景本文方案 实现方式预训练预训练数据训练细节训练硬件支持预训练碳足迹 微调SFTSFT 训练细节 RLHF人类偏好数据收集奖励模型迭代式微调&#xff08;RLHF&#xff09;拒绝采样&#xff08;Rejection Sampling&#xff09;PPO多轮一致性的系统消息&…...

BTY-DNS AMA回顾:致力于创建Web3领域中的去中心化身份(DID)

传统域名系统 (DNS) 是一个分层的分散信息存储&#xff0c;用于将用户在网络浏览器中输入可读名称&#xff08;例如www.baidu.com&#xff09;解析为IP地址&#xff0c;来访问互联网上的计算机。传统域名系统存在一些例如过于集中化管理、效率并不高等局限性问题。而去中心化域…...

【设计模式——学习笔记】23种设计模式——装饰器模式Decorator(原理讲解+应用场景介绍+案例介绍+Java代码实现)

生活案例 咖啡厅 咖啡定制案例 在咖啡厅中&#xff0c;有多种不同类型的咖啡&#xff0c;客户在预定了咖啡之后&#xff0c;还可以选择添加不同的调料来调整咖啡的口味&#xff0c;当客户点了咖啡添加了不同的调料&#xff0c;咖啡的价格需要做出相应的改变。 要求&#xff…...

《golang设计模式》第一部分·创建型模式-01-单例模式(Singleton)

文章目录 1. 概述1.1 目的1.2 实现方式 2. 代码示例2.1 设计2.2 代码 1. 概述 1.1 目的 保证类只有一个实例有方法能让外部访问到该实例 1.2 实现方式 懒汉式 在第一次调用单例对象时创建该对象&#xff0c;这样可以避免不必要的资源浪费 饿汉式 在程序启动时就创建单例对象…...

若依微服务整合activiti7.1.0.M6

若依微服务3.6.3版本整合activiti7&#xff08;7.1.0.M6&#xff09; 目前有两种办法集成activiti7 放弃activiti7新版本封装的API&#xff0c;使用老版本的API&#xff0c;这种方式只需要直接集成即可&#xff0c;在7.1.0.M6版本中甚至不需要去除security的依赖。不多介绍&a…...

Ubuntu 下安装软件,卸载,查看已经安装的软件

参考网址&#xff1a;http://wiki.ubuntu.org.cn/UbuntuSkills 一般的安装程序用三种&#xff1a; .deb 和.rpm 这两种安装文件 .bundle 这是二进制的安装文件  而 tar.gz 这类的只是压缩包&#xff08;相当于 .rar,.zip 压缩包一样&#xff09;,如果此类文件是程序的话&a…...

微信小程序导入微信地址

获取用户收货地址。调起用户编辑收货地址原生界面&#xff0c;并在编辑完成后返回用户选择的地址。 1&#xff1a;原生微信小程序接口使用API&#xff1a;wx.chooseAddress(OBJECT) wx.chooseAddress({success (res) {console.log(res.userName)console.log(res.postalCode)c…...

如何在Debian中配置代理服务器?

开始搭建代理服务器 首先我参考如下文章进行搭建代理服务器&#xff0c;步骤每一个命令都执行过报了各种错&#xff0c;找了博客 目前尚未开始&#xff0c;我已经知道我的路很长&#xff0c;很难走呀&#xff0c;加油&#xff0c;go&#xff01;go&#xff01;go&#xff01; …...

在外远程NAS群晖Drive - 群晖Drive挂载电脑磁盘同步备份【无需公网IP】

文章目录 前言1.群晖Synology Drive套件的安装1.1 安装Synology Drive套件1.2 设置Synology Drive套件1.3 局域网内电脑测试和使用 2.使用cpolar远程访问内网Synology Drive2.1 Cpolar云端设置2.2 Cpolar本地设置2.3 测试和使用 3. 结语 前言 群晖作为专业的数据存储中心&…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

AD学习(3)

1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分&#xff1a; &#xff08;1&#xff09;PCB焊盘&#xff1a;表层的铜 &#xff0c;top层的铜 &#xff08;2&#xff09;管脚序号&#xff1a;用来关联原理图中的管脚的序号&#xff0c;原理图的序号需要和PCB封装一一…...

Linux基础开发工具——vim工具

文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...

Linux操作系统共享Windows操作系统的文件

目录 一、共享文件 二、挂载 一、共享文件 点击虚拟机选项-设置 点击选项&#xff0c;设置文件夹共享为总是启用&#xff0c;点击添加&#xff0c;可添加需要共享的文件夹 查询是否共享成功 ls /mnt/hgfs 如果显示Download&#xff08;这是我共享的文件夹&#xff09;&…...

[QMT量化交易小白入门]-六十二、ETF轮动中简单的评分算法如何获取历史年化收益32.7%

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。 QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。 文章目录 相关阅读1. 策略概述2. 趋势评分模块3 代码解析4 木头…...

window 显示驱动开发-如何查询视频处理功能(三)

​D3DDDICAPS_GETPROCAMPRANGE请求类型 UMD 返回指向 DXVADDI_VALUERANGE 结构的指针&#xff0c;该结构包含特定视频流上特定 ProcAmp 控件属性允许的值范围。 Direct3D 运行时在D3DDDIARG_GETCAPS的 pInfo 成员指向的变量中为特定视频流的 ProcAmp 控件属性指定DXVADDI_QUER…...

EC2安装WebRTC sdk-c环境、构建、编译

1、登录新的ec2实例&#xff0c;证书可以跟之前的实例用一个&#xff1a; ssh -v -i ~/Documents/cert/qa.pem ec2-user70.xxx.165.xxx 2、按照sdk-c demo中readme的描述开始安装环境&#xff1a; https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-c 2…...