由于目前网络传输都是使用ts分段视频,而不是mp4,在网页中也没有下载按钮,所以需要下载网页中的m3u8视频文件和ts分段视频,然后根据m3u8中的ts列表合成为一个mp4视频,我们可以使用ffmpeg下载网页中的ts视频合成mp4,或者自己想要将mp4分解为ts
1、下载ffmpeg
官网:https://ffmpeg.org/download.html
或者可以到ffmpeg的官方github下载
https://github.com/BtbN/FFmpeg-Builds/releases
具体可以下载gpl格式的:
https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-master-latest-win64-gpl.zip
2、配置环境变量
我是将ffmpeg解压后放到C:\Program Files中,可以自行选择路径
然后在环境变量Path中添加:C:\Program Files\ffmpeg\bin
添加完成后重启电脑
3、不使用密钥仅将mp4分解为ts
ffmpeg -i input.mp4 -c copy -bsf:v h264_mp4toannexb -f segment -segment_list playlist.m3u8 -segment_time 10 output%d.ts
-bsf:v h264_mp4toannexb
:它是FFmpeg中的比特流滤镜选项,用于将H.264视频流格式从MP4转换为Annex B格式。Annex B格式是TS(传输流)格式所使用的格式。-f segment
:这个选项告诉FFmpeg将输入文件分割成多个片段。-segment_list playlist.m3u8
:通过指定playlist.m3u8
,FFmpeg将生成一个包含所有片段信息的M3U8播放列表文件。- output%d.ts 分解的ts文件名称为 output0.ts output1.ts等 %d表示数字
4、使用密钥分解mp4为ts
4.1 使用python生成key和IV
import binascii
import secrets
key = secrets.token_bytes(16) # 生成16个字节作为密钥
iv = secrets.token_bytes(16) # 生成16个字节作为IV
print(binascii.hexlify(key).decode('utf-8'))
print(binascii.hexlify(iv).decode('utf-8'))
4.2创建密钥文件
需要使用winhex或者使用代码将十六进制写入文件,而不是直接手动创建文件将明文粘贴进去,直接粘贴进去的不算十六进制,这里使用python来创建一个keyfile.key文件
hex_data = "893DA3D84435FF5B165C4D5B8089F4BC"
binary_data = bytes.fromhex(hex_data)
file = open("keyfile.key", "wb")
file.write(binary_data)
file.close()
创建完成后右键属性可以看到是16字节数据,如果直接粘贴到文本文件里是32字节
4.3创建密钥信息文件
新建一个key_info.txt文件 内容如下:
C:/Users/Administrator/Downloads/test/keyfile.key
keyfile.key
103f5d9f91fffe510f272457f8b7545e
1.第一行代表key文件的位置,如果是网络密钥可以使用http网址
2.第二行代表key文件的名称
3.第三行代表IV位移,将刚刚python生成的IV填进去即可
4.4加密
ffmpeg -i big_buck_bunny.mp4 -hls_time 10 -hls_key_info_file key_info.txt -hls_segment_filename "file%d.ts" -hls_playlist_type vod paylist.m3u8
-i 指定视频文件路径
-hls_time 指定每个分片视频时长,单位秒
-hls_key_info_file 指定密钥信息文件路径
-hls_segment_filename 指定ts分片文件名称
-hls_playlist_type 指定HLS(HTTP Live Streaming)播放列表的类型 vod表示HLS播放列表为点播类型。点播类型的播放列表会保存所有的媒体片段,并按照请求的顺序逐个播放。
5、解密ts合成为mp4
注意:如果密钥为本地路径,则URI必须为反斜杠,如果m3u8文件和ts视频放在一起则可以不写绝对路径,如果写建议也写成反斜杠
下面是我的m3u8文件示例:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:14
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-KEY:METHOD=AES-128,URI="C:/Users/Administrator/Downloads/test/keyfile.key",IV=0x103f5d9f91fffe510f272457f8b7545e
#EXTINF:10.416667,
file0.ts
#EXTINF:12.625000,
file1.ts
#EXTINF:8.958333,
file2.ts
#EXTINF:10.416667,
file3.ts
#EXTINF:13.666667,
file4.ts
#EXTINF:4.000000,
file5.ts
#EXT-X-ENDLIST
解密/合成mp4:
ffmpeg -allowed_extensions ALL -i paylist.m3u8 -c copy output.mp4