Воспроизведение зашифрованного видео - PullRequest
13 голосов
/ 06 сентября 2011

Я хочу сделать следующее: нам нужно защитить видеоконтент (зашифровать его) и иметь возможность воспроизводить его.

Сложность в том, что мы не хотим загружать все в память сразуи расшифровывать там. (хотя это тоже вариант)

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

Тем не менее, он должен читать файл из блока в блок (потому что, если мы имеем дело с файлом 2 ГБ, он не должен загружаться в память сразу).

Пожалуйста, сообщите нам, каковы возможные пути?

  • SilverLight4 DRM - Хорошо, это похоже на разумное решение, достаточно гибкое для наших нужд.Однако PlayReady SDK стоит около 30 000 долларов, и мы не хотим использовать SilverLight.Предположительно C # или C ++

  • одна идея, которая у нас была, - разделить большой видеофайл на отдельные зашифрованные видеофайлы (например, последовательности), а затем загрузить каждый файл («блок») в память/ расшифровать его и воспроизвести из памяти (и чередовать файлы последовательностей), это, кажется, самый простой из возможных и, вероятно, тот, который действительно можно сделать.Однако, какие библиотеки способны воспроизводить видеофайл из memoryStream?Я действительно считаю, что VLC должен быть в состоянии сделать это ..?

  • Другая идея состояла в том, чтобы просто взять несжатый AVI, обрабатывать видео кадр за кадром, модифицировать каждый кадр (каким-то образом его шифровать), сейчаскогда мы воспроизводим видео, мы повторно обрабатываем кадр в памяти и расшифровываем его.

  • Работа только с одним конкретным кодеком и написание собственного решения для него - на самом деле это звучит довольно круто, но я боюсь, что это займет у нас слишком много времени, но дайте нам знать об этом подходе

  • Другой, использующий VLC для воспроизведения зашифрованного потока с локального хоста (например, APPLICATION передает потоковый зашифрованный файл HDD на локальный хост: 800 / BLAHBLAH), и это же приложение имеет там контроль VLC для расшифровкизашифрованный поток.Мы до сих пор не знаем, можно ли на самом деле зашифровать файл на жестком диске (так что пользователь не сможет воспроизвести этот файл на другом проигрывателе), плюс VLC - это GPL, что нам не подходит.

Ответы [ 4 ]

7 голосов
/ 07 февраля 2012

Конвейер воспроизведения, как правило, представляет собой набор компонентов, включенных вместе.В DirectShow, одном из API и самом популярном, используются элементы чтения, сплиттера, кодеков, пост-обработки и представления, известные как фильтры, и все это воспроизводится.Можно заменить читатель своей собственной заменой, которая читает зашифрованный контент и декодирует на лету.Это может быть легко декодирование по требованию, нет необходимости декодировать весь блок 2 ГБ, чтобы, например, получить первый кадр или миниатюру.

Только подключив считыватель, вы можете выбрать метод шифрования, между пользовательским алгоритмом, одним из хорошо известных, API или внешней библиотекой.большинство других) способов не дают вам пуленепробиваемой гарантии того, что закодированный контент не может быть обращен вспять.Кто-то еще может подключиться к конвейеру и получить оттуда декодированный контент.Если вы удовлетворены тем, что по крайней мере это потребует сложности и опыта для реализации, то такое шифрование сработает довольно хорошо.

7 голосов
/ 13 февраля 2012

Хорошо, вот как я это сделал. (Android)

Зашифрованное видео помещается на SD-карту. RC4 зашифрован - поэтому его можно конвертировать на лету во время потоковой передачи. Затем я создал локальный файловый сервер, который работает на устройстве (в качестве службы). Перед отправкой данных поток вывода делает немного больше - он фильтрует его через дешифратор RC4 перед записью в буфер. Затем просто укажите медиаплеером на URL видео (http://localhost:port/abc.3gp"). В результате видео с SD-карты остается защищенным - вы не можете воспроизвести его, если у вас нет ключа - который вы должны отличать для каждого видео для дополнительной безопасности.

7 голосов
/ 06 сентября 2011

Почти каждый широко используемый алгоритм шифрования работает с блоками размером от 128 до 256 бит - и с радостью расшифрует только несколько из них за раз, что отлично подходит для потоковой передачи.Проверьте, например, Crypto ++ на наличие библиотеки программного обеспечения с потоковыми интерфейсами.(То есть, вы просто открываете файл, устанавливаете вокруг него фильтр дешифрования, а затем просто продолжаете, как и в случае с любым другим файлом.)

4 голосов
/ 02 июня 2012

Спасибо всем за ансеры.Я парень, который использовал много разных подходов.

Я написал свой собственный Videoplayer, используя openGL + FFMPEG, который мог воспроизводить mp4 и расшифровывать каждый кадр в GPU с помощью шейдеров.Я также экспериментировал с другими возможными решениями, такими как потоковая передача с веб-сервера с использованием VLC.(VLC предлагает какое-то шифрование / дешифрование при работе с потоками) и yada yada yada.

Также одним из решений было использование 4 медиаэлементов (WPF), и фактическое видео было фактически разделено на 4 области, и каждая область была повернута, поэтому видео не было доступно для просмотра.Загрузив видео в 4 медиаэлемента, вы можете наметить, какую часть вы хотите показать, а также повернуть его обратно.Но, честно говоря, MediaElement - это плохо.

Тем не менее, я точно понял, что сказал RomanR.Я построил граф DirectShow с использованием mp4splitter, ffdshow, videorenderer и изменил исходный фильтр mp4splitter.Чтение происходит в BaseSplitter / AsyncReader.cpp (просто измените функцию SyncRead), который использует mp4splitter.

Если вы хотите реализовать его самостоятельно, просто используйте проект MPC-HC и измените фильтры так, как вам нравится.Мне потребовалось некоторое время, чтобы обойти концепцию DirectShow, но как только вы ее поняли, она стала отличным оружием.

http://sourceforge.net/apps/trac/mpc-hc/

...