视频播放中时钟的概念及音视频同步概念


author: hjjdebug
date: 2025年 07月 05日 星期六 18:20:45 CST
descrip: 视频播放中时钟的概念及音视频同步概念


文章目录

  • 1.前言: 视频播放:
    • 1. 固定延时时间
    • 2. 根据frame的duration来延时.
    • 3. 根据frame的PTS 来播放
      • 3.1. 时钟是什么?
      • 3.2. 时钟的用途.
  • 2.音视频同步:

1.前言: 视频播放:

一帧一帧的把画面渲染出来就构成了视频播放.
从上一帧到这一帧的时间间隔是多少呢?

1. 固定延时时间

我们可以通过帧率计算每一帧的延时时间
每一帧和每一帧之间延时固定长度来播放.
架构大概是这样的.

double duration=(double)1/framerate;
for(;;)
{getframe(ctx,frame);delay(duration);display(frame);
}

这样每个画面看起来是连续的,但是播放时间却是不准确的.

2. 根据frame的duration来延时.

每个frame 都有duration属性值,视频一般是3600个时间单位,40ms时间,也有例外.
架构大概是这样的.

for(;;)
{getframe(ctx,frame);delay(frame.duration);display(frame);
}

缺点. 只考虑了每一帧和每一帧之间理论上的时间间隔,
但是获取到该帧也是要花时间的,
播放时间还是不准确.没有按frame 的时间戳来播放.

3. 根据frame的PTS 来播放

让每一次播放时间与PTS 时间戳对齐. PTS 让我们啥时候播放,我们就啥时候播放.
当拿到一个frame时,根据frame.pts,判断需要等待多少时间后再播放
架构大概是这样的.

for(;;)
{getframe(ctx,frame);double duration=compute_target_delay(video_clock,frame.pts); //这个duration 是动态的.根据pts计算的.delay(duration);display(frame);
}

那根据pts 计算duration的过程是怎样的呢?
关键就是这个时钟video_clock. 它必需要知道某个时间点对应的PTS值是多少,
这样给一个新的pts, 就能够计算出期望的时间点.
拿期望的时间点减掉当前时间戳,就能得到延时时间duration
所以计算过程是这样的.

typedef struct _Clock
{long pts_ref;        //参考pts时间double sys_time_ref;     //对应该pts的系统时间
}Clockdouble compute_target_delay(Clock *clk, long pts)
{long delta_pts = pts - clk->pts_ref;double time = delta_pts * AVRational(1,90000); //时间戳pts一般是90Kdouble expect_time=sys_time_ref+time;double current_time=av_gettime_relative()/1000000.0;double delay=expect_time-current_time; //期望播出时间减去当前时间就是应该delay的时间.return delay;
}

是的,也许你发现了问题,参考时间和参考pts又如何获得呢?
这个简单,你可以在获取第一帧数据时,设定pts为pts_ref, 那时的系统时间为sys_time_ref.
而且在播放过程中,当你发现不正常时,随时设置参考帧pts及对应的参考时间.
这叫时钟同步,可能对应某个set_clock函数, 下面给个示例.

程序代码:

for(;;)
{getframe(ctx,frame);double duration=compute_target_delay(vid_clk,frame.pts); //这个duration 是动态的.根据pts计算的.if(duration > 0){delay(duration)}else if(duration < -0.1) //超前有点离谱,我们矫正一下时钟{set_clock(vid_clk,frame.pts); //设置时钟同步点}display(frame);
}
//时钟同步
void set_clock(Clock *vid_clk,long pts)
{vid_clk. pts_ref = pts;vid_clk.sys_time_ref = av_gettime_relative()/1000000.0;
}

3.1. 时钟是什么?

时钟就是某个frame的PTS, 对应着播放的系统时钟时间是多少.
这是时钟的主要概念.
有个这个基础,我们可以以后根据frame的pts, 计算出它期望的播出时间.
在此基础上再衍生出其它成员只是为了完善其它的功能而已.
1.1 时钟对时:
把PTS与系统时间关联上叫时钟对时, 通过调用 set_clock(Clock *clk,LONG pts) 来完成

3.2. 时钟的用途.

给定一个frame, 可以拿到它的pts, 通过与时钟比较,可以知道它应该在什么时间播放.
从而也知道,它此时应该等待多少时间才可以播放.

2.音视频同步:

音频和视频解码/渲染是独立线程,它们各有自己的时间戳PTS, 因而可以对应不同的时钟.
即音频对应音频时钟. audclk
视频对应视频时钟. vidclk
如果我们拿音频时钟去调教视频播放,这就实现了音视频同步,具体是怎样操作的呢?
视频时钟与主时钟本身可能就有偏差,这个需要考虑在内.
diff = get_clock(&is->vidclk) - get_master_clock(is); //这里的master_clock 可能是音频时钟,视频时钟或外部时钟
我们现在在谈视频同步到音频,当然这里要把主时钟理解为音频时钟.
根据视频计算的delay值,用音频进一步矫正,需要一种算法,可能是简单的delay+diff,
也可能在极端条件下进行过激调整2delay+diff, delay+2diff 等等, 可以观察一下哪种效果更好.
这就是编程灵活的地方了. 算法以简洁,使用,有效为基础.

有了这些概念,我们再来读ffplay6, 就好很多了.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/89915.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/89915.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python基础之字符串操作全解析

在 Python 中&#xff0c;字符串是最常用的数据类型之一&#xff0c;掌握字符串的各种操作对于日常编程至关重要。本文将详细介绍 Python 字符串的类型特性、编码转换、常用运算符及方法&#xff0c;帮助你全面掌握字符串处理技巧。 一、字符串的基本类型 Python 中的字符串属…

【爬虫】逆向爬虫初体验之爬取音乐

寻找数据 打开F12中的网络页面&#xff0c;播放音乐后&#xff0c;筛选媒体&#xff0c;会发现当前这首歌曲音频链接地址&#xff0c;打开后&#xff0c;点击“标头”就能能看到请求URL 截取“.mp3”前面的一部分进行搜索&#xff0c;搜索出来了很多数据包&#xff0c;但都是…

CppCon 2018 学习:Fancy Pointers for Fun and Profit

“Fancy Pointers for Fun and Profit” 这个标题听起来像是在讨论**“高级指针用法”**&#xff0c;尤其是在C里&#xff0c;如何利用智能指针、定制指针类型&#xff0c;或者其他高级指针技巧来写更安全、更高效、更优雅的代码。 可能的理解和内容方向&#xff1a; 1. 什么是…

思辨场域丨数字信号技术重塑农林牧渔:从“靠天吃饭”到“靠数吃饭”

凌晨三点&#xff0c;山东莱芜的养猪户老李被手机震动惊醒。屏幕显示&#xff1a;3号猪舍&#xff0c;母猪即将分娩。他轻点屏幕启动远程监控&#xff0c;翻身继续入睡——而在几年前&#xff0c;这样的夜晚他只能在猪圈里守着。 清晨的茶园里&#xff0c;兴业县的茶农王大姐掏…

文心大模型及百度大模型内容安全平台齐获信通院大模型安全认证

近日&#xff0c;文心大模型与百度大模型内容安全平台——红线大模型双双荣获中国信息通信研究院泰尔认证中心颁发的“大规模预训练模型&#xff08;文本生成功能&#xff09;安全认证证书”&#xff0c;且二者的认证级别皆“增强级”的最高级别。 大规模预训练模型&#xff08…

香港服务器查询缓存禁用-性能优化关键技术解析

在香港服务器运维过程中&#xff0c;查询缓存禁用是提升数据库性能的关键操作。本文将深入解析禁用查询缓存的原理、操作步骤、适用场景及注意事项&#xff0c;帮助管理员优化MySQL服务器配置&#xff0c;解决高并发环境下的性能瓶颈问题。香港服务器查询缓存禁用-性能优化关键…

深度学习图像分类数据集—七种动物识别分类

该数据集为图像分类数据集&#xff0c;适用于ResNet、VGG等卷积神经网络&#xff0c;SENet、CBAM等注意力机制相关算法&#xff0c;Vision Transformer等Transformer相关算法。 数据集信息介绍&#xff1a;七种动物识别分类&#xff1a;[Chinese_Merganser, panda, Sika_Deer, …

ubuntu22桌面版中文输入法 fcitx5

不要去 ubuntu software 下载 fcitx5 快捷键用不了 直接 sudo apt install fcitx5 \ fcitx5-chinese-addons \ fcitx5-frontend-gtk4 fcitx5-frontend-gtk3 fcitx5-frontend-gtk2 \ fcitx5-frontend-qt5不要在fcitx5里面设置快捷键&#xff0c;有些应用可能无法生效 在设置里全…

推客系统小程序终极指南:从0到1构建自动裂变增长引擎,实现业绩10倍增长!

&#x1f4cc; 前言&#xff1a;为什么传统营销越来越难做&#xff1f;在流量红利消失的今天&#xff0c;企业普遍面临三大增长困境&#xff1a;获客成本飙升&#xff1a;电商、教育等行业单客成本突破500元&#xff0c;ROI持续走低用户粘性差&#xff1a;90%的活动用户只参与一…

【数据结构】排序算法:归并与堆

归并排序&#xff1a;分治策略的经典实现 算法原理 归并排序采用分治法策略&#xff0c;包含三个关键步骤&#xff1a; 分解&#xff1a;递归地将数组分成两半 解决&#xff1a;对子数组进行排序 合并&#xff1a;将两个有序子数组合并为一个有序数组 C语言实现 #includ…

机器学习-CatBoost

参考书籍&#xff1a;《机器学习-公式推导和代码实现》 官方文档提供的原生接口代码参考书籍的P187&#xff5e;P188 简介 全称是Categorical Boosting&#xff0c;由俄罗斯搜索引擎巨头Yandex于2017年提出。突出的优势是在于可以高效地处理数据中的类别特征 ML中对类别特征…

MPLS 多协议标签交换

前言&#xff1a; 多协议标签交换MPLS&#xff08;Multiprotocol Label Switching&#xff09;是一种IP&#xff08;Internet Protocol&#xff09;骨干网技术。MPLS在无连接的IP网络上引入面向连接的标签交换概念&#xff0c;将第三层路由技术和第二层交换技术相结合&#xf…

CTF Web PHP弱类型比较与布尔值判断

题目源码与注释 <?php show_source("index.php"); // 显示自身源码&#xff0c;方便分析 include("flag.php"); // 包含flag变量 $a $_GET[a]; // 获取GET参数a&#xff0c;抑制报错// 关键判断 if($a 0 and $a){echo $flag; …

AntV G6动态连线

完整代码如下 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>AntV G6 动态连线</titl…

puppeteerSharp html转pdf

部属到linux 上报错&#xff1a; Failed to launch browser! /wwwroots/xxx/Chrome/Linux-138.0.7204.92/chrome-linux64/chrome: error while loading shared libraries: libatk-1.0.so.0: cannot open shared object file: No such file or directory 问题服务包缺少依赖&…

springBoot接口层时间参数JSON序列化问题,兼容处理

背景&#xff1a;解决前端传入时间参数格式不固定场景&#xff0c;避免接收参数报错时间格式不能序列化。一、概述在 Java 后端开发中&#xff0c;处理 JSON 数据时&#xff0c;经常需要对日期时间字段进行反序列化。Java 中常用的日期时间类型是 java.time.LocalDateTime&…

List、Set、Map三者之间的关系

1、数据结构与核心特性接口数据结构顺序性唯一性键值对null 元素List动态数组/链表有序&#xff08;插入顺序&#xff09;允许重复否允许多个 nullSet哈希表 / 红黑树无序&#xff08;HashSet&#xff09;有序&#xff08;LinkedHashSet/TreeSet&#xff09;不允许重复否仅 Has…

进程控制----进程终止

一、进程终止的核心场景正常终止&#xff08;代码完整运行完毕&#xff09;成功&#xff1a;进程执行到main函数结束或调用exit()&#xff0c;返回退出码 0&#xff08;约定为执行成功&#xff09;。失败&#xff1a;代码执行完毕但结果异常&#xff0c;返回非零退出码&#xf…

Milvus docker-compose 部署

文章目录 前言Milvus docker-compose 部署1. 下载2. 修改配置3. 启动4. 测试 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的…

EveryThing搜索具体路径下文件中的内容

1.打开EveryThing 2.点击搜索&#xff0c;选择高级搜索 3.选择需要搜索的文件的路径以及文件中需要包含的内容 4.之后就可以搜索到对应的目标文件