播放加密视频

时间:2011-09-06 08:06:10

标签: video encryption playing

接下来我要做的是: 我们需要保护视频内容(加密它)并能够播放它。

棘手的部分是我们不想一次将所有内容加载到内存中并在那里解密。(虽然这也是一种选择)

我们正在寻找的解决方案是让我们从HDD播放加密的视频内容,这样只有我们的APPLICATIOn才能播放该视频。

然而它应该逐块读取文件(因为如果我们处理2GB文件,它不应该一次性加载到内存中。)

请告诉我们,有哪些可能的方法?

  • SilverLight4 DRM - 好的,这看起来像是合理的解决方案,足以满足我们的需求。但是,PlayReady SDK售价约为30,000美元,我们不想使用SilverLight。大概是C#或C ++

  • 我们有一个想法,就是将大视频文件拆分为单独的加密视频文件(如序列),然后加载每个文件(“块”)直接内存/解密并从内存中播放(和在序列文件之间交替),这似乎是最简单的,也可能是真正做到的。但是,什么库能够从memoryStream播放视频文件?我相信VLC应该能够做到这一点..?

  • 另一个想法是只采用未压缩的AVI,逐帧处理视频,修改每一帧(以某种方式加密),现在当我们播放视频时,我们在内存中重新处理帧并解密它。

  • 只处理一个特定的编解码器并为其编写自定义解决方案 - 实际上这听起来很酷但我担心它会花费我们太多时间,但请告诉我们这个方法

  • 另一个,使用VLC从localhost播放加密流(例如,APPLICATION将加密的HDD文件流传输到localhost:800 / BLAHBLAH),同一个应用程序在那里有VLC控制来解密加密流。我们仍然不知道HDD上的文件是否也可以实际加密(因此用户无法在另一个播放器上播放该文件),而且VLC是GPL,这对我们没有好处。

6 个答案:

答案 0 :(得分:7)

几乎所有广泛使用的加密算法都适用于大小在128到256位之间的块 - 并且一次只能很好地解密其中的一些,这对流式传输很好。查看例如Crypto++以获取具有流接口的软件库。 (即,您只需打开一个文件,在其周围放置一个解密过滤器,然后继续使用其他任何文件。)

答案 1 :(得分:7)

好的,我就是这样做的。 (机器人)

加密视频放在SD卡中。 RC4加密 - 因此它可以在流式传输时即时转换。 然后我创建了一个在设备上运行的本地文件服务器(作为服务)。输出流在发送数据之前会做一些额外的事情 - 它会在将其写入缓冲区之前通过RC4解密器对其进行过滤。然后只需将媒体播放器指向视频的URL(http:// localhost:port / abc.3gp“)。 因此,来自SD卡的视频仍然是安全的 - 除非您拥有密钥,否则无法播放 - 为了提高安全性,每个视频应该有所不同。

答案 2 :(得分:6)

播放管道通常是一组插在一起的组件。在DirectShow中,其中一个API和最受欢迎的API,一个使用读取器,分离器,编解码器,后处理和称为过滤器的演示部件,整个事情回放。可以用自己的替代品替换读取器,读取加密内容并动态解码。它可以很容易地按需解码,不需要解码整个2GB块以便例如获得第一帧或缩略图。

只有连接阅读器部分,您可以自由选择加密方法,自定义算法,众所周知的API,外部库之一。

我仍然认为这个和其他(至少大多数其他)方式不能让你获得防弹保证,编码内容无法逆转。其他人仍然可以挂钩管道并从那里获取解码内容。如果您对此至少需要复杂性和实施经验感到高兴,那么这种加密工作就会很好。

答案 3 :(得分:4)

谢谢大家的激情。我是一个经历过很多不同方法的人。

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

另外一种解决方案是使用4个媒体元素(WPF),实际视频实际上分为4个区域,每个区域都旋转,因此视频无法观看。将视频加载到4个媒体元素后,您可以确定要显示的部分并将其旋转回来。但说实话,MediaElement很糟糕。

然而,我最终完全接受了RomanR所说的话。我使用mp4splitter,ffdshow,videorenderer构建了DirectShow图形,并修改了mp4splitter sourcefilter。读取发生在mp4splitter使用的BaseSplitter / AsyncReader.cpp(只是修改SyncRead函数)中。

如果您想自己实施,只需使用MPC-HC项目并根据需要修改过滤器。我花了一些时间来解决DirectShow概念,但是一旦你理解了它,它就变成了伟大的武器。

http://sourceforge.net/apps/trac/mpc-hc/

答案 4 :(得分:0)

Windows有一种使用文件虚拟化的方法。这个想法是创建一个伪文件,将那些内容加密并可以按需解密。例如。借助BoxedApp SDK,您可以使用BoxedAppSDK_CreateVirtualFileBasedOnIStream创建一个基于IStream的虚拟文件。然后,您将虚拟文件的路径传递到播放器(外部应用程序或媒体播放器activex)。当播放器需要解密数据的下一部分时,此请求将传递到IStream,并且其实现将解密数据并将其返回。因此,整个文件在任何时候都不会被完全解密。还有一个large step-by-step tutorial

答案 5 :(得分:0)

今天最好的选择是:

  1. 使用S3,CloudFront,MediaConvert
  2. 使用加密密钥将MP4转换为AES-128位加密的HLS流(使用MediaConvert)(由客户管理更容易)
  3. 使用VideoJS或其他支持播放加密的HLS流的视频播放器在您的网站上流式传输

如果您拥有WordPress,还可以使用creates and plays encrypted videos的商业插件。