[SimplePlayer] 8. 音视频同步
音频与视频在播放当中可能会由于种种原因(如:音视频并非在同一时间开始播放,或视频由于解码任务繁重导致输出图像延迟等)导致音频与视频的播放时间出现偏差,这种就是音视频的同步问题,本文会对音视频同步进行讨论。
有三种音视频同步方式:
- 视频同步到音频时钟(synchronize video to audio clock)
- 音频同步到视频时钟(synchronize audio to video clock)
- 音视频同步到外部时钟(synchronize audio and video to external clock)
常见的实现方式是把视频同步到音频时钟。主要原因是,对于延迟以及卡顿,人的听觉较视觉更为敏感,需要尽量保持音频顺畅输出。
时钟
我们前面提到视频时钟、音频时钟指的是连续的时间。视频文件内存储的视频以及音频的时间戳都是离散的,不过如果我们假设视频与音频分别都有一个独立的时钟,各帧的时间戳代表的就是时钟上的某一时刻。如果在某一时刻,此时音频时钟与视频时钟上的刻度相同,则表明此时的音视频是完全同步的。
为了得到音频或者视频的时钟,我们可以在音频或者视频输出时记录输出帧的$pts$以及此时的系统时间$CLK_{put}$,然后在进行时钟比较时取出上次输出时的$pts$以及$CLK_{put}$,并获取当前的系统时间$CLK_{get}$,最后执行以下运算就能得到音频或者视频时钟。
$CLK = pts + CLK_{get} – CLK_{put}$
延迟
实际上音视频之间总会存在延迟,如果在某一时刻,视频时钟的刻度大于音频时钟的刻度,则表明视频比音频播放早了,或者说音频延迟了。
反之,如果在某一时刻,音频时钟的刻度大于视频时钟的刻度,则表明音频比视频播放早了,或者说视频延迟了。
可接受的延迟范围
人对延迟的敏感度并不会很高,对于通常的视频帧率来说(24fps或者30fps,即延迟在40ms之内),一帧的延迟是人类不容易察觉,即可接受的延迟范围。因此,如果音频以及视频的时钟差值在此范围内,则不用特地进行调整。
延迟调整
如果音频时钟与视频时钟之间的延迟超出可接受的范围,则需要进行时钟的调整,时钟调整主要是通过改变某一帧的播放时间来实现的,实现的方法也有多种。如果视频延迟了,则可以加快视频帧的播放速度:一解码完成,判断视频延迟,立即开始输出图像;或者直接跳过那些pts不在可接受范围内的帧。如果音频延迟了,则可以延迟视频的播放速度,或者先暂停输出后面的视频帧直到音频追上。
[SimplePlayer] 8. 音视频同步的更多相关文章
- Android 音视频同步机制
一.概述 音视频同步(avsync),是影响多媒体应用体验质量的一个重要因素.而我们在看到音视频同步的时候,最先想到的就是对齐两者的pts,但是实际使用中的各类播放器,其音视频同步机制都比这些复杂的多 ...
- FFmpeg简易播放器的实现-音视频同步
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10284653.html 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...
- Android 音视频同步(A/V Sync)
1. 音视频同步原理 1)时间戳 音视频同步主要用于在音视频流的播放过程中,让同一时刻录制的声音和图像在播放的时候尽可能的在同一个时间输出. 解决音视频同步问题的最佳方案就是时间戳:首先选择一个参考 ...
- ffmpeg 2.3版本号, 关于ffplay音视频同步的分析
近期学习播放器的一些东西.所以接触了ffmpeg,看源代码的过程中.就想了解一下ffplay是怎么处理音视频同步的,之前仅仅大概知道通过pts来进行同步,但对于怎样实现却不甚了解,所以想借助这个机会, ...
- ffplay的音视频同步分析
以前工作中参与了一些音视频程序的开发,不过使用的都是芯片公司的SDK,没有研究到更深入一层,比如说音视频同步是怎么回事.只好自己抽点时间出来分析开源代码了,做音视频编解码的人都知道ffmpeg,他在各 ...
- ffplay(2.0.1)中的音视频同步
最近在看ffmpeg相关的一些东西,以及一些播放器相关资料和代码. 然后对于ffmpeg-2.0.1版本下的ffplay进行了大概的代码阅读,其中这里把里面的音视频同步,按个人的理解,暂时在这里作个笔 ...
- (转)ffplay的音视频同步分析之视频同步到音频
以前工作中参与了一些音视频程序的开发,不过使用的都是芯片公司的SDK,没有研究到更深入一层,比如说音视频同步是怎么回事.只好自己抽点时间出来分析开源代码了,做音视频编解码的人都知道ffmp ...
- vlc源码分析(五) 流媒体的音视频同步
vlc播放流媒体时实现音视频同步,简单来说就是发送方发送的RTP包带有时间戳,接收方根据此时间戳不断校正本地时钟,播放音视频时根据本地时钟进行同步播放.首先了解两个概念:stream clock和sy ...
- libstagefright 音视频同步方案
1:音视频数据都有一个list,用于存放解码后的数据: List mFilledBuffers; 2:解码后的音视频数据不断的往list中存放,不做音视频同步方面的时间上控制 mFille ...
随机推荐
- JavaScript类型化数组(二进制数组)
0.前言 对于前端程序员来说,平时很少和二进制数据打交道,所以基本上用不到ArrayBuffer,大家对它很陌生,但是在使用WebGL的时候,ArrayBuffer无处不在.浏览器通过WebGL和显卡 ...
- sql order by和case THEN 并用
今天在工作中遇到一个多表查询,并且按精准度匹配排序的一个需求,费了我好大劲在此和大家分享一些心得 开始我是想根据他的搜索字段的长度来排序,但是遇到图二的这种结果就不好排序了 order by abs( ...
- 解决Linux系统下Mysql数据库中文显示成问号的问题
当我们将开发好的javaWEB项目部署到linux系统上,操作数据库的时候,会出现中文乱码问题,比如做插入操作,发现添加到数据库的数据中文出现论码,下面就将解决linux下mysql中文乱码问题! 打 ...
- C#基础第二天
变量 声明的语法格式 数据类型 变量名; 常用数据类型 int 整数 值类型 double 小数 值类型 char 字符 引用类型 string 字符串 引用类型 decimal 金钱小 ...
- sqlbulkcopy 批量插入数据
批量插入 Datetable数据 通过sqlbulkcopy 插入1百万条数据 用时 10秒钟 (有兴趣的小伙伴可以去测试) /// <summary> /// /// </sum ...
- Linux(Deepin 15.9) - MySQL5.7 安装
Linux(Deepin 15.9) - MySQL5.7 安装 sudo apt install mysql-server/panda sudo apt install mysql-client/p ...
- RX 和 TX
我们在ifconfig 查看网卡配置时或者嵌入式开发的时候,经常会看到rx/tx缩写,其含义如下: RX==receive,接收,从开启到现在接收封包的情况,是下行流量. TX==Transmit,发 ...
- 小程序的js处理步骤
<!-- 包含请求路由 --> var hostUrl = require('../../config.js').hostUrl; Page({ <!-- 页面的初始数据 --> ...
- 【转】Android开发:Service和Thread的关系
不少Android初学者都可能会有这样的疑惑,Service和Thread到底有什么关系呢?什么时候应该用Service,什么时候又应该用Thread?答案可能会有点让你吃惊,因为Service和Th ...
- NSSM安装服务
NSSM是一个服务封装程序,它可以将普通exe程序封装成服务,使之像windows服务一样运行.同类型的工具还有微软自己的srvany,不过nssm更加简单易用,并且功能强大.它的特点如下: 支持普通 ...