Воспроизведение зашифрованного видео с помощью AVPlayer

Я реализую приложение, содержащее видеоплеер. По некоторым причинам видеофайлы зашифрованы с помощью AES, и размер этих файлов может быть довольно большим, чтобы не загружать его в ОЗУ как одну часть. Я ищу способ воспроизвести его с помощью AVPlayer.

Пробовал:

1) Пользовательский NSURLProtocol, как предлагается здесь http://aptogo.co.uk/2010/07/protecting-resources/ Не работает, я предлагаю, чтобы AVPlayer использовал его собственный, а мой не вызывался.

2) Используйте AVAsset для измельчения видео в небольших кусках, а затем подайте их на AVPlayer - не удалось, потому что для этого нет API в AVPlayer.

Было бы полезно получить любое обходное решение:)

Ответы

Ответ 1

У вас есть 2 варианта:

  • Если таргетинг на iOS 7 и новее, проверьте AVAssetResourceLoaderDelegate. Это позволяет вам делать то, что было бы с пользовательским NSURLProtocol, но специально для AVPlayer.

  • Эмулировать HTTP-сервер с поддержкой заголовка Range и указывать AVURLAsset на localhost.

Я реализовал # 2 раньше и могу предоставить дополнительную информацию, если это необходимо.

Ответ 2

Я только что загрузил образец проекта Apple https://developer.apple.com/library/ios/samplecode/sc1791/Listings/ReadMe_txt.html и, похоже, делает именно то, что вы хотите.

Делегат улавливает каждый вызов AVURLAsset AVAssetResourceLoader и составляет новый .m3a8 файл с собственным ключом дешифрования. Затем он передает плеер всем .ts URL-адресам файла в m3a8.

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