播放加密的 MP4

Posted

技术标签:

【中文标题】播放加密的 MP4【英文标题】:Playing encrypted MP4 【发布时间】:2016-10-06 10:37:46 【问题描述】:

我正在制作一个(本地 - 多平台)视频保护应用程序,但我不知道首先“加密->保存在 HDD”然后 的正确解决方案是什么>“从 HDD 加载->解密->播放” 加密视频。

我阅读了有关 MPEG-DASH 和一些 DRM 的信息,发现了这个 Bento4 命令:

mp4dash --encryption-key=000102030405060708090a0b0c0d0e0f:00112233445566778899aabbccddeeff --encryption-args="--property 1:ClearLeadFragments:10 --property 2:ClearLeadFragments:10" movie.mp4

但我不确定 MPEG-DASH 是否可以成为解决方案的一部分。

我该如何解决这个问题?

【问题讨论】:

您似乎缺少基础知识。否则我无法理解为什么您会选择使用针对互联网流媒体优化的格式(您似乎想在本地环境中工作)。基于 ffmpeg 的解决方案应该很容易实现,它可以从 aes 加密的流中播放。谷歌了一下。警告:当您假设攻击者可以访问您的内存时,您的任务可能会变得复杂。我不确定在实践中如何应对此类攻击,但即使是像 keepass 这样的优秀密码管理器也需要大量额外代码才能更安全! @sascha 我对逆向工程有足够的了解,而且我知道可以通过转储进程来获取内存内容。但是,如果您在多帧中解密并加载内容(而不是将完整的明文文件放入内存中),则转储和合并它会变得非常困难。那么,您可以提供哪种文件格式(而不是 mpeg)或解决方案? 您可以使用任何格式(应该可能支持流式传输),只需使用 ffmpeg 进行加密。自己用谷歌搜索有什么难的?获得第一步最多需要 1 分钟。 【参考方案1】:

在google上多次搜索后,我在这里找到了@erti-chris-eelmaa的答案:

Playing encrypted video

我使用 openGL+FFMPEG 编写了自己的 Videoplayer,它可以播放 mp4 和 使用着色器解密 GPU 中的每一帧。我也尝试过 另一种可能的解决方案,例如使用来自网络服务器的流式传输 VLC。 (VLC 在处理时提供了某种加密/解密 流)和yada yada yada。

还有一种解决方案是使用 4 个媒体元素 (WPF) 和实际视频 实际上被分成 4 个区域,每个区域都被旋转,所以 视频不可见。一旦你将视频加载到 4 媒体元素,您可以绘制出您想要展示的部分并 也将其旋转回来。但老实说,MediaElement 很糟糕。

但是,我最终完全按照 RomanR 所说的来结束。我建立了 DirectShow 使用 mp4splitter、ffdshow、videorenderer 和我修改的图形 mp4splitter 源过滤器。阅读发生在 BaseSplitter/AsyncReader.cpp(只需修改 SyncRead 函数) mp4splitter 使用。

如果您想自己实现,只需使用 MPC-HC 项目 并根据需要修改过滤器。我花了一些时间才四处走动 DirectShow 的概念,但是一旦你理解了它,它就会变得很棒 武器。

【讨论】:

【参考方案2】:

HLS + S3 + CloudFront + MediaConvert + VideoJS。

【讨论】:

以上是关于播放加密的 MP4的主要内容,如果未能解决你的问题,请参考以下文章

iPhone 加密和解密 mp4 文件

VideoJS+HLS视频加密播放

“加密”事件未触发,尽管使用 cenc mp4 数据提供源缓冲区

ev4加密视频破解工具 ev4转mp4转换器 ev4视频转换工具(无需授权码密码)

Java 使用blob对H5视频播放进行加密

m3u8视频加密及播放