hls视频生成及加密方案研究

工作中的一个项目需要实现视频在线播放并防止下载。研究目前主流方案以后,决定采用HLS生成视频分片并手动加密的方案。这篇文章记录了研究过程中遇到的问题,以及最后的结果。仅供以后参考。

采用ffmpeg生成HLS原始视频分片

ffmpeg是一个强大的媒体文件处理工具,用它可以方便的生成HLS视频分片。

生成未加密的视频分片命令

ffmpeg -i demo.mp4 -codec copy -f segment -segment_list index.m3u8 -segment_time 30 segment_%d.ts

-i 输入文件
-codec 选择输入文件解码器或输出文件编码器。copy用于输出文件,表示保留输入文件编码无需重新编码。
-f 指定输入或输出文件格式。选择segment,表示视频切片。
-segment_list 指定视频切片索引文件。
-segment_time 指定视频切片时长。
segment_%d.ts 最后指定切片文件命名格式

参考代码,运行plain.sh即可完成视频分片
参考生成资源,可使用安装了Native HLS Playback插件的chrome直接播放。

生成加密的视频分片

未加密的视频分片可以直接播放,用户获得视频分片后可以通过工具合成整个视频文件。无法防止用户下载源视频,故需要采用加密视频分片方式保护源视频。有两种方式生成加密视频分片

1. 采用ffmpeg生成

从网上能找到的此方式的命令为,参考这篇文章。

ffmpeg -y -i demo.mp4 -hls_time 30 -hls_key_info_file enc.keyinfo -hls_segment_filename "segment_%d.ts" index.m3u8

-hls_key_info_file 指定keyinfo文件

keyinfo文件内容格式如下

获取key的URI
key文件路径
IV值(可选)

keyinfo文件示例如下

http://loacalhost:8080/key                             
enc.key
714e1acbfe1663528e97cbb4647f0a33

此命令可以生成加密的视频分片,但是需要重新解码编码比较费时。故加上-codec copy参数,禁止编解码。

ffmpeg -y -i demo.mp4 -codec copy -hls_time 30 -hls_key_info_file enc.keyinfo -hls_segment_filename "segment_%d.ts" index.m3u8

但此命令运行会报错 Cannot use rename on non file protocol, this may lead to races and temporary partial files 并导致索引文件无法包含所有分片。

研究没有找到解决方法,开始研究第二种方式。

2. 采用openssl手动加密

此方案步骤

  1. 生成未加密的视频分片文件。

  2. 根据HLS RFC 8216规范6.2.3,采用openssl手动加密视频分片文件。

  3. 修改视频索引文件,增加#EXT-X-KEY

此方式又分为两种

a. 默认IV

参考代码,运行encrypt.sh完成视频分片和加密,生成的密钥文件为enc.key
参考生成资源,可使用安装了Native HLS Playback插件的chrome直接播放。

b. 自定义IV

参考代码,运行encrypt.sh完成视频分片和加密,生成密钥文件enc.key,iv文件iv.key
参考生成资源,可使用安装了Native HLS Playback插件的chrome直接播放。

另外,openssl加密速度非常快,每个分片可以使用不同的密钥加密,提高安全性。

进一步防止防止下载

加密的视频文件播放时,需要先获取密钥,解密视频文件,然后播放视频。所有这些过程都在客户端进行,对于具有一定开发能力的用户,还是能够获取密钥文件和加密视频,然后还原出原视频。

可以采用下面的措施进一步保护源视频防止下载

  1. 通过权限验证保护密钥URI和索引文件URI,防止盗链以及增加用户获得密钥文件的难度。

  2. 将索引文件和密钥文件二次加密,修改客户端播放器,使其先解密索引文件和密钥文件,再播放加密视频。

参考完整Github代码

你可能感兴趣的:(视频处理,开发随笔,hls,视频加密,m3u8,流媒体)