Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 解密媒体文件并在不保存到HDD的情况下播放_C#_Encryption - Fatal编程技术网

C# 解密媒体文件并在不保存到HDD的情况下播放

C# 解密媒体文件并在不保存到HDD的情况下播放,c#,encryption,C#,Encryption,我需要开发WinForms应用程序,它能够对媒体文件(电影)进行解密,然后播放,而无需将解密文件保存到HDD(解密文件最终将存储在内存流中)问题是,如何从内存流播放该电影?有可能吗?有可能,但我希望您需要编写自己的DirectShow筛选器来完成此操作,它一旦创建,将充当文件读取器(实现IFileSourceFilter接口),并且在视频播放时,将从文件中读取连续帧,对其进行解密,并将其传递给下一个筛选器 但是,仅当文件以顺序形式加密(即,每个单独的帧作为单独的实体加密)时,这才起作用。否则,您

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

有可能,但我希望您需要编写自己的DirectShow筛选器来完成此操作,它一旦创建,将充当文件读取器(实现IFileSourceFilter接口),并且在视频播放时,将从文件中读取连续帧,对其进行解密,并将其传递给下一个筛选器

但是,仅当文件以顺序形式加密(即,每个单独的帧作为单独的实体加密)时,这才起作用。否则,您将必须立即解密整个文件,这可能会非常密集、缓慢,并且可能需要点击硬盘来存储最终文件

但无论如何,这个链接应该让你开始:

<>我担心为了创建DirectShow过滤器,你需要使用C++,而不是最容易的API来获取你的头。
另一种方法是使用,它允许您将自定义视频数据包实时传递给渲染器。还有一个很好的C#()互操作库。首先,逐段加密源视频是个好主意。所以加密的视频文件是一组加密的部分。只需将原始文件拆分为相同大小的部分并对其进行加密即可

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

使用(BinaryWriter=新的BinaryWriter(OutputStream))
{ 
byte[]Buf=新字节[ChunkSize];
List SourceChunkSizeList=新列表();
List EncryptedChunkSizeList=新列表();
int读取字节;
而((ReadBytes=InputStream.Read(Buf,0,Buf.Length))>0)
{
byte[]EncryptedData=加密(Buf,ReadBytes);
OutputStream.Write(EncryptedData,0,EncryptedData.Length);
SourceChunkSizeList.Add(ReadBytes);
EncryptedChunkSizeList.Add(EncryptedData.Length);
}
foreach(SourceChunkSizeList中的int SourceChunkSize)
Writer.Write(SourceChunkSize);
foreach(EncryptedChunkSizeList中的int EncryptedChunkSize)
Writer.Write(EncryptedChunkSize);
}
这样的元数据将有助于快速找到加密部分

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

棘手的部分是如何播放加密的视频文件。您可以编写DirectShow筛选器(特定于视频的解决方案),也可以检查第三方产品(多用途解决方案):BoxedApp,一个虚拟化SDK。最酷的是,他们有一篇文章展示了如何解决您的任务,看:

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);
}