目录
引言
问题1:
数据缓冲区 + 多线程模型
缓冲区的特点:
点播和直播场景中的缓冲区:
问题2:
同步方式
同步实现过程
引言
上一篇梳理了播放器的基本工作与处理流程,本片内容主要梳理一下其中会遇到的问题?
设计和实现一个播放器需要包含功能接口?
问题1:
按照基本流程,可以采用单线程进行串行处理。这里面的环节比较多,当中的任何一个环节出现一些异常,都会体现在整个处理流程上。单个线程处理的时候,会有网络延迟,处理延迟等因素,必然让CPU在延迟的时候无任务可做,只能待机等待任务,这样就会导致CPU的使用效率大大降低。有什么解决方案吗?
解决方案:数据缓冲区 + 多线程模型
数据缓冲区 + 多线程模型
多线程是并发并行工作的,显然提高了CPU的利用率,提高了整体效率。
然而,多个线程的工作结果怎么实现需要的串行化的处理的效果呢?
答案是通过缓冲区的管控来实现。回顾一下处理流程与多线程模型:
对于解码线程和渲染线程而言,直接使用的数据就是缓冲区的数据,当有网络抖动等,读文件线程没有数据源数据时,还可以依靠缓冲区的数据正常运行,待异常恢复后又可以继续进行数据缓冲。这就是抵御网络延迟,编解码延迟的基本原理。
假设没有这些缓冲区的话,那么这几个线程就无法并行工作了。还是跟单线程一样串行等待。有了缓冲区,对于各个线程而言,直接使用的数据还是缓冲区的数据,所以只要缓冲区有数据,线程就可以开工正常处理自己的工作。还是回到上面的问题,这缓冲区是怎么协同工作,以满足到各个线程数据需求的呢?就是生产者-消费者的模式来实现的。具体生产者-消费者的设计模式后续再补上。
小结一下多线程 的方案因为多线程并行执行可以解决了处理效率问题,而我们整个数据流处理流程是串行的。那么采用了缓冲区队列的方式,就可以让并行处理生产结果 提供给 每个串行处理节点进行消费。这么说来缓冲区支撑了播放器的多线程处理实现,同时也有效解决了网络抖动,解码抖动的问题。
缓冲区的特点:
1)缓冲区越大 -> 抗抖动能力越强
2)缓冲区越大 -> 内存占用越高
3)缓冲区越大 -> 播放延时越大
点播和直播场景中的缓冲区:
在点播场景中,用户希望画质音质有更好的体验,所以缓冲区可以设置大一些。
在直播场景中,用户希望流畅的音视频更重要,所以需要尽量减小延迟,这样就可以对相关的缓冲区配置小一些。或者调整一下水位以使实时性更好。
问题2:
播放时,音频和视频的同步是怎么做到的呢?
音画同步是指播放器正在渲染的每一帧画面和正在播放的每一段声音都是严格对应起来的,不存在人耳和肉眼可以分辨出来的偏差。
首先梳理一下几个音视频相关的概念:
视频帧:视频帧可以简单理解为一帧对应的是一幅图像
音频帧:音频帧的概念和视频帧的概念不一样,音频帧对应声波截取(采样)的一段波形。
帧大小/采样率 = 一帧的时长
DTS:解码时间戳
PTS:显示时间戳
GOP: Group of pictures图片组,以 I 帧为起始点,其他为 P 帧和 B 帧
IDR:GOP的第一帧
对于用网络传输音视频流媒体的数据的方式而言,都是经过编码压缩才能让数据量变小,更容易传播,然后传播到客户端后经过解压缩编码出音频帧和视频帧数据后,再进行播放。
音视频同步就是针对时间戳来进行同步的。
具体的同步原理先不细说了。
同步方式
包括三种:
1)视频同步音频
2)音频同步视频
3)音视频同步外部时钟
由于人耳对声音的敏感度较人眼对图像的敏感度强,所以一般会让视频来配合音频。声音快了图像补偿,声音慢了图像丢弃。
同步实现过程
同步大概实现过程:
1)获取音视频两个相关指标:音频采样率,视频帧率
2)计算音频和视频的每帧播放时长:音频每帧持续时间(ms)= 每帧采样数(帧大小) / 采样率 *1000;视频每帧持续时间(ms) = 1000/帧率
3)调整音视频实现同步:调整到音频和视频每帧播放速度基本相等
https://blog.csdn.net/melody157398/article/details/112855633
https://tencentcloud.csdn.net/64d9f4b19ce083432426a546.html