本文使用的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