使用 FFmpeg 生成 ts 切片并使用 AES-128 加密

2023-10-27

前言

最近有个需求,需要将服务器视频资源进行加密提供给客户端播放,防止用户盗用视频。

常用的加密方式
m3u8切片加密(本文使用)

各种在线播放视频的网站广泛使用的技术,切片同样是使用AES加密算法。

优点:各种浏览器,手机,小程序都能兼容,通用性很好。
缺点:由于是公开的算法,还原也十分简单,有很多影音嗅探工具能直接下载还原,加密效果很弱,防小白可以,聊胜于无。
防翻录:无

文件流加密

采用异或或者AES等文件流加密方式,对文件数据进行处理。播放时动态解密相应的数据到内存再播放。

优点:加密和解密速度都很快。
缺点:必须使用专用的播放器才能解密,加密强度较弱,专业破解人员可写工具瞬间提取。
防翻录:通过播放器,APP实现

视频逐帧转码加密

加密强度最高但同时也是技术实现最麻烦的一种。软件需要读取源视频内部编码,逐帧把视频编码转为私有视频编码,通常是基于H264来改写为私有协议(即非标准H264算法)。

优点:由于采用私有视频编码协议,除非熟知视频内部编码规则,否则绝无破解或提取的可能,安全性极高。但这种加密方式对开发者技术要求较高,比较少公司使用。
缺点:必须使用专用的播放器才能解密,加密过程类似于视频转码,需要消耗比较长的加密时间。
防翻录:通过播放器,APP实现

环境要求

VLC播放器

openssl

ffmpeg

原理

核心原理其实就是讲解了一个视频源从正常的mp4格式如何变为加密后的m3u8文件+ts文件+key秘钥文件,之后使用vlc播放。

实验
使用 OpenSSL 生成密钥
openssl rand 16 > [密钥存放位置]

例如: openssl rand 16 > D:\openssl_key\encrypt.key

生成IV
openssl rand -hex 16

会生成一串字符串,后面会用到

本次案例生成的字符串: 10c27a9e3fa363dfe4c44b59b67304b3

编写keyinfo文件
http://localhost:8000/encrypt.key
D:\openssl_key\encrypt.key
10c27a9e3fa363dfe4c44b59b67304b3

一共有三段信息

第一段:解密文件路径,必须是URI,用来解密视频文件

第二段:是加密文件路径

第三段:之前生成的IV

FFmpeg 将视频切片且加密
ffmpeg -y -i D:\openssl_key\test.mp4 -c:v libx264 -c:a copy -f hls -hls_time 180 -hls_list_size 0 -hls_key_info_file D:\openssl_key\enc.keyinfo -hls_playlist_type vod -hls_segment_filename D:\openssl_key\file%d.ts D:\openssl_key\playlist.m3u8

命令参数解释

命令参数 解释
-y 不经过确认,输出时直接覆盖同名文件。
-c 指定编码器
-c copy 直接复制,不经过重新编码(这样比较快)
-i 指定输入文件
-title 设置标题
-author 设置作者
-copyright 设置版权
-f 强制设置输入输出的文件格式,默认情况下ffmpeg会根据文件后缀名判断文件格式
-hls_key_info_file keyinfo文件路径
-hls_time 每段文件的时间长度(单位:秒)
-hls_list_size 0 索引播放列表的最大列数 默认5,0 为不限制
-hls_playlist_type vod 表示当前的视频流并不是一个直播流,而是点播流
-hls_segment_filename 输出 ts和m3u8 文件路径中间空格 ,例如:D:\openssl_key\ file%d.ts D:\openssl_key\playlist.m3u8

%d:表示一位数字,从0开始。

最终执行结果

gG112V.png

最后生成的文件

gGlBng.png

m3u8 文件
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:183
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-KEY:METHOD=AES-128,URI="http://localhost:8000/encrypt.key",IV=0x10c27a9e3fa363dfe4c44b59b67304b3
#EXTINF:182.625000,
file0.ts
#EXTINF:31.958333,
file1.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="https://priv.example.com/key.php?r=52"    加密方式是AES-128,秘钥需要请求   https://priv.example.com/key.php?r=52  ,请求回来存储在本地;
总结

本篇文章简单的介绍了如何使用FFmpeg 将视频生成 ts 切片并使用 AES-128 加密。

windows 安装openssl

windows 安装 ffmpeg

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 FFmpeg 生成 ts 切片并使用 AES-128 加密 的相关文章

  • 如何在 PHP 中运行 ffmpeg 命令

    我需要在 PHP 中运行 ffmpeg 命令 但是 php ffmpeg 不再支持最新版本并且已经过时 我可以知道在网络文件中运行 ffmpeg 命令的替代方法吗 PHP Javascript jQuery 我尝试exec and shel
  • 使用 ffmpeg 将 h.264 avi 容器转换为 mp4

    我想使用 ffmpeg 将 h 264 avi 容器转换为 mp4 容器 我发现这个有效 ffmpeg i myfile avi vcodec copy myfile mp4 ffmpeg version N 51169 gcedf276
  • 如何使用 ffmpeg 提取时间精确的视频片段?

    这并不是一个特别新的问题领域 但我已经尝试过那里建议的内容 但运气不佳 那么 我的故事 我有一大段 15 秒的直接来自camera mov 视频 我想从中提取特定的块 我可以通过开始时间和停止时间 以秒为单位 来识别该块 我首先尝试执行我称
  • 使用 ffmpeg 提取帧的最快方法?

    您好 我需要使用 ffmpeg 从视频中提取帧 有没有比这更快的方法 ffmpeg i file mpg r 1 1 filename 03d jpg 如果 JPEG 编码步骤对性能要求太高 您可以始终将未压缩的帧存储为 BMP 图像 ff
  • 访问 AVFrame 的每个像素

    我需要访问 FFMPEG 的 AVFrame 对象的每个像素信息 如果是 RGB 则每个像素的每种颜色 R G 和 B 我怎样才能做到这一点 如果您已经前进到正确的框架 类似于 img convert ctx ffmpeg sws getC
  • 如何使用ffmpeg重叠和合并多个音频文件?

    我正在尝试将多个音频文件合并到一个文件中 但我可以使用以下命令来连接 而不是连接 ffmpeg v debug i file1 wav i file2 wav i file3 wav filter complex 0 0 concat n
  • 用于裁剪和转置视频的 FFMPEG 命令放大后质量较差

    我正在尝试将尺寸通常为 960x720 的 mp4 视频转换为方形 480 480 视频 但它通常看起来被压扁 命令是 y i s vf crop 480 480 transpose d threads 5 metadata s v rot
  • 无法在 Windows 7 机器中使用 OpenCV 2.4.3、Python 2.7 打开“.mp4”视频文件

    我目前正在进行一个涉及读取 mp4 视频文件的项目 我遇到的问题是它在Windows 7机器上使用Python 2 7 32位 OpenCV 2 4 3 cv2 pyd 代码片段如下 try video cv2 VideoCapture v
  • 使用 mkfifo 和传输流,这可能吗?

    我想执行一个 bash 脚本来执行以下操作 应用程序 ffmpeg 生成实时传输流 ts 文件 我需要处理这个实时流 执行解复用等 现在我知道这必须通过 FIFO 来完成 但这是我的任务 我需要重定向 ffmpeg 的输出以写入 fifo
  • 如何使用android ndk r9b为Android编译FFMPEG

    我想设计一个Android应用程序 可以通过FFMPEG命令播放和编辑视频 但我不知道如何在Android上使用FFMPEG 我尝试过从Google搜索到的许多方法 但它们太旧了 无法实现 现在 FFMPEG的最新版本是2 1 1 Andr
  • 使用 Ffmpeg 编辑视频元数据

    我想更改视频元数据 原始视频信息 ffmpeg i video mp4 Metadata major brand mp42 minor version 0 compatible brands isomavc1mp42 creation ti
  • Ffmpeg 无法正确转换为 ogg [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我正在使用 ffmpeg 在我的网站上转换音频和视频 Ffmpeg 可以正确转换为其他格式 如 mp3 mp4 等 但无法正确转换为 ogg 虽然 f
  • 使用 xuggle 将 mp3 转换为 wav 出现异常

    我正在尝试将 mp3 转换为 wav 代码在这里 String mp3 F work pic2talk38512 mp3 String wav F work pic2talk38512 wav TranscodeAudioAndVideo
  • 将 ffmpeg 编译为独立二进制文件

    我正在尝试编译ffmpeg作为独立的二进制文件 因为我想在 AWS lambda 中使用它 我可以让事情在我正在编译的服务器上正常工作 但是如果我复制二进制文件并从另一台服务器运行它 我会得到 ffmpeg error while load
  • Python FFmpeg查询rtsp太慢

    目前 我正在尝试使用 python 和 FFmpeg 来查询原始格式为 h264 的 rtsp 数据 直播流视频的信息为 fps 29 分辨率 1280 720 我希望我可以以相同的格式 h264 查询数据并将其放入python队列中以便将
  • Android 中的 FFMpeg jni?

    我已经构建了 Bambuser http bambuser com opensource 提供的 FFMPEG 可执行文件和库 所以我设法构建了 Android 可执行文件和库 如何在 Eclipse 项目中链接这些库并从 Java 调用
  • FFmpeg av_read_frame 无法正确读取帧?

    好吧 我已经下载了一些 yuv 格式的原始 UHD 序列 并在 mp4 容器中使用 ffmpeg 对其进行编码 h264 4 4 4 100 质量 25fps 当我使用 ffprobe 找出编码了多少帧时 我得到 600 所以这是 24 秒
  • FFMPEG:将 YUV 数据转储到 AVFrame 结构中

    我正在尝试转储YUV420数据进入AVFrameFFMPEG 的结构 从下面的链接 http ffmpeg org doxygen trunk structAVFrame html http ffmpeg org doxygen trunk
  • id3 图像编辑后播放 mp3 时遇到问题

    由于硬件限制 我们生产的软件试图确保导入到其库中的任何音频文件 准备复制到硬件上 都是可接受的比特率 最近 我们开始使用 FFmpeg 将许多不同的音频类型转换为 mp3 以便在我们的硬件上导入和使用它们 虽然转换工作正常并且 mp3 文件
  • FFMPEG - 具有持续时间过滤器问题的连接解复用器

    我正在尝试使用图像生成视频ffmpeg concat 解复用器 我正在创建一个带有图像文件路径的文本文件 由于图像的持续时间可能不同 我正在使用duration过滤器指定每个图像的持续时间 示例文本文件如下 文件1 jpg 持续时间3 文件

随机推荐

  • ubuntu 使用apt-get install安装特定版本 (boost)

    比如 安装libboost atomic1 58 可以使用aptitude search boost grep 1 58 查询 然后执行sudo apt get install libboost atomic1 58 dev 就可以进行安装
  • 7. 布隆过滤器BloomFilter

    概念 由一个初值都为零的bit数组和多个哈希函数构成 用来快速判断某个数据是否存在 类似set的数据结构 只是统计的结果不太准确 特点 高效的插入和查询 占用空间少 返回的结果是不确定的 一个元素如果判断结果为存在的时候元素不一定存在 但是
  • vue--element表格切换数据,选中不生效

    问题 点击 仅显示已选择 时 toggleRowSelection 无效 原因 可能是在修改后的table的数据里 有什么和之前不一样了 导致匹配不到对应的列 解决方案 使用find或者别的数组检索函数 找到table里的那一条数据 而不是
  • springboot整合swagger2+跨域问题

    前言 本篇文章主要介绍的是springboot整合swagger2 swagger2是一个规范和完整的框架 用于生成 描述 调用和可视化Restful风格的web服务 这里介绍两种方式实现 第一种是在yml中添加配置 第二种是添加配置类 G
  • 关于 iw

    本文转自 http blog csdn net robertsong2004 article details 40044947 关于 iw iw 是一种新的基于 nl80211 的用于无线设备的CLI配置实用程序 它支持最近已添加到内核所有
  • 网站怎么防止ddos攻击,防御ddos攻击的11种方法

    为了对抗 DDoS 分布式拒绝服务 攻击 你需要对攻击时发生了什么有一个清楚的理解 简单来讲 DDoS 攻击可以通过利用服务器上的漏洞 或者消耗服务器上的资源 例如 内存 硬盘等等 来达到目的 DDoS 攻击主要要两大类 带宽耗尽攻击和资源
  • C++ 容器vector 语法练习

    编程不是什么技术活 就是个手工活 常常练习 否则手很生 前面写个一次 很久不用就忘记了 http blog csdn net sergery article details 8144354 cpp view plain copy C Pri
  • prometheus(二)——数据模型、数据模块、表达式浏览器

    文章目录 一 prometheus数据模型 1 概述 2 指标类型 3 作业job和实例targets instance 4 prometheusQL 数据查询语言也是时序数据库使用语言 二 prometheus数据模块 三 表达式浏览器
  • [Pytorch系列-49]:卷积神经网络 - 迁移学习的统一处理流程与软件架构 - Pytorch代码实现

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 121312731 目录 第1章 关于F
  • pythone二级题库 + 刷题软件 (超详细解析,看完必过) 第十套

    刷 题软件 模拟python二级考试 操作题刷题软件 1 某系统结构图如下图所示 该系统结构图的深度是 img src 10 1 3 A 4 B 2 C 3 D 1 本题考查知识点是深度 结构图的深度表示控制的层数 同一层上所有结点的所有子
  • 正则表达式之(年龄)(电话号码)(姓名)

    最近在项目中遇到验证的问题 年龄在1 180 姓名姓名为2 18中文和英文结合的字符 电话号码的验证 所以这里来备份一下 电话号码 let telphone 13 0 9 14 579 15 0 3 5 9 16 6 17 0135678
  • spss正态性检验_参数检验与非参数检验如何用?

    1 参数检验 两个独立样本 什么是独立样本 将研究对象随机的分配到两组中 分别接受不同的处理 或分别从两个总体中完全随机的抽取一部分个性进行研究 这样的样本就是独立样本 相应的T检验就是独立样本T检验 什么时候运用参数检验 什么时候运用非参
  • /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/libmysqlclient.a(libmysql.c.o): In function

    在CentOS系统中编译mysql程序 出现这种错误 usr lib gcc x86 64 redhat linux 4 8 5 lib64 libmysqlclient a libmysql c o In function fetch f
  • canvas--标尺

    项目开发过程中 会遇到标尺的功能 标尺可以通过canvas来实现 具体实现如下 1 html代码
  • Stata数据处理。如何处理删除某个公司的某个年份缺失的公司的数据

    stata处理数据 删除某个公司的某个年份缺失的公司的数据 例如 code year 1 2002 1 2003 1 2004 1 2005 2 2002 2 2003 2 2004 code有很多 不知道哪个年份缺少 如何解决 谢谢大家
  • selenium实现截图(python)

    由于需要使用python的selenium库来实现批量对URL的截图 在使用过程中遇到一些小坑 记录下来 使用selenium库截图 第一步 确定我们是需要使用selenium库的截图函数 即save screenshot test png
  • 论文阅读: Going Deeper with Point Networks

    论文题目 Going Deeper with Point Networks Arxiv 2019 pytorch 特点 减小显存使用 使得网络可以更深 效果变好的同时计算量增加不大 pointnet整个网络只有到最后才集合了全局特征 因此他
  • 抱薪者说

    Conflux 网络上线一周年在即 在这将近一年的时间里 Conflux 链上合约部署超 5 266 个 用户数超 476 381 共 24 129 394 笔交易被处理 链上集合了 400 开发者 共书写代码超 291 558 行 网络代
  • 在 Python 中如何实现类的继承,方法重载及重写?

    作者 苏凉 py 来源 CSDN博客 今天我们将进入类的继承以及对类的方法重写及重载的学习 话不多说直接进入正题 类的继承 如果要编写的类是另一个现成类的特殊版本 那我们就可以使用继承 一个类继承另一个类时 将自动获得另一个类的所有属性和方
  • 使用 FFmpeg 生成 ts 切片并使用 AES-128 加密

    前言 最近有个需求 需要将服务器视频资源进行加密提供给客户端播放 防止用户盗用视频 常用的加密方式 m3u8切片加密 本文使用 各种在线播放视频的网站广泛使用的技术 切片同样是使用AES加密算法 优点 各种浏览器 手机 小程序都能兼容 通用