
文章插图
作者 | 阿里文娱前端技术专家 归影
责编 | 夕颜
出品 | CSDN(ID:CSDNnews)
这不是一篇基于MSE开发Web播放器的入门文章,而是围绕Web播放器开发遇到的常见问题与解决方案,毕竟入门文章常有而趟坑干货不常有 。如果您有Web播放开发经验和音视频技术基础,读起来会更有共鸣 。
Web播放器开发基础知识
先介绍Web播放器开发的一些基础知识 。有人要问了,Web播放器开发难道不是一个video标签就够了么?非也!
1、浏览器Video支持的格式非常有限
在W3C的标准里面Video只支持MP4格式 准确的说是ISOBMFF(Fragment MP4) 。当然chrome支持WEBM,safari支持HLS(MPEG-TS)这都是自家的私有实现,做不得数 。
2、浏览器Video无法逐个加载视频切片
现在主流的流媒体点播/直播技术,都会把视频切片 。而video标签src只能挂载整个MP4资源 。没法逐个的加载视频分段 。
所以我们的主角出场—— MediaSource Extenstion,简称MSE,是一套能不断的把音视频二进制数据塞给video标签播放的API 。

文章插图
图1:MSE简明结构
MSE内部可以创建一系列的sourcebuffer,一般是一个音频buffer,一个视频buffer 。把MSE做成blob url之后绑定给video的src 。然后就可以通过AppendBuffer往video里追加音视频数据了 。有了MSE,播放器器的整体结构是什么样的呢,见下图 。

文章插图
图2:Web播放器简明结构
首先在浏览器层面,主要使用video标签、MSE、XHR 和UI 。那么播放器主要由Manager驱动加载视频的playlist(比如HLS里的m3u8,dash里的MPD,FLV虽然不是playlist概念,但是是原理上差别不大,都是为了拿到视频的一个个的片段的地址),并通过数据服务加载这一个个的分片 。然后通过transmuxer也就是所谓的转封装器,把分片的封装格式比如TS拆开(demux) 把连原始的音视频数据解出来,再重新打包成fmp4(remux),最后通过MSE API喂给video标签里,让video去播放 。
因此播放器所做的事情最主要有两点:
1) 转封装 。即将video不支持的封装格式转码成video所支持的封装格式;
2) 如何驱动整个播放进行 。即决定何时下载下一个分片,何时需要解码插入到video的buffer里 。
时间戳对齐
转封装除了的封装格式的解复用(demux)和再复用(remux)之外最重要的环节就是分片的时间戳对齐策略,以及音视频同步 。

文章插图
图3(传说中的“开局一张图 原理全靠猜”)
简单讲一下上图:红色代表音频的时间轴 。蓝色/青色是视频的时间轴 。PTS(Presentation Time Stamp) 指的是这一帧需要渲染的时间 。DTS(Decoding Time Stamp) 指的是这一帧需要解码的时间 。
1、首片首帧的对齐策略
正常来说音频PTS和DTS是一样的,而视频如果有B帧的话DTS往往要比PTS早一些(因为要预留一定的时间解码) 。因此视频的首帧会有一个洞(gap/shift随便你怎么叫),如果不经处理插到video里,那么video里的buffer也会呈现出一小段的洞,一般是0.08s(比如10s的分片 插进去可能出现0.08~10.08的情况) 。现在主流的做法是削掉这个洞 。就是把DTS跟PTS强行拉平,一般来说chrome 不会出现太大的问题 。但是safari不行,如果不预留一定的DTS/PTS偏移,safari前两帧的播放会明显卡顿 。
2、后续对齐策略后续分片的对齐,会通过DTS/PTS两个尾部指针来做 。如果发现后续分片时间轴有间隔就往前推从而填上间隔 。如果发现重叠,就把重叠帧后移 。这样虽然会导致后续分片的前几帧重叠 。但在播放的过程中几乎没有影响 。
音视频同步
首先,什么情况下会导致音画不同步?
1、视频源流压根没对齐 。没救了,看下一点 。
2、还是因为有洞 。很多时候视频切出来的每个分片之间都不一定是严丝合缝的,分片间的音视频时间戳可能有洞 。而且对于TS由于音频每一帧的duration(≈23ms) 跟视频每一帧的duration(40ms@25fps) 无法吻合(整除) 所以加剧了这种参差不齐的情况 。那么,重点来了!chrome有个特殊的机制, 如果发现音频之间有洞之后,为了保证音频的平顺,会自动把后续音频往前推抹平这个洞 。如果每个分片都有洞,悲剧了,这种往前推的操作就会积累越来越多导致音视频不同步 。
推荐阅读
- 便宜有好货?1000元内低价位手表推荐,硬核干货
- 干货!关于抗衰老的小知识,女生必看
- 11月冬茶飘香 游人品茶拜访阿里山正当时
- 公众号运营干货讲解,我个人如何运营公众号赚钱
- 唐汉古树茶,用珍稀的古树为珍惜的你
- 旅行行程攻略怎么做?整篇文章都是压箱底的干货
- 阿里斯顿小厨宝好用吗
- 阿里架构师教你处理高并发:2种方法,解决Redis和Mysql一致性
- 大到阿里,小到三线公司,缓存在大型分布式系统中的最佳应用
- 如何进行阿里云ssl证书申请?zblogphp如何开启https?
