使用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 8216

mp42hls \
  --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

留言