用ffmpeg加密並產生HLS串流


AES-128 CBC 加密的HLS串流

1. 產生keyinfo檔案
openssl rand -hex 16 > crypto.key
cat crypto.key | xxd -r -p > crypto.bin
echo "crypto.bin" > mine_key.keyinfo
echo "crypto.bin" >> mine_key.keyinfo

openssl rand -hex 16 >> mine_key.keyinfo

keyinfo檔案內的第1行是解密key檔案位置,第2行是加密key檔案位置,iv值(不是檔案)
$ cat mine_key.keyinfo
crypto.bin
crypto.bin

1e6ae3ae8b573d371bc19525afed405f

2. 產生HLS串流
因為我的ffmpeg是自己編譯的版本,所以呼叫路徑是這樣
/home/mirochiu/test/ffmpeg/ffmpeg -y -i source.ts \
  -c copy -map 0 \
  -f hls -hls_time 10 -hls_list_size 0 -start_number 1 \
  -hls_key_info_file mine_key.keyinfo \
  -hls_playlist_type vod \
  -hls_segment_filename 'test-%03d.ts' test.m3u8

m3u8內容類似下面這樣
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:1
#EXT-X-KEY:METHOD=AES-128,URI="crypto.bin",IV=0x1e6ae3ae8b573d371bc19525afed405f
#EXTINF:9.072711,
test-001.ts
#EXTINF:10.140089,
test-002.ts
#EXTINF:9.606400,
test-003.ts
...
#EXT-X-ENDLIST

3. 放置到http server並測試播放
把產生出來的眾多ts檔案,m3u8,以及key放上http server,就可以用ffplay播放
ffplay http://localhost:8080/static/hls/test.m3u8

如果要直接播放本機目錄,會被ffmpeg擋住,需要加個allowed_extensions參數
crypto.key' is not a common multimedia extension, blocked for security reasons.

/home/mirochiu/test/ffmpeg/ffplay -allowed_extensions ALL /content/test_hls/test.m3u8

如果要在android上直接播放, 可以用這個測試
adb shell am start -a android.intent.action.VIEW -t 'video/*' -d 'http://localhost:8080/static/hls/test.m3u8'

施作細節參考
https://rockycoder.cn/ffmpeg/2018/10/26/Generate-encrypted-video.html

相關文章:
ffmpeg加密串流檔案及即時播放解密
https://codingnote.blogspot.com/2018/04/ffmpeg.html
用ffmpeg轉成HLS檔案群
https://codingnote.blogspot.com/2017/02/ffmpeghls.html


留言