[UWP]我们如何将部分解密的视频播放到媒体元素中。 [英] [UWP]How can we play partially decrypted video into media element.

查看:42
本文介绍了[UWP]我们如何将部分解密的视频播放到媒体元素中。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在下载一个大的3GB文件并加密成块并保存到app local。然后在播放解密同一个文件到块时,只有完成解密文件后才能播放。

I am downloading a large 3GB file and encrypting into chunks and save into app local. Then when playing decrypting same file into chunks and after completing decrypted file only I am able to play.

如果我解密第一个块并给玩家播放和下一次解密,是否可能因为它然后给下一个块部分播放等等..
动机是当我开始解密媒体元素开始播放视频时不要等到完全解密。

Is it possible if I decrypted first chunks and give to player for playing and next decryption going on as it is then give next chunks part for playing and so on.. Motive is when I start decrypting media element start going to play video don't wait till decrypting completely.

我的代码是 -

        private void Encrypt(流输入,流输出,字符串密码,字符串盐)

        {

            output.Position = 0;

            byte [] buffer = new byte [1024 * 1024];

            int bytesRead;

            while((bytesRead = input.Read(buffer,0,buffer.Length))> 0)

            {

                var tmp = AES_Encrypt(缓冲区,密码,盐);

                output.Write(tmp,0,tmp.Length);

            }¥b $ b        }


        public byte [] AES_Encrypt(byte [] bytesToBeEncrypted,String pass,String salt)

        {

            byte [] encryptedBytes = null;

            byte [] passByte = Encoding.ASCII.GetBytes(pass);

            byte [] saltBytes = Encoding.ASCII.GetBytes(salt);

            Aes aesEn = Aes.Create();

            aesEn.Padding = PaddingMode.None;

            aesEn.Mode = CipherMode.CBC;

            ICryptoTransform encryptor = aesEn.CreateEncryptor(passByte,saltBytes);

           使用(MemoryStream ms = new MemoryStream())

            {

                using(var cs = new CryptoStream(ms,encryptor,CryptoStreamMode.Write))

                {

                    cs.Write(bytesToBeEncrypted,0,bytesToBeEncrypted.Length);

                }¥b $ b                encryptedBytes = ms.ToArray();

            }¥b $ b            return encryptedBytes;

        }


        private async Task Decrypt(流输入,流输出,字符串密码,字符串盐)

        {

            input.Position = 0;

            byte [] buffer = new byte [1024 * 1024];

            int bytesRead;

            while((bytesRead = await input.ReadAsync(buffer,0,buffer.Length))> 0)

            {

                var tmp = AES_Decrypt(缓冲区,密码,盐);

       private void Encrypt(Stream input, Stream output, String password, String salt)
        {
            output.Position = 0;
            byte[] buffer = new byte[1024 * 1024];
            int bytesRead;
            while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0)
            {
                var tmp = AES_Encrypt(buffer, password, salt);
                output.Write(tmp, 0, tmp.Length);
            }
        }

        public byte[] AES_Encrypt(byte[] bytesToBeEncrypted, String pass, String salt)
        {
            byte[] encryptedBytes = null;
            byte[] passByte = Encoding.ASCII.GetBytes(pass);
            byte[] saltBytes = Encoding.ASCII.GetBytes(salt);
            Aes aesEn = Aes.Create();
            aesEn.Padding = PaddingMode.None;
            aesEn.Mode = CipherMode.CBC;
            ICryptoTransform encryptor = aesEn.CreateEncryptor(passByte, saltBytes);
            using (MemoryStream ms = new MemoryStream())
            {
                using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
                {
                    cs.Write(bytesToBeEncrypted, 0, bytesToBeEncrypted.Length);
                }
                encryptedBytes = ms.ToArray();
            }
            return encryptedBytes;
        }

        private async Task Decrypt(Stream input, Stream output, String password, String salt)
        {
            input.Position = 0;
            byte[] buffer = new byte[1024 * 1024];
            int bytesRead;
            while ((bytesRead = await input.ReadAsync(buffer, 0, buffer.Length)) > 0)
            {
                var tmp = AES_Decrypt(buffer, password, salt);

                await output.WriteAsync(tmp,0,tmp.Length);

                await output.WriteAsync(tmp, 0, tmp.Length);

                //我想在这里给玩家节省时间。

               // I want to give to player here for saving time.

            }

            Uri pathUri = new Uri(" ms-appx:/// Content / de5146");

            media.Source = MediaSource.CreateFromUri(pathUri);

        }


        public byte [] AES_Decrypt(byte [] bytesToBeDecrypted,String pass,String salt)

        {

            byte [] decryptedBytes = null;

            byte [] passByte = Encoding.ASCII.GetBytes(pass);

            byte [] saltBytes = Encoding.ASCII.GetBytes(salt);

            Aes aesEn = Aes.Create();

            aesEn.Padding = PaddingMode.None;

            aesEn.Mode = CipherMode.CBC;

            ICryptoTransform decryptor = aesEn.CreateDecryptor(passByte,saltBytes);

           使用(MemoryStream ms = new MemoryStream())

            {

                using(var cs = new CryptoStream(ms,decryptor,CryptoStreamMode.Write))

                {

                    cs.Write(bytesToBeDecrypted,0,bytesToBeDecrypted.Length);

                }¥b $ b                decryptedBytes = ms.ToArray();

                ms.Flush();

            }¥b $ b            return decryptedBytes;

        }

            Uri pathUri = new Uri("ms-appx:///Content/de5146");
            media.Source = MediaSource.CreateFromUri(pathUri);
        }

        public byte[] AES_Decrypt(byte[] bytesToBeDecrypted, String pass, String salt)
        {
            byte[] decryptedBytes = null;
            byte[] passByte = Encoding.ASCII.GetBytes(pass);
            byte[] saltBytes = Encoding.ASCII.GetBytes(salt);
            Aes aesEn = Aes.Create();
            aesEn.Padding = PaddingMode.None;
            aesEn.Mode = CipherMode.CBC;
            ICryptoTransform decryptor = aesEn.CreateDecryptor(passByte, saltBytes);
            using (MemoryStream ms = new MemoryStream())
            {
                using (var cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Write))
                {
                    cs.Write(bytesToBeDecrypted, 0, bytesToBeDecrypted.Length);
                }
                decryptedBytes = ms.ToArray();
                ms.Flush();
            }
            return decryptedBytes;
        }

sandeep chauhan

sandeep chauhan

推荐答案

我是读取超过1 GB或2 GB的大型视频文件,在下面的代码中读取第二行时,我的内存不足。

I am reading large video file more than 1 GB or 2 GB, I am getting Out of memory exception when reading in 2nd line in below code.


这篇关于[UWP]我们如何将部分解密的视频播放到媒体元素中。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆