工作中的一個項目需要實現視頻在線播放並防止下載。研究目前主流方案以后,決定采用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
但此命令運行會報錯 <font color=red><b>Cannot use rename on non file protocol, this may lead to races and temporary partial files</b></font> 並導致索引文件無法包含所有分片。
研究沒有找到解決方法,開始研究第二種方式。
2. 采用openssl手動加密
此方案步驟
-
生成未加密的視頻分片文件。
-
根據HLS RFC 8216規范6.2.3,采用openssl手動加密視頻分片文件。
-
修改視頻索引文件,增加
#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加密速度非常快,每個分片可以使用不同的密鑰加密,提高安全性。
進一步防止防止下載
加密的視頻文件播放時,需要先獲取密鑰,解密視頻文件,然后播放視頻。所有這些過程都在客戶端進行,對於具有一定開發能力的用戶,還是能夠獲取密鑰文件和加密視頻,然后還原出原視頻。
可以采用下面的措施進一步保護源視頻防止下載
-
通過權限驗證保護密鑰URI和索引文件URI,防止盜鏈以及增加用戶獲得密鑰文件的難度。
-
將索引文件和密鑰文件二次加密,修改客戶端播放器,使其先解密索引文件和密鑰文件,再播放加密視頻。
作者:李桐2000
鏈接:https://www.jianshu.com/p/63485d78086f
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。