Воспроизведение зашифрованного видео

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

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

То, что в основном ищет, - это решение для нас, чтобы играть на видеоинформации с жесткого диска, так что только наш APPLICATIOn может воспроизводить это видео.

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

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

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

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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

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

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

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

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