解密媒体文件并播放它而不保存到HDD

时间:2010-01-24 18:44:39

标签: c# encryption

我需要开发WinForms应用程序,它将能够解密媒体文件(电影),然后播放它而不将解密文件保存到HDD(解密文件最终将存储在内存流中)问题是,如何从内存流中播放该电影?有可能吗?

2 个答案:

答案 0 :(得分:1)

这是可能的,但我希望您需要编写自己的DirectShow过滤器,这样做一旦创建将充当文件阅读器(实现IFileSourceFilter接口),并且,当视频播放时,将读取连续帧从文件中解密它们,并将它们传递给下一个过滤器。

但是,如果文件以顺序形式加密(即每个单独的帧作为单独的实体加密),这只会起作用。否则,您将不得不一次解密整个文件,这可能是密集的,缓慢的,并且可能必须命中硬盘才能存储结束文件。

但无论如何,这个链接应该让你开始:http://msdn.microsoft.com/en-us/library/dd375454%28VS.85%29.aspx

我担心为了创建DirectShow过滤器,你需要使用C ++,它不是最容易理解的API。

另一种方法可能是使用Windows Media Format SDK,它允许您实时将自定义视频数据包传递给渲染器。 C#(WindowsMediaLib

还有一个很好的互操作库

答案 1 :(得分:1)

首先,逐个加密源视频是个好主意。因此加密的视频文件是一组加密的部分。只需将原始文件拆分为相同大小的部分并加密即可。

这里的方案(OutputStream是加密视频文件流,InputStream是原始文件流,ChunkSize是原始文件中每个部分的大小,我们也写一些元数据:原始和加密件的大小):

using (BinaryWriter Writer = new BinaryWriter(OutputStream))
{ 
    byte[] Buf = new byte[ChunkSize];

    List<int> SourceChunkSizeList = new List<int>();
    List<int> EncryptedChunkSizeList = new List<int>();

    int ReadBytes;
    while ((ReadBytes = InputStream.Read(Buf, 0, Buf.Length)) > 0)
    {
        byte[] EncryptedData = Encrypt(Buf, ReadBytes);
        OutputStream.Write(EncryptedData, 0, EncryptedData.Length);

        SourceChunkSizeList.Add(ReadBytes);
        EncryptedChunkSizeList.Add(EncryptedData.Length);
    }

    foreach (int SourceChunkSize in SourceChunkSizeList)
        Writer.Write(SourceChunkSize);

    foreach (int EncryptedChunkSize in EncryptedChunkSizeList)
        Writer.Write(EncryptedChunkSize);
}

此类元数据有助于快速查找加密部分。

其次,不要在每个读取请求中解密加密数据。缓存它:大多数情况下的视频播放只是顺序读取。

棘手的部分是如何播放加密的视频文件。您可以编写DirectShow过滤器(视频特定解决方案),或检查第三方产品(多用途解决方案):BoxedApp,虚拟化SDK。很酷的是他们有一篇文章展示如何解决你的任务,看看:http://boxedapp.com/encrypted_video_streaming.html