Воспроизведение зашифрованного видео
Что я хочу сделать следующее:
Нам нужно защитить видеоконтент (зашифровать его) и быть в состоянии его воспроизвести.
Трудная часть заключается в том, что мы не хотим сразу загружать все в память и расшифровывать ее (хотя это также вариант)
То, что в основном ищет, - это решение для нас, чтобы играть на видеоинформации с жесткого диска, так что только наш 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/