目录
1、ffmpeg安装教程
1.1 下载地址
Releases · BtbN/FFmpeg-Builds (github.com)
1.2 ffmpeg环境配置
复制ffmpeg解压后的路径
配置ffmpeg环境变量:高级系统设置>环境变量>双击系统变量Path>新建>粘贴>确认
2、视频分割成ts文件
2.1 准备mp4文件
part.mp4
2.2 打开当前目录cmd命令窗口
输入命令:
ffmpeg -i part.mp4 -c:v libx264 -c:a aac -strict -2 -f hls -hls_list_size 0 -hls_time 5 part.m3u8
默认的每片长度为 2 秒,m3u8 文件中默认只保存最新的 5 条片的信息,导致最后播放的时候只能播最后的一小部分(直播的时候特别注意)。
-hls_time n 设置每片的长度,默认值为 2,单位为秒。
-hls_list_size n 设置播放列表保存的最多条目,设置为 0 会保存有所片信息,默认值为5。
-hls_wrap n 设置多少片之后开始覆盖,如果设置为0则不会覆盖,默认值为0。这个选项能够避免在磁盘上存储过多的 片,而且能够限制写入磁盘的最多的片的数量。
-hls_start_number n 设置播放列表中 sequence number 的值为 number,默认值为 0。
注意:播放列表的 sequence number 对每个 segment 来说都必须是唯一的,而且它不能和片的文件名(当使用 wrap 选项时,文件名有可能会重复使用)混淆。
TS 文件是一种媒体的扩展名,它是日本高清摄像机拍摄下进行的封装格式。
MPEG2-TS(Transport Stream“传输流”;又称TS、TP、MPEG-TS 或 M2T)
是用于音效、图像与数据的通信协定,最早应用于DVD的实时传送节目。
MPEG2-TS格式的特点就是要求从视频流的任一片段开始都是可以独立解码的。
3、根据m3u8文件合并ts文件
3.1 准备文件
3.2 输入命令
ffmpeg -i part.m3u8 -c copy 2.mp4
4、视频切片与加密
4.1 下载安装openssl
Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions (slproweb.com)
4.2 配置openssl
复制安装后的目录如图
配置openssl高级变量:高级系统设置>环境变量>双击系统变量Path>新建>粘贴>确认
测试
4.3 生成密钥
openssl rand 16 > [密钥存放位置]
命令: openssl rand 16 > R:\a_tast\encrypt.key
4.4 生成IV
命令:openssl rand -hex 16
得到一串字符串:354e640be9affa01868e6b2b7785b5d2
4.5 编写keyinfo文件
文件名:aa.keyinfo
http://localhost:8080/ld/encrypt.key
R:\a_tast\encrypt.key
354e640be9affa01868e6b2b7785b5d2
第一段:解密文件路径,必须是URI,用来解密视频文件,这里使用tomcat服务
第二段:是加密文件路径
第三段:之前生成的IV
4.6 切片与加密命令
依然打开当前目录的cmd窗口如2.2,或者使用绝对路径
ffmpeg -y -i 1.mp4 -c:v libx264 -c:a copy -f hls -hls_time 5 -hls_list_size 0 -hls_key_info_file aa.keyinfo -hls_playlist_type vod -hls_segment_filename part%d.ts part.m3u8
4.7 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="http://localhost:8080/ld/encrypt.key",IV=0x354e640be9affa01868e6b2b7785b5d2
#EXTINF:7.833333,
part0.ts
#EXTINF:3.600000,
part1.ts
#EXTINF:4.166667,
part2.ts
#EXTINF:6.400000,
part3.ts
#EXTINF:4.166667,
part4.ts
#EXTINF:4.166667,
part5.ts
#EXTINF:0.966667,
part6.ts
#EXT-X-ENDLIST
#EXTM3U M3U8文件头,必须放在第一行;
#EXT-X-MEDIA-SEQUENCE 第一个TS分片的序列号,一般情况下是0,但是在直播场景下,这个序列号标识直播段的起始位置; #EXT-X-MEDIA-SEQUENCE:0
#EXT-X-TARGETDURATION 每个分片TS的最大的时长;
#EXT-X-TARGETDURATION:10 每个分片的最大时长是 10s
#EXT-X-ALLOW-CACHE 是否允许cache;
#EXT-X-ALLOW-CACHE:YES
#EXT-X-ALLOW-CACHE:NO 默认情况下是YES
#EXT-X-ENDLIST M3U8文件结束符;
#EXTINF extra info,分片TS的信息,如时长,带宽等;一般情况下是
#EXTINF:<duration>,[<title>] 后面可以跟着其他的信息,逗号之前是当前分片的ts时长,分片时长 移动要小于
#EXT-X-TARGETDURATION 定义的值;
#EXT-X-VERSION M3U8版本号
#EXT-X-DISCONTINUITY 该标签表明其前一个切片与下一个切片之间存在中断。下面会详解
#EXT-X-PLAYLIST-TYPE 表明流媒体类型;
#EXT-X-KEY 是否加密解析,
#EXT-X-KEY:METHOD=AES-128,URI="http://localhost:8080/ld/encrypt.key" 加密方式是AES-128,秘钥需要请求http://localhost:8080/ld/encrypt.key,请求回来存储在本地;
5、解密与合并
5.1 文件准备(来自第四部分)
5.2 解密合并命令
ffmpeg -allowed_extensions ALL -protocol_whitelist "file,http,crypto,tcp" -i part.m3u8 -c copy 2.mp4
一定要确保m3u8里面的请求路径能访问到