前一篇文章介绍了使用W3C发布的Dash规范来实现加密视频并播放的方案,参考:《
加密视频播放实施方案一:Dash.js
》,本篇介绍如何使用Apple公司提出的HLS方案来实现视频加密和播放。
事实上,HLS诞生的比Dash更早,现在应用的也比较广泛。至于Dash和HLS之间的历史纠葛本文不谈,有兴趣的朋友可以自行查阅。目前,各大平台对Dash和HLS的支持都算不错,具体选择哪一种方案,各位看官可以根据自己的喜好来决定。
我生之初,尚无为,我生之后,逢此百罹。
准备事项
ffmpeg:强大的视频处理软件,用来加密和切割视频文件。
hls.js:用于播放HLS视频的JS库。
加密密钥:5E828983A265404E95462B5EA002D502
由于ffmpeg加密视频时采用的是AES-128加密算法,因此密钥长度设置为16字节(至于是否支持其它AES加密,本人没有进行过多的尝试,有兴趣的朋友可以自行查阅ffmpeg文档,但我个人认为加密视频时不宜采用强度太大的加密算法,这会给服务器带来更重的负担,128位加密在强度和速度上都比较适中)。
key.bin:二进制密钥文件,即将上文的密钥转换为对应的字节流存储为二进制文件。
key.info:包含了密钥和授权服务器信息的配置文件, 文件内容可以是这样的:
第一行表示授权服务器的地址,当播放视频时,播放器将通过该地址获取密钥。第二行指明了加密视频需要用到的密钥文件。第三行可以设置一个用于AES加密的初始向量(IV)(我测试的时候偷懒了,别学我)。
搭建授权服务器
好了,需要的外部工具就这些,明显比dash需要的工具更少。但仍然需要一个授权服务器,下面是一段简易的授权服务器代码:
这段代码逻辑很简单,就是将一个16字节的密钥以二进制流的形式发送到客户端,并没有做任何身份认证。
处理视频
接下来对将视频进行加密和切割,这个时候就需要用到ffmpeg工具了,超级懒的用法看起来像这样:
命令执行完毕后,将会在hls目录中生成一堆文件,这些文件就是“经过加密和切割的最终文件了”。
播放
所有准备工作都做完了,接下来就是尝试播放视频了。准备一段播放代码,看下面:
恩,看起来没什么问题,可以说基本的加密和播放功能是完成了。
但如果还想做的更高端一些,比如根据客户端网速自动切换清晰度,要这么做呢?要知道流视频的一大特点就是可以侦测客户端的网速,然后无缝切换清晰度以达到流畅播放的目的。
清晰度切换
要达到自动切换清晰度的目的其实也很简单,只需要在处理视频的时候多花一点心思就可以了,下面给出一段批处理脚本,利用ffmpeg将视频处理成清晰度不同的视频文件。
将上面的代码保存成即可作为批处理脚本运行。不过,在运行之前还需要准备一份m3u8入口文件,文件内容如下:
将上面的内容存储为文件,放在同目录下。该文件定义了如何在不同的带宽条件下加载不同的视频文件,这样就可以自动切换清晰度了。
总结
Dash和HLS目前在各大平台的兼容性都不错,可以根据自己的喜好来选择。Dash和HLS都需要准备一个授权服务器,且它们返回密钥的方式不同。如果需要达到自动切换清晰度的目的,需要先将视频按不同的清晰度进行预处理。
领取 专属20元代金券
Get大咖技术交流圈