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