由于目前网络传输都是使用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
  1. -bsf:v h264_mp4toannexb:它是FFmpeg中的比特流滤镜选项,用于将H.264视频流格式从MP4转换为Annex B格式。Annex B格式是TS(传输流)格式所使用的格式。
  2. -f segment:这个选项告诉FFmpeg将输入文件分割成多个片段。
  3. -segment_list playlist.m3u8:通过指定playlist.m3u8,FFmpeg将生成一个包含所有片段信息的M3U8播放列表文件。
  4. 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