Расшифруйте медиафайл и воспроизведите его без сохранения на жестком диске. - PullRequest
1 голос
/ 24 января 2010

Мне нужно разработать приложение WinForms, которое сможет расшифровывать медиа-файл (фильм), а затем воспроизводить его без сохранения расшифрованного файла на жестком диске (дешифрованный файл, наконец, будет сохранен в потоке памяти) Проблема в том, как тогда воспроизвести этот фильм из потока памяти? Возможно ли это?

Ответы [ 2 ]

1 голос
/ 09 июля 2014

Прежде всего, неплохо зашифровать исходное видео по частям. Таким образом, зашифрованный видеофайл представляет собой набор зашифрованных частей. Просто разбейте оригинальный файл на части одинакового размера и зашифруйте их.

Здесь приведена схема (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

1 голос
/ 24 января 2010

Это возможно, но я ожидаю, что для этого вам понадобится написать собственный фильтр DirectShow, который после создания будет действовать как программа чтения файлов (реализующая интерфейс IFileSourceFilter) и, по мере воспроизведения видео, будет читать последовательные кадры. из файла расшифруйте их и передайте их следующему фильтру.

Однако это будет работать, только если файл зашифрован в последовательной форме (то есть каждый отдельный кадр зашифрован как отдельный объект). В противном случае вам придется расшифровывать весь файл одновременно, что может быть интенсивным, медленным и, вероятно, ударом по жесткому диску для сохранения конечного файла.

Но в любом случае, эта ссылка должна помочь вам начать: http://msdn.microsoft.com/en-us/library/dd375454%28VS.85%29.aspx

Боюсь, что для создания фильтра DirectShow вам нужно будет использовать C ++, и это не самый простой API, чтобы разобраться.

Альтернативным способом сделать это может быть использование Windows Media Format SDK , который позволяет передавать пользовательские видео пакеты в средство визуализации в режиме реального времени. Есть также хорошая библиотека взаимодействия для C # ( WindowsMediaLib )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...