使用bento4產生加密的HLS串流(AES-128和SAMPLE-AES)
使用下面的指令產生HLS時, 會遭遇mp42hls的bug, m3u8檔案內的segment檔名是template=sement-%d.ts的問題, 建議修正如下:
https://github.com/Mirochiu/Bento4/commit/003c18a6f61546375e321f821df416a6d1d2cb68
產生無加密HLS
HLS的規格可參考RFC 8216mp42hls \
--segment-filename-template 'seg-%03d.ts' \
--index-filename clear.m3u8 \
--iframe-index-filename 'clear-i.m3u8' \
fragmented.mp4
以下加密使用KEY和IV
HLS_KEY=5a867de28e7a029c2e995687b8992693
HLS_IV=c35263c8381d0b6b80f93360a5ca2ee6
因為mp42hls產生的m3u8會指定key為key.bin, 需要產生key.bin
#可看到m3u8內的key uri為key.bin
#EXT-X-KEY:METHOD=AES-128,URI="key.bin"
printf ${HLS_KEY} | xxd -r -p > key.bin
產生AES-128加密HLS
HLS的AES-128加密方法可參考RFC 8216不指定IV值
mp42hls \--segment-filename-template 'seg_aes128-%03d.ts' \
--index-filename enc_aes128.m3u8 \
--iframe-index-filename 'enc_aes128-i.m3u8' \
--encryption-key ${HLS_KEY} \
--encryption-mode AES-128 \
fragmented.mp4
ffplay播放測試okay, Ubuntu內建播放器不okay
./ffplay -allowed_extensions ALL enc_aes128.m3u8
也可以用openssl工具把加密解回來
openssl aes-128-cbc -d -in seg_aes128-000.ts -out seg_aes128-000_dec.ts -K ${HLS_KEY} -iv 0
指定IV值
指定IV值需要加上--encryption-iv-mode fps,否則結果跟不指定IV值相同mp42hls \
--segment-filename-template 'seg_aes128+iv-%03d.ts' \
--index-filename enc_aes128+iv.m3u8 \
--iframe-index-filename 'enc_aes128+iv-i.m3u8' \
--encryption-key ${HLS_KEY}${HLS_IV} \
--encryption-iv-mode fps \
--encryption-mode AES-128 \
fragmented.mp4
ffplay播放測試okay, Ubuntu內建播放器不okay
./ffplay -allowed_extensions ALL enc_aes128+iv.m3u8
同上可以解回來
openssl aes-128-cbc -d -in seg_aes128+iv-000.ts -out seg_aes128+iv-000_dec.ts -K ${HLS_KEY} -iv ${HLS_IV}
產生SAMPLE-AES加密HLS
SAMPLE-AES加密方法請參考apple官方文件https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/HLS_Sample_Encryption/Intro/Intro.html
不指定IV值
mp42hls \--segment-filename-template 'seg_sampleaes-%03d.ts' \
--index-filename enc_sampleaes.m3u8 \
--iframe-index-filename 'enc_sampleaes-i.m3u8' \
--encryption-key ${HLS_KEY} \
--encryption-mode SAMPLE-AES \
fragmented.mp4
指定IV值
mp42hls \--segment-filename-template 'seg_sampleaes+iv-%03d.ts' \
--index-filename enc_sampleaes+iv.m3u8 \
--iframe-index-filename 'enc_sampleaes+iv-i.m3u8' \
--encryption-key ${HLS_KEY}${HLS_IV} \
--encryption-iv-mode fps \
--encryption-mode SAMPLE-AES \
fragmented.mp4
ffplay和Ubuntu內建的播放器都無法播放SAMPLE-AES
留言