我有一些我加密的视频用这个代码来保护它们:
加密代码:
private void EncryptFile(string inputFile, string outputFile)
{
try
{
string password = @"MyKey123"; // Your Key Here
UnicodeEncoding UE = new UnicodeEncoding();
byte[] key = UE.GetBytes(password);
string cryptFile = outputFile;
FileStream fsCrypt = new FileStream(cryptFile, FileMode.Create);
RijndaelManaged RMCrypto = new RijndaelManaged();
CryptoStream cs = new CryptoStream(fsCrypt,
RMCrypto.CreateEncryptor(key, key),
CryptoStreamMode.Write);
FileStream fsIn = new FileStream(inputFile, FileMode.Open);
int data;
while ((data = fsIn.ReadByte()) != -1)
cs.WriteByte((byte)data);
fsIn.Close();
cs.Close();
fsCrypt.Close();
}
catch
{
MessageBox.Show("Encryption failed!", "Error");
}
}现在我想播放记忆中的加密视频。我已经做了很多研究,知道我应该用DirectShow播放内存中的视频,可以找到这篇文章(https://www.codeproject.com/Articles/2632/DirectShow-MediaPlayer-in-C)。
现在我不知道如何解密文件并播放它。
解密代码:
private void DecryptFile(string inputFile, string outputFile)
{
{
string password = @"MyKey123"; // Your Key Here
UnicodeEncoding UE = new UnicodeEncoding();
byte[] key = UE.GetBytes(password);
FileStream fsCrypt = new FileStream(inputFile, FileMode.Open);
RijndaelManaged RMCrypto = new RijndaelManaged();
CryptoStream cs = new CryptoStream(fsCrypt,
RMCrypto.CreateDecryptor(key, key),
CryptoStreamMode.Read);
FileStream fsOut = new FileStream(outputFile, FileMode.Create);
int data;
while ((data = cs.ReadByte()) != -1)
fsOut.WriteByte((byte)data);
fsOut.Close();
cs.Close();
fsCrypt.Close();
}
}如何使用DirectShow从内存中播放加密视频?
发布于 2018-01-25 15:50:59
从内存内容中解密的回放比一次解密或加密媒体文件要困难得多,正如您的代码片段所建议的那样。媒体文件通常是巨大的。即使您的文件很小,API的目标场景可能是文件很大,而且文件数据在不需要一次加载的情况下是流的。因此,解密和回放必须提供按需访问随机定位的文件片段的方法。
通常您应该开发要插入管道中的相应API原语之一,并根据请求处理发送原始文件片段的解密。
使用DirectShow API,您通常希望开发和提供自定义DirectShow源代码过滤器。有一个异步过滤样本,它可能是一个很好的起点,可以很容易地添加解密,但是示例首先是本机代码C++项目,构建它可能有点混乱。我不认为您可以在C#中开发一个过滤器,即使您可能想要尝试DirectShow.NET的\Sample\Misc\GSSF:
通用示例源过滤器--在c#中实现源过滤器的一种方法
这个线程解决了这里提出的问题,并保持了最新的:从内存中播放加密电影
我有一个加密电影的资源,大小可以是左右或超过1GB,所以我不能一次解密。所以我想把电影一片一片地解密,所需的任何部分都可以在播放前解密,也可以提供给播放器。
在Media Foundation中使用即时解密的播放比较容易实现.在Media中,您可能需要提供自定义的IMFByteStream实现,该实现处理读取请求并应用相关解密。或者,即使是应用于IStream函数的MFCreateMFByteStreamOnStream实现也可能起到这个作用。我认为这在C#中是可行的。另一件事是,您将不得不使用作为播放的API,并且任务会受到它自己的一组挑战。
https://stackoverflow.com/questions/48439881
复制相似问题