C# 解密媒体文件并在不保存到HDD的情况下播放
我需要开发WinForms应用程序,它能够对媒体文件(电影)进行解密,然后播放,而无需将解密文件保存到HDD(解密文件最终将存储在内存流中)问题是,如何从内存流播放该电影?有可能吗?有可能,但我希望您需要编写自己的DirectShow筛选器来完成此操作,它一旦创建,将充当文件读取器(实现IFileSourceFilter接口),并且在视频播放时,将从文件中读取连续帧,对其进行解密,并将其传递给下一个筛选器 但是,仅当文件以顺序形式加密(即,每个单独的帧作为单独的实体加密)时,这才起作用。否则,您将必须立即解密整个文件,这可能会非常密集、缓慢,并且可能需要点击硬盘来存储最终文件 但无论如何,这个链接应该让你开始: <>我担心为了创建DirectShow过滤器,你需要使用C++,而不是最容易的API来获取你的头。C# 解密媒体文件并在不保存到HDD的情况下播放,c#,encryption,C#,Encryption,我需要开发WinForms应用程序,它能够对媒体文件(电影)进行解密,然后播放,而无需将解密文件保存到HDD(解密文件最终将存储在内存流中)问题是,如何从内存流播放该电影?有可能吗?有可能,但我希望您需要编写自己的DirectShow筛选器来完成此操作,它一旦创建,将充当文件读取器(实现IFileSourceFilter接口),并且在视频播放时,将从文件中读取连续帧,对其进行解密,并将其传递给下一个筛选器 但是,仅当文件以顺序形式加密(即,每个单独的帧作为单独的实体加密)时,这才起作用。否则,您
另一种方法是使用,它允许您将自定义视频数据包实时传递给渲染器。还有一个很好的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);
}