相关文章推荐
跑龙套的企鹅  ·  pyqt ...·  7 月前    · 
稳重的八宝粥  ·  iOS - UIImage 与 RGB ...·  1 年前    · 

音视频同步,即avsync,是影响多媒体应用体验质量的一个重要因素。
本系列文章将从四个角度来深入研究Android平台上的音视频同步机制,以求为遇到音视频不同步问题的朋友提供一个思路:

(1) ExoPlayer avsync逻辑梳理

ExoPlayer是Google开源的一套Android多媒体播放框架,可以很好的支持HLS,DASH等流媒体协议,已经得到Youtube, HBO等视频app的应用。通过梳理ExoPlayer的avsync逻辑,有助于我们从应用的角度理解Android平台的音视频同步机制。

(2) NuPlayer avsync逻辑梳理

NuPlayer是Android framework层的播放器,一般来说,我们在应用层使用MediaPlayer时,都会调用到framework中的NuPlayer去。当然,如果硬件厂商有自己定制的播放器,则要另说了。通过梳理NuPlayer的avsync逻辑,有助于我们从framework层的角度理解Android平台的音视频同步机制。

(3) 如何利用MediaSync进行音视频同步

MediaSync是Android M新加入的API,专用于音视频同步,配合MediaCodec和AudioTrack使用,这里将介绍如何使用它以及它背后的原理。由此,我们可以一窥Google在Android多媒体播放框架上的规划。

(4) 如何从零开始写一个音视频同步的播放器

我们知道,最简单朴素的音视频同步逻辑是直接对齐两者的pts,而各种播放器所采用的音视频同步机制其实都比这复杂得多,那么这些复杂的逻辑中哪些是必要的,哪些逻辑的影响更大,通过从零开始写一个最简单的播放器,并且一步步优化它的音视频同步结果,有助于我们理解以上的问题。

在本概述中,将先介绍一些音视频同步相关的背景知识。

  1. 如何测试音视频同步情况
    当然你可以直接播放一段相声,然后目测声音和嘴型是否对的上。但是这里还是要推荐一个更科学的设备: Sync-One
    Sync-One是从纯物理的角度来测试音视频同步情况的,通过播放特定的 测试片源 ,并检测声音和屏幕亮度的变化,评判声音是落后于视频,还是领先于视频,如果达到了完美的音视频同步结果,会在电子屏上显示数字0,当然这很难==,一般我们会设定一个标准区间,只要结果能落在这个区间内,即可认为视音频基本是同步的。

  2. 如何制定音视频同步的标准
    音视频同步的标准其实是一个非常主观的东西,仁者见仁智者见智。我们既可以通过主观评价实验来统计出一个合理的区间范围,也可以直接参考杜比等权威机构给出的区间范围。同时,不同的输出设备可能也需要给不同的区间范围。比如,我们制定的speaker输出时的音视频同步区间是[-60, +30]ms, 蓝牙音箱输出时的音视频同步区间是[-160, +60]ms, 功放设备输出时的音视频同步区间是[-140, +40]ms。负值代表音频落后于视频,正值代表音频领先于视频。

  3. 在梳理音视频同步逻辑我们应该关注什么
    毫无疑问,音视频同步逻辑的梳理要分别从视频和音频两个角度来看。
    视频方面,我们关注的是同步逻辑对视频码流的pts做了哪些调整。
    音频方面,我们关注的是同步逻辑中是如何获取“Audio当前播放的时间”的。

关注公众号,掌握更多多媒体领域知识与资讯
在这里插入图片描述

文章帮到你了?可以扫描如下二维码进行打赏,打赏多少您随意~
在这里插入图片描述

音频的播放,也有 DTS、PTS 的概念,但是音频没有类似 视频 中 B 帧,不需要双向预测,所以音频帧的 DTS、PTS 顺序是一致的。在 音视频 一起播放的时候,我们通常需要面临一个问题:怎么去 同步 它们,以免出现画不对声的情况。经过我们会使用第二种方案,因为 视频 多一帧或者少一帧,其实人的肉眼分辨的不是很清楚,也就是说眼睛对这个不是那么的敏感,但是人耳对声音是特别的敏感。一,我们知道 视频 中有dts和pts,其实音频里面也有dts和pts,只不过音频里面没有B帧,二,欢迎大家一起交流,批评指正。 一般来说, 视频 同步 指的是 视频 和音频 同步 ,也就是说播放的声音要和当前显示的画面保持一致。想象以下,看一部电影的时候只看到人物嘴动没有声音传出;或者画面是激烈的战斗场景,而声音不是枪炮声却是人物说话的声音,这是非常差的一种体验。 在 视频 流和音频流中已包含了其以怎样的速度播放的相关数据, 视频 的帧率(Frame Rate)指示 视频 一秒显示的帧数(图像数);音频的采样率(Sample Rate)表示音频一秒播放的样本(Sample)的个数。可以使用以上数据通过简单的计算得到其在某一Frame(Sample)的播放时间,以这样的速度音频和 视频 各自播放互不影响,在理想条件下,其应该是 同步 的,不会出现偏差。但,理想条件是什么大家都懂得。如果用上面那种简单的计算方式,慢慢的就会出现 音视频 同步 的情况。要不是 视频 播放快了,要么是音频播放快了,很难准确的 同步 。这就需要一种随着时间会线性增长的量, 视频 和音频的播放速度都以该量为标准,播放快了就减慢播放速度;播放快了就加快播放的速度。所以呢, 视频 和音频的 同步 实际上是一个动态的过程, 同步 是暂时的,不 同步 则是常态。以选择的播放速度量为标准,快的等待慢的,慢的则加快速度,是一个你等我赶的过程。 音视频 同步 的目的是为了使播放的声音和显示的画面保持一致。 视频 按帧播放,图像显示设备每次显示一帧画面, 视频 播放速度由帧率确定,帧率指示每秒显示多少帧;音频按采样点播放,声音播放设备每次播放一个采样点,声音播放速度由采样率确定,采样率指示每秒播放多少个采样点。如果仅仅是 视频 按帧率播放,音频按采样率播放,二者没有 同步 机制 ,即使最初 音视频 是基本 同步 的,随着时间的流逝, 音视频 会逐渐失去 同步 ,并且不 同步 的现象会越来越严重。这是因为:一、播放时间难以精确控制,二、异常及误差会随时间累积。 要实现 音视频 同步 ,需要选择一个参考时钟,参考时钟上的时间是线性递增的,编码 音视频 流时依据参考时钟上的时间给每帧数据打上时间戳。在播放时,读取数据帧上的时间戳,同时参考当前参考时钟上的时间来安排播放。这里的说的时间戳就是。实践中,我们可以选择: 同步 视频 到音频、 同步 音频到 视频 同步 音频和 视频 到外部时钟。 假如 视频 帧率frame_rate=1/30,AVStream时间基time_base=1/900... 所有的基于网络传输的 音视频 采集播放系统都会存在 音视频 同步 的问题,作为现代互联网实时 音视频 通信系统的代表,WebRTC 也不例外。本文将对 音视频 同步 的原理以及 WebRTC 的实现做深入分析。 时间戳 (timestamp) 同步 问题就是快慢的问题,就会牵扯到时间跟 音视频 流媒体的对应关系,就有了时间戳的概念。 时间戳用来定义媒体负载数据的采样时刻,从单调线性递增的时钟中获取,时钟的精度由 RTP 负载数据的采样频率决定。音频和 视频 的采样频率是不一样的,一般音频的采样频率有 16KHz、44.1KHz、48. 先提及一个背景基础知识:  Stagefright中,audio的数据输出是通过AudioTrack中的callback来不断驱动AudioPlayer::fillBuffer获取数据 video的数据输出,则是由OMX端在解码完毕后,给awesomeplayer发送消息event,在awe