使用ffmpeg将mp4转换为加密m3u8

Juenfy Lv1

使用ffmpeg将mp4转换为加密m3u8

一、准备工作

1.下载并安装ffmpeg

确保已安装 FFmpeg 并添加到系统路径:

1
ffmpeg -version  # 验证安装

2.生成密钥

创建密钥文件 encrypt.key(16字节随机值)和密钥信息文件 keyinfo.txt:

1
2
3
4
5
6
7
# 生成随机密钥(16字节)
openssl rand 16 > encrypt.key

# 创建 keyinfo.txt(格式:密钥URL 密钥文件路径 IV)
echo "https://localhost/encrypt.key" > keyinfo.txt
echo "$(pwd)/encrypt.key" >> keyinfo.txt
echo "0x$(openssl rand -hex 16)" >> keyinfo.txt # 随机初始化向量(IV)

生成的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进制数,改完后再执行转换命令即可

到这里就可以正常转换了。

  • 标题: 使用ffmpeg将mp4转换为加密m3u8
  • 作者: Juenfy
  • 创建于 : 2025-05-29 14:44:17
  • 更新于 : 2025-05-29 18:33:35
  • 链接: https://juenfy.github.io/2025/05/29/使用FFmpeg将MP4转换为加密M3U8/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论