本文使用的ffmpeg的版本信息:
ffmpeg version 4.4.2-1 Copyright © 2000-2021 the FFmpeg developers
built with gcc 8 (Uos 8.3.0.3-3+rebuild)
1-1 加密分割
目标: 将一个mp4视频文件切割为多个ts片段,并在切割过程中对每一个片段使用 AES-128 加密,最后生成一个m3u8的视频索引文件;
step1: 加密需要的材料
如果要加密,首先准备好一下两个东西: 加密用的
key
文件 和iv
# 生成 加密用的 key, 生成一个enc.key文件
openssl rand 16 > enc.key
# 生成 iv, 是一段字符串(c2e0028a3b2c470c6e6a4623b427f23b),记下来
openssl rand -hex 16
step2: 加密用到的 keyinfo 文件
新建一个 加密用到的key文件 内容格式如下:
Key URI # enc.key的路径,使用http形式
Path to key file # enc.key文件
IV # 上面生成的iv
根据上面的模板,然后 将 enc.key 文件放到 静态服务器上,获取其http的访问地址后,创建一个 enc.keyinfo
文件, 内容如下:
Key http://localhost:8000/static/enc.key
enc.key
c2e0028a3b2c470c6e6a4623b427f23b
step3: 切割视频
hero@hlly:~/Desktop/testts/testarr$ tree
.
├── enc.key
├── enc.keyinfo
└── test.mp4
# 执行下面命令进行 切割
hero@hlly:~/Desktop/testts/testarr$ ffmpeg -i test.mp4 -hls_time 5 -hls_key_info_file enc.keyinfo -hls_playlist_type vod -hls_segment_filename "file%d.ts" -y playlist.m3u8
参数说明:
- -i test.mp4: 指定源视频文件名为 test.mp4。
- -y playlist.m3u8: 指定输出文件名为 playlist.m3u8,如果文件已经存在则直接覆盖。
- -hls_time 5: 设置 HLS 协议输出的每个 .ts 文件的长度为 5 秒。
- -hls_key_info_file enc.keyinfo: FFmpeg 在处理 HLS 流时的一个参数,用于指定保存加密信息的文件。具体来说,这个文件包含了加密算法、加密密钥、IV 向量等信息,以供 HLS 客户端进行解密,hls_key_info_file 中保存的加密信息是未加密的,因此需要妥善保管,以免泄漏密钥信息。
- -hls_playlist_type vod: 用于指定生成 HLS playlist 的类型, hls_playlist_type 设置为 vod 表示生成 HLS 点播流,允许客户端跳转到任意时间点上观看视频,并且客户端可以自由拖动进度条进行快进、快退操作。
- -hls_segment_filename “file%d.ts”: 指定每个小段ts的文件名
扩展:
- -s 1280x720:设置输出视频的分辨率为 1280x720。
- -r 30:设置输出视频的帧率为 30 帧/秒。
- -g 150:设定 GOP 大小,通常为帧率的 2 倍(可选参数)。
- -hls_list_size 0:设置输出 .m3u8 列表文件中包含的 .ts 文件数量的最大值,0 表示不限制数量。
- -start_number 0:设定文件名序号起始值。
- -f hls:设置输出格式为 HLS 协议。
生成的 playlist.m3u8
文件内容如下:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:8
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-KEY:METHOD=AES-128,URI="Key http://localhost:8000/static/enc.key",IV=0xc2e0028a3b2c470c6e6a4623b427f23b
#EXTINF:7.533333,
file0.ts
#EXTINF:3.233333,
file1.ts
#EXTINF:4.966667,
file2.ts
#EXTINF:4.266667,
file3.ts
#EXTINF:3.500000,
file4.ts
#EXT-X-ENDLIST
1-2 加密合并
线下资源
ts文件已经在本地下载好
step1: 修改 m3u8 文件
将 URI=“Key http://localhost:8000/static/enc.key” 修改为:URI=“/home/hero/Desktop/testts/enc.key” 其他不用变。
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:8
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-KEY:METHOD=AES-128,URI="/home/hero/Desktop/testts/enc.key",IV=0xc2e0028a3b2c470c6e6a4623b427f23b
#EXTINF:7.533333,
file0.ts
#EXTINF:3.233333,
file1.ts
#EXTINF:4.966667,
file2.ts
#EXTINF:4.266667,
file3.ts
#EXTINF:3.500000,
file4.ts
#EXT-X-ENDLIST
step2: 聚合ts文件
├── aaa.m3u8
├── file0.ts
├── file1.ts
├── file2.ts
├── file3.ts
└── file4.ts
ffmpeg -allowed_extensions ALL -i aaa.m3u8 -c copy new.mp4
参数说明:
- -i test.mp4: 指定源视频文件名为 test.mp4。
- -allowed_extensions ALL: 允许扩展所有文件
- -c copy: 以“copy”方式进行编码和封装,意味着将源文件中的音视频数据直接复制到目标文件,并不进行任何转码或重编码操作,从而保持了原始视频的质量、格式和编码方式不变。
- new.mp4: 指定相对路径下的输出文件。
线上资源
step1: 修改 m3u8 文件
将 URI=“Key http://localhost:8000/static/enc.key” 修改为:URI=“http://localhost:8000/static/enc.key”,
将ts文件,部署到 静态服务器中,获取其对应的访问地址。
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:8
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-KEY:METHOD=AES-128,URI="http://localhost:8000/static/enc.key",IV=0xc2e0028a3b2c470c6e6a4623b427f23b
#EXTINF:7.533333,
http://localhost:8000/static/ts/file0.ts
#EXTINF:3.233333,
http://localhost:8000/static/ts/file1.ts
#EXTINF:4.966667,
http://localhost:8000/static/ts/file2.ts
#EXTINF:4.266667,
http://localhost:8000/static/ts/file3.ts
#EXTINF:3.500000,
http://localhost:8000/static/ts/file4.ts
#EXT-X-ENDLIST
step2: 聚合ts文件
.
└── playlist_combine_test.m3u8
ffmpeg -protocol_whitelist 'http,file,crypto,data,tcp' -i playlist_combine_test.m3u8 -c copy newwtt.mp4
- -protocol_whitelist ‘http,file,crypto,data,tcp’: 因为FFmpeg的协议白名单限制了输入流的协议类型,而默认情况下不包括"http、tcp"协议。通过选项来扩展协议白名单
2-1 明文分割
目标: 将一个mp4视频文件切割为多个ts片段, 由于没有加密,所以每个ts文件是可以直接打开播放的,最后再生成一个m3u8的视频索引文件;
ffmpeg -i aaa.mp4 -hls_time 5 -hls_playlist_type vod -hls_segment_filename "file%d.ts" -y playlist.m3u8
生成的 playlist.m3u8 文件内容如下:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:8
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:7.533333,
file0.ts
#EXTINF:3.233333,
file1.ts
#EXTINF:4.966667,
file2.ts
#EXTINF:4.266667,
file3.ts
#EXTINF:3.500000,
file4.ts
#EXT-X-ENDLIST
2-2 明文合并
线下资源
├── file0.ts
├── file1.ts
├── file2.ts
├── file3.ts
├── file4.ts
└── playlist.m3u8
ffmpeg -allowed_extensions ALL -i playlist.m3u8 -c copy new.mp4