FFmpeg和OpenSSL是一个开源免费的软件,在官网上就能下载, FFmpage网址(建议选择文件名full结尾的文件):Builds - CODEX FFMPEG @ gyan.dev OpenSSL网址(建议选择win64的MSI文件):Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions
添加到环境变量
Windows下下载安装OpenSSL和FFmpeg 参考以下链接
http://t.csdnimg.cn/CM81h
注意 ffmpeg openssl 都要添加到系统环境变量
ffmpeg -version #查看ffmpeg版本命令
openssl version #查看openssl版本命令
import os
import subprocess
from cryptography.fernet import Fernet
# 生成加密密钥
key = Fernet.generate_key()
# 视频文件路径
video_path = 'ceshi.mp4.mp4'
# HLS输出目录
hls_output_dir = 'hls_output'
# 使用ffmpeg分割视频
split_command = f'ffmpeg -i {video_path} -c:v libx264 -c:a aac -strict experimental -map 0 -f ssegment -segment_list playlist.m3u8 -segment_time 10 output%03d.ts'
# 执行命令
subprocess.run(split_command, shell=True, check=True)
# 使用OpenSSL加密m3u8和TS文件
encrypt_command = f'openssl enc -aes-256-cbc -in playlist.m3u8 -out playlist.m3u8.enc -iv 00000000000000000000000000000000 -K {key.decode("utf-8")}'
for i in range(1, 100):
ts_file = f'output{i:03d}.ts'
encrypt_command += f' -in {ts_file} -out {ts_file}.enc -iv 00000000000000000000000000000000 -K {key.decode("utf-8")}'
# 执行命令
subprocess.run(encrypt_command, shell=True, check=True)
# 删除原始的m3u8和ts文件,只保留加密版本
os.remove('playlist.m3u8')
for i in range(1, 100):
ts_file = f'output{i:03d}.ts'
os.remove(ts_file)
os.renames(f'{ts_file}.enc', ts_file)
print("HLS encryption completed.")
# 这个命令使用了FFmpeg工具来分割视频文件。让我逐步解释每个部分的含义:
#
# ffmpeg: 这是调用FFmpeg工具的命令。
#
# -i {video_path}: -i 选项后面跟着视频文件的路径 {video_path},表示输入文件的位置。在这里,{video_path}应该是你想要分割的视频文件的路径。
#
# -c:v libx264: -c:v 选项指定视频编解码器,这里选择了 libx264,它是一个用于H.264视频编码的开源编码器。这意味着输出的视频文件将使用 H.264 编码。
#
# -c:a aac: -c:a 选项指定音频编解码器,这里选择了 aac,表示输出的音频将使用 AAC 编码。
#
# -strict experimental: 这个选项告诉FFmpeg在使用某些编解码器时采用实验性的严格模式。
#
# -map 0: 这个选项将输入的所有流映射到输出。-map 0 表示将输入文件的所有流(视频、音频等)都包含在输出中。
#
# -f ssegment: -f 选项用于指定输出格式,这里选择了 ssegment,表示输出为分段流格式。
#
# -segment_list playlist.m3u8: -segment_list 选项指定了分段流的播放列表文件名。在这里,生成的播放列表文件名为 playlist.m3u8,它是一种常见的用于指定分段流的播放列表格式。
#
# -segment_time 10: -segment_time 选项指定了每个分段的时长,这里设置为 10 秒,表示每个分段视频的时长为 10 秒。
#
# output%03d.ts: 这是输出文件的命名模式。%03d 表示输出文件名中的数字部分使用三位数字,例如 output001.ts、output002.ts 等。.ts 表示输出文件的格式为 MPEG-2 Transport Stream 格式。
#
# 综合起来,这个命令的作用是将输入的视频文件分割成多个时长为 10 秒的分段视频,并生成一个名为 playlist.m3u8 的播放列表文件,用于指定分段视频的播放顺序。
#
# for i in range(1, 100):
# ts_file = f'output{i:03d}.ts'
# encrypt_command += f' -in {ts_file} -out {ts_file}.enc -iv 00000000000000000000000000000000 -K {key.decode("utf-8")}'
#
# # 执行命令
# subprocess.run(encrypt_command, shell=True, check=True)
#
#
# 这段代码是在循环中对每个分段视频文件进行加密操作,并将加密后的文件保存在原始文件名后加上 .enc 后缀的新文件中。
#
# 让我们逐行分析:
#
# for i in range(1, 100):: 这是一个循环语句,它会对 i 从 1 到 99 进行迭代。
#
# ts_file = f'output{i:03d}.ts': 这一行使用了 f-string 格式化字符串的功能,将 i 格式化为三位数字,并拼接到字符串 'output' 后面,然后再加上 .ts 后缀,形成每个分段视频文件的文件名。例如,当 i 为 1 时,ts_file 的值为 'output001.ts'。
#
# encrypt_command += f' -in {ts_file} -out {ts_file}.enc -iv 00000000000000000000000000000000 -K {key.decode("utf-8")}':
# 这一行构建了一个命令字符串,用于执行加密操作。-in {ts_file} 指定了输入文件为当前循环迭代中的分段视频文件,
# -out {ts_file}.enc 指定了输出文件为输入文件名后加上 .enc 后缀的新文件,即加密后的视频文件。-iv 00000000000000000000000000000000 指定了初始化向量 (IV),
# 这里使用了全零的 IV。-K {key.decode("utf-8")} 指定了加密密钥,使用了之前生成的密钥,并将其解码为字符串形式。
#
# subprocess.run(encrypt_command, shell=True, check=True): 这一行执行了加密命令,使用了 subprocess.run() 函数来执行命令字符串 encrypt_command。
# shell=True 参数表示使用 shell 来执行命令,check=True 参数表示如果命令执行失败则抛出异常。
#
# 综合起来,这段代码的作用是对每个分段视频文件进行加密,并将加密后的文件保存在原始文件名后加上 .enc 后缀的新文件中。