音频与视频在播放当中可能会由于种种原因(如:音视频并非在同一时间开始播放,或视频由于解码任务繁重导致输出图像延迟等)导致音频与视频的播放时间出现偏差,这种就是音视频的同步问题,本文会对音视频同步进行讨论。

有三种音视频同步方式:

  1. 视频同步到音频时钟(synchronize video to audio clock)
  2. 音频同步到视频时钟(synchronize audio to video clock)
  3. 音视频同步到外部时钟(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. 音视频同步的更多相关文章

  1. Android 音视频同步机制

    一.概述 音视频同步(avsync),是影响多媒体应用体验质量的一个重要因素.而我们在看到音视频同步的时候,最先想到的就是对齐两者的pts,但是实际使用中的各类播放器,其音视频同步机制都比这些复杂的多 ...

  2. FFmpeg简易播放器的实现-音视频同步

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10284653.html 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...

  3. Android 音视频同步(A/V Sync)

    1.  音视频同步原理 1)时间戳 音视频同步主要用于在音视频流的播放过程中,让同一时刻录制的声音和图像在播放的时候尽可能的在同一个时间输出. 解决音视频同步问题的最佳方案就是时间戳:首先选择一个参考 ...

  4. ffmpeg 2.3版本号, 关于ffplay音视频同步的分析

    近期学习播放器的一些东西.所以接触了ffmpeg,看源代码的过程中.就想了解一下ffplay是怎么处理音视频同步的,之前仅仅大概知道通过pts来进行同步,但对于怎样实现却不甚了解,所以想借助这个机会, ...

  5. ffplay的音视频同步分析

    以前工作中参与了一些音视频程序的开发,不过使用的都是芯片公司的SDK,没有研究到更深入一层,比如说音视频同步是怎么回事.只好自己抽点时间出来分析开源代码了,做音视频编解码的人都知道ffmpeg,他在各 ...

  6. ffplay(2.0.1)中的音视频同步

    最近在看ffmpeg相关的一些东西,以及一些播放器相关资料和代码. 然后对于ffmpeg-2.0.1版本下的ffplay进行了大概的代码阅读,其中这里把里面的音视频同步,按个人的理解,暂时在这里作个笔 ...

  7. (转)ffplay的音视频同步分析之视频同步到音频

          以前工作中参与了一些音视频程序的开发,不过使用的都是芯片公司的SDK,没有研究到更深入一层,比如说音视频同步是怎么回事.只好自己抽点时间出来分析开源代码了,做音视频编解码的人都知道ffmp ...

  8. vlc源码分析(五) 流媒体的音视频同步

    vlc播放流媒体时实现音视频同步,简单来说就是发送方发送的RTP包带有时间戳,接收方根据此时间戳不断校正本地时钟,播放音视频时根据本地时钟进行同步播放.首先了解两个概念:stream clock和sy ...

  9. libstagefright 音视频同步方案

    1:音视频数据都有一个list,用于存放解码后的数据:    List mFilledBuffers; 2:解码后的音视频数据不断的往list中存放,不做音视频同步方面的时间上控制    mFille ...

随机推荐

  1. FaaS技术框架

    FaaS介绍 微服务(MicroService)是以专注于单一服务/功能的小型单元块为基础,利用模块化的方式组合成复杂的大型应用服务. FaaS是Function as a Service的缩写,可以 ...

  2. 十分钟(小时)学习pandas

    十分钟学习pandas 一.导语 这篇文章从pandas官网翻译:链接,而且也有很多网友翻译过,而我为什么没去看他们的,而是去官网自己艰难翻译呢? 毕竟这是一个学习的过程,别人写的不如自己写的记忆深刻 ...

  3. iOS----------计算一段代码执行时间

    CFAbsoluteTime start = CFAbsoluteTimeGetCurrent(); //在这写入要计算时间的代码 // do something CFAbsoluteTime end ...

  4. WPS客户端更新日志留着备用

    WPS Office (10.1.0.7520)==========================================新增功能列表------------WPS文字1 拼写检查:新增“中 ...

  5. Unity Profiler的使用

    选中Development Build.Autoconnect Profiler和Script Debugging三个选项,如下图所示. 点击Build And Run按钮,将会编译项目并安装APK到 ...

  6. 时序数据库InfluxDB安装及使用

    时序数据库InfluxDB安装及使用 1 安装配置 安装 wget https://dl.influxdata.com/influxdb/releases/influxdb-1.3.1.x86_64. ...

  7. Python 序列化模块(json,pickle,shelve)

    json模块 JSON (JavaScript Object Notation):是一个轻量级的数据交换格式模块,受javascript对象文本语法启发,但不属于JavaScript的子集. 常用方法 ...

  8. centos7搭建ftp

    1.检查安装vsftpd软件 rpm –qa |grep vsftpd 这里显示已经安装了,我们来卸载它重新安装 卸载vsftpd命令 rpm –e 文件名 显示卸载完成 安装vsftpd命令 Yum ...

  9. VMware14虚拟机下安装Centos6.5

    一.下载VMware14,CentOS6.5光盘映像文件. https://pan.baidu.com/s/1WaTBnYuNC5dLYM_Ra2bjBQ 二.安装过程 1.打开VMware虚拟机 — ...

  10. javascript基础之函数

    javascript的函数定义与python有很大的区别,的记住格式就好,下面请看代码 // 函数 // 简单定义 function func() { console.log('hello word' ...