加密视频播放实施方案二:HLS

前一篇文章介绍了使用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都需要准备一个授权服务器,且它们返回密钥的方式不同。如果需要达到自动切换清晰度的目的,需要先将视频按不同的清晰度进行预处理。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180702G1TWDG00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券