c#如何使用DirectShow播放加密视频?

时间:2018-01-25 09:47:44

标签: c# winforms video encryption directshow

我有一些我加密的视频,以保护他们使用此代码:

加密代码:

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从内存播放加密视频?

1 个答案:

答案 0 :(得分:1)

在内存内容中解密播放比在您的代码段建议时立即解密或加密媒体文件要困难得多。媒体文件通常很庞大。即使您的文件很小,API也会定位文件可能很大并且文件数据流式传输而不立即加载的情况。因此,解密和回放必须提供按需访问随机定位文件的方法。

您通常应该开发一个相应的API原语来插入管道并处理解密,根据请求传送原始文件。

使用DirectShow API,您通常需要开发和提供自定义DirectShow源过滤器。有一个Async Filter Sample可能是一个很好的起点,可以很容易地添加解密,但样本本身就是本机代码C ++项目,并且构建它可能有些令人困惑。我不认为您可以在C#中开发过滤器,即使您可能想尝试DirectShow.NET的\ Samples \ Misc \ GSSF:

  

通用样本源过滤器 - 在c#

中实现源过滤器的一种方法

此主题解决了此处提出的问题,并保持最新:Playing encrypted movie from memory

  

我在资源中有一个加密的电影,大小可能大约是1 GB,所以我无法一次解密。所以我想通过大块解密它来播放电影,无论需要什么部分都可以在播放之前解密并提供给播放器。

在Media Foundation中使用动态解密进行回放更容易实现。在Media Foundation中,您可能需要提供定制的IMFByteStream实现,该实现处理读取请求并应用有问题的解密。或者甚至IStream实现应用于MFCreateMFByteStreamOnStream函数也可以解决问题。我认为它在C#中非常可行。另一件事是你必须使用Media Foundation作为播放的API,而且任务受到一系列挑战的影响。