首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c#如何使用DirectShow播放加密视频?

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

Stack Overflow用户
提问于 2018-01-25 09:47:44
回答 1查看 1.4K关注 0票数 2

我有一些我加密的视频用这个代码来保护它们:

加密代码:

代码语言:javascript
复制
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)。

现在我不知道如何解密文件并播放它。

解密代码:

代码语言:javascript
复制
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从内存中播放加密视频?

EN

回答 1

Stack Overflow用户

发布于 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,并且任务会受到它自己的一组挑战。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48439881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档