python使用ffmpeg分割视频为Hls分片文件/使用OpenSSL加密m3u8和TS文件

news2024/11/23 17:07:39

 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 后缀的新文件中。




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1589198.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenAI现已普遍提供带有视觉应用程序接口的GPT-4 Turbo

OpenAI宣布,其功能强大的GPT-4 Turbo with Vision模型现已通过公司的API全面推出,为企业和开发人员将高级语言和视觉功能集成到其应用程序中开辟了新的机会。 PS:使用Wildcard享受不受网络限制的API调用,详情查看教程 继去年 9 月…

LinkedHashMap部分底层源码解析

JDK版本为1.8.0_271,LinkedHashMap继承了HashMap,LinkedHashMap在HashMap的基础上维护了一个双向链表,实现了可以根据插入顺序/访问顺序(accessOrderfalse/true)访问Map集合。 关于HashMap的原理可以参考HashMap部分底…

IOPaint部署,实现去水印效果

下载源代码 https://github.com/Sanster/IOPaint https://github.com/advimman/lama 创建虚拟环境 conda create --prefixD:\CondaEnvs\iopaint python3.10 conda activate D:\CondaEnvs\iopaint安装依赖包 pytorch最低2.0.0 # 查看cuda版本安装对应的pytorch nvcc -V # …

Prototype 原型

意图 用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。 结构 Prototype声明一个复制自身的接口。ConcretePrototype实现一个复制自身的操作。Client让一个原型复制自身从而创建一个新的对象。 适用性 当一个系统应该独立于他的产品创建、构成和…

HashMap的常见问题

Entry中的hash属性为什么不直接使用key的hashCode()返回值呢? 不管是JDK1.7还是JDK1.8中,都不是直接用key的hashCode值直接与table.length-1计算求下标的,而是先对key的hashCode值进行了一个运算,JDK1.7和JDK1.8关于hash()的实现…

如何卸载干净 IDEA(图文讲解)

更新时间 2022-12-20 11:一则或许对你有用的小广告 星球 内第一个项目:全栈前后端分离博客项目,演示地址:Weblog 前后端分离博客, 1.0 版本已经更新完毕,正在更新 2.0 版本。采用技术栈 Spring Boot Mybatis Plus Vue 3.x Vit…

lanqiao.602 迷宫

题目&#xff1a; 代码&#xff1a; #include<iostream> #include<cstring> #include<algorithm> #include<queue> using namespace std; char mp[31][51]; //稍微开大一点 char k[4]{D,L,R,U}; //按字典序记录路径 int dirx[]{1,0,0,-1},d…

给picgo上传的图片加个水印

之前给大家介绍了picgo和免费的图床神器。我们本可以开开心心的进行markdown写作了。 但是总是会有那么一些爬虫网站过来爬你的文章&#xff0c;还把你的文章标明是他们的原著。咋办呢&#xff1f;这里有一个好的办法就是把markdown中上传的图片加上自己的水印不就行了。 说干…

【复现】CVE-2024-29269 某国外路由器RCE漏洞_72

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 在 Telesquare TLR-2005Ksh 1.0.0 和 1.1.4 中发现的一个问题允许攻击者通过 Cmd 参数运行任意系统命令。 二 .漏洞影响 通过提交…

C语言---顺序表(二)

文章目录 前言1.准备工作2.代码的实现2.1.顺序表的创建、销毁和打印2.2.顺序表的扩容、头插\删、尾插\删2.2.1.扩容2.2.2.尾插2.2.3.头插2.2.3.尾删2.2.4.头删 2.3.指定位置之前插入/删除数据/查找数据2.3.1.指定位置之前插入数据2.3.2.指定位置之前删除数据2.3.3.查找特定数据…

vue3 依赖-组件tablepage-vue3说明文档,列表页快速开发,使用思路及范例(Ⅰ)配置项文档

vue3 依赖-组件tablepage-vue3说明文档&#xff0c;列表页快速开发&#xff0c;使用思路及范例&#xff08;Ⅰ&#xff09;配置项文档 vue3 依赖-组件tablepage-vue3说明文档&#xff0c;列表页快速开发&#xff0c;使用思路及范例&#xff08;Ⅱ&#xff09;搜索及数据获取配…

Linux-select剖析

一、select函数 select函数是IO多路复用的函数&#xff0c;它主要的功能是用来等文件描述符中的事件是否就绪&#xff0c;select可以使我们在同时等待多个文件缓冲区 &#xff0c;减少IO等待的时间&#xff0c;能够提高进程的IO效率。 select()函数允许程序监视多个文件描述符…

旋转编码器原理(超简单)

波形图 A相和B相的状态变化与旋转方向有关。当顺时针旋转时&#xff0c;A相引脚会先变化&#xff0c;然后是B相引脚。而逆时针旋转时&#xff0c;B相引脚会先变化&#xff0c;然后是A相引脚 这是两个引脚的实际波形采样&#xff0c;越密集的旋转的越快 可以发现特点&#xff0…

Redis从入门到精通(十四)Redis分布式缓存(二)Redis哨兵集群的搭建和原理分析

文章目录 前言5.3 Redis哨兵5.3.1 哨兵原理5.3.1.1 集群的结构和作用5.3.1.2 集群监控原理5.3.1.3 集群故障恢复原理 5.3.2 搭建哨兵集群5.3.3 RedisTemplate5.3.3.1 搭建测试项目5.3.3.2 场景测试 前言 Redis分布式缓存系列文章&#xff1a; Redis从入门到精通(十三)Redis分…

Git分布式版本控制系统——Git常用命令(二)

五、Git常用命令————分支操作 同一个仓库可以有多个分支&#xff0c;各个分支相互独立&#xff0c;互不干扰 分支的相关命令&#xff0c;具体如下&#xff1a; git branch 查看分支 git branch [name] 创建分支&#x…

面试题:重写equals(),为什么还要重写hashcode()

认识equals(): Object类中的equals; public boolean equals(Object obj) {return (this obj);}当我们没有重写equals&#xff08;&#xff09;&#xff0c;我们是调用父类object中的方法&#xff0c;比较的是对象的内存地址 重写equals后&#xff0c; public class Student…

蓝桥杯嵌入式(G431)备赛笔记——DMA+UART

目录 CubeMX配置&#xff1a; 代码配置: DMA通道接收&#xff1a; DMA通道发送&#xff1a; 注意&#xff1a; 主函数中记得开启串口接收回调函数&#xff1a; 加了DMA的UART接收通道和一般的区别&#xff1a; 加了DMA的UART发送和一般的区别&#xff1a; CubeMX配置&…

Day23_学点儿Java_多态复习

1 做错的选择题 Java中的多态性是通过以下哪个机制实现的&#xff1f;&#xff08;&#xff09; A. 方法重载 B. 方法覆盖 C. 抽象类 D. 接口2 多态复习 2.1 学点儿Java_Day7_继承、重载、重写、多态、抽象类 2.2 面向对象四大基本特征 封装、抽象、继承、多态 封装 面向…

【翻译】再见, Clean Code!

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 【翻译】再见, Clean Code!正文那是一个深夜次日早晨这只是一个阶段 【翻译】再见…

CTF-SHOW SSRF

web351 存在一个flag.php页面&#xff0c;访问会返回不是本地用户的消息&#xff0c;那肯定是要让我们以本地用户去访问127.0.0.1/flag.php web352 代码中先判断是否为HTTP或https协议&#xff0c;之后判断我们传入的url中是否含有localhost和127.0.0&#xff0c;如果没有则…