使用ffmpeg将mp4转换为加密m3u8
一、准备工作
确保已安装 FFmpeg 并添加到系统路径:
2.生成密钥
创建密钥文件 encrypt.key(16字节随机值)和密钥信息文件 keyinfo.txt:
1 2 3 4 5 6 7
| openssl rand 16 > encrypt.key
echo "https://localhost/encrypt.key" > keyinfo.txt echo "$(pwd)/encrypt.key" >> keyinfo.txt echo "0x$(openssl rand -hex 16)" >> keyinfo.txt
|
生成的keyinfo.txt文件内容如下:
1 2 3
| https://localhost/encrypt.key D:\phpstudy_pro\WWW\hello-muiplayer\media\encrypt.key 0x259b1efb2769bfeef809378ceefa6c00
|
请确保https://localhost/encrypt.key
能够访问密钥文件
二、ffmpeg转换命令
1.执行命令(AES-128加密)
1 2
| ffmpeg -i input.mp4 -c:v libx264 -c:a aac -f hls -hls_time 10 -hls_list_size 0 -hls_key_info_file keyinfo.txt -hls_segment_filename "segment_%03d.ts" playlist.m3u8
|
参数 |
作用 |
-hls_time 10 |
每10秒一个分片 |
hls_list_size 0 |
保留所有分片记录(适合点播) |
-hls_key_info_file keyinfo.txt |
指定密钥信息文件路径 |
-hls_segment_filename "segment_%03d.ts" |
分片文件名模板(%03d 表示三位序号) |
playlist.m3u8 |
输出的播放列表文件名 |
1 2
| ffmpeg -i input.mp4 -map 0:v:0 -map 0:a:0 -c:v:0 libx264 -b:v:0 2000k -s:0 1920x1080 -profile:v:0 main -c:a aac -b:a:0 128k -map 0:v:0 -map 0:a:0 -c:v:1 libx264 -b:v:1 1000k -s:1 1280x720 -profile:v:1 main -c:a aac -b:a:1 128k -map 0:v:0 -map 0:a:0 -c:v:2 libx264 -b:v:2 600k -s:2 854x480 -profile:v:2 main -c:a aac -b:a:2 128k -f hls -var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2" -hls_time 10 -hls_list_size 0 -hls_segment_type mpegts -hls_key_info_file keyinfo.txt -master_pl_name "master.m3u8" -hls_segment_filename "output_%v_%03d.ts" "output_%v.m3u8"
|
参数 |
作用 |
-map 0:v:0 -map 0:a:0 |
映射输入文件的视频和音频流 |
-s:0 1920x1080 |
第一路分辨率(1080P) |
-b:v:0 2000k |
第一路视频码率(2Mbps) |
-var_stream_map "v:0,a:0..." |
指定每路流的音视频映射关系 |
-hls_key_info_file keyinfo.txt |
指定加密密钥信息文件 |
-master_pl_name "master.m3u8" |
生成主播放列表(包含多码率信息) |
output_%v_%03d.ts |
分片文件名模板(%v=流索引,%03d=分片序号) |
2.如果执行遇到下面的报错问题
1 2 3 4 5 6 7 8 9 10
| [crypto @ 000001cf11949440] Error setting option encryption_iv to value 0x259b1efb2769bfeef809378ceefa6c. [hls @ 000001cf0c85e540] Failed to open file 'crypto:segment_000.ts' [vost#0:0/libx264 @ 000001cf0c9b7040] Error submitting a packet to the muxer: Invalid argument Last message repeated 1 times [out#0/hls @ 000001cf0a9e1480] Error muxing a packet [out#0/hls @ 000001cf0a9e1480] Task finished with error code: -22 (Invalid argument) [out#0/hls @ 000001cf0a9e1480] Terminating thread with return code -22 (Invalid argument) [hls @ 000001cf0c85e540] Opening 'crypto:segment_000.ts' for writing [crypto @ 000001cf2fa75700] Error setting option encryption_iv to value 0x259b1efb2769bfeef809378ceefa6c. [hls @ 000001cf0c85e540] Failed to open file 'segment_000.ts'
|
解决方法:把keyinfo.txt文件里的随机初始化向量(IV):0x259b1efb2769bfeef809378ceefa6c00
改为259b1efb2769bfeef809378ceefa6c00
,原因是有的工具不需要0x开头的16进制数,改完后再执行转换命令即可
到这里就可以正常转换了。