Воспроизведение зашифрованного видео
Я хочу сделать следующее: нам нужно защитить видеоконтент (зашифровать его) и иметь возможность воспроизводить его.
Сложность в том, что мы не хотим загружать все в память сразу и дешифровать там (хотя это тоже вариант)
По сути, мы ищем решение для воспроизведения зашифрованного видеоконтента с жесткого диска, чтобы только наше приложение могло воспроизводить это видео.
Тем не менее, он должен читать файл из блока в блок (потому что, если мы имеем дело с файлом 2 ГБ, он не должен загружаться в память сразу).
Пожалуйста, дайте нам знать, каковы возможные пути?
SilverLight4 DRM - Хорошо, это выглядит как разумное решение, достаточно гибкое для наших нужд. Однако PlayReady SDK стоит около 30000 долларов, и мы не хотим использовать SilverLight. Предположительно C# или C++
у нас была одна идея: разделить большой видеофайл на отдельные зашифрованные видеофайлы (например, последовательность), а затем загрузить каждый файл ("блок") для непосредственного запоминания / дешифрования и воспроизведения из памяти (и чередования между файлами последовательности), это кажется самым простым и, вероятно, тем, что действительно можно сделать. Однако, какие библиотеки способны воспроизводить видеофайл из memoryStream? Я верю, что VLC должен быть в состоянии сделать это..?
Другая идея состояла в том, чтобы просто взять несжатый AVI, обрабатывать видео кадр за кадром, изменять каждый кадр (каким-то образом его шифровать), теперь, когда мы воспроизводим видео, мы повторно обрабатываем кадр в памяти и расшифровываем его.
Работа только с одним конкретным кодеком и написание собственного решения для него - на самом деле это звучит довольно круто, но я боюсь, что это займет у нас слишком много времени, но дайте нам знать об этом подходе
Другой, использующий VLC для воспроизведения зашифрованного потока с локального хоста (например, APPLICATION осуществляет потоковую передачу зашифрованного файла HDD на локальный хост:800/BLAHBLAH), и это же приложение имеет там управление VLC для дешифрования зашифрованного потока. Мы до сих пор не знаем, можно ли зашифровать файл на жестком диске (так что пользователь не сможет воспроизвести этот файл на другом проигрывателе), плюс VLC - это GPL, что нам не подходит.
4 ответа
Конвейер воспроизведения обычно представляет собой набор компонентов, включенных вместе. В DirectShow
Один из API и самый популярный, один использует читатель, сплиттер, кодеки, постобработку и части представления, известные как фильтры, и все это воспроизводится. Читатель можно заменить собственной заменой, которая считывает зашифрованный контент и декодирует на лету. Это может быть легко декодирование по требованию, нет необходимости декодировать весь блок 2 ГБ, чтобы, например, получить первый кадр или миниатюру.
Только подключив считыватель, вы можете выбрать метод шифрования, между пользовательским алгоритмом, одним из хорошо известных, API или внешней библиотекой.
Тем не менее, я думаю, что этот и другие (по крайней мере, большинство других) способов не дают вам пуленепробиваемой гарантии того, что закодированный контент не может быть обращен вспять. Кто-то еще может подключиться к конвейеру и получить оттуда декодированный контент. Если вы довольны тем, что это по крайней мере потребует сложности и опыта для реализации, то такое шифрование будет работать довольно хорошо.
Почти каждый широко используемый алгоритм шифрования работает с блоками размером от 128 до 256 бит - и с радостью расшифрует только несколько из них за раз, что отлично подходит для потоковой передачи. Проверьте, например, Crypto ++ для библиотеки программного обеспечения, которая имеет потоковые интерфейсы. (То есть, вы просто открываете файл, устанавливаете вокруг него фильтр дешифрования, а затем просто продолжаете, как и в случае с любым другим файлом.)
Хорошо, вот как я это сделал. (Android)
Зашифрованное видео помещается на SD-карту. RC4 зашифрован - так что его можно конвертировать на лету во время потоковой передачи. Затем я создал локальный файловый сервер, который работает на устройстве (в качестве службы). Перед отправкой данных поток вывода делает немного больше - он фильтрует его через дешифратор RC4 перед записью в буфер. Затем просто наведите медиаплеер на URL-адрес видео (http://localhost:port/abc.3gp"). В результате видео с SD-карты остается защищенным - вы не сможете воспроизвести его, если у вас нет ключа - который вы должен отличаться для каждого видео для дополнительной безопасности.
Спасибо всем за ансеры. Я парень, который прошел через много разных подходов.
Я написал свой собственный 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, но как только вы ее поняли, она стала отличным оружием.
Лучший выбор для этого сегодня:
- Используйте S3, CloudFront, MediaConvert
- Преобразование MP4 в поток HLS с шифрованием AES-128 (с использованием MediaConvert) с использованием ключа шифрования (проще под управлением клиента)
- Транслируйте его на свой веб-сайт с помощью VideoJS или другого видеоплеера, поддерживающего воспроизведение зашифрованных потоков HLS.
Если у вас есть WordPress, вы также можете использовать коммерческий плагин, который создает и воспроизводит зашифрованные видео.
В Windows есть способ использовать виртуализацию файлов. Идея состоит в том, чтобы создать псевдофайл, содержимое которого зашифровано и может быть расшифровано по запросу. Например, с помощью BoxedApp SDK вы создаете виртуальный файл, основанный на IStream, используя BoxedAppSDK_CreateVirtualFileBasedOnIStream. Затем вы передаете путь к виртуальному файлу проигрывателю (внешнему приложению или медиаплееру activex). Когда игроку нужна следующая часть расшифрованных данных, этот запрос передается IStream, и его реализация расшифровывает данные и возвращает их обратно. Таким образом, весь файл ни в коем случае не расшифровывается полностью. Также есть большое пошаговое руководство.