Мы используем AVPlayer на iOS 8.4 для воспроизведения видео HLS, зашифрованного AES.AVPlayer, создающий посторонний HTTP-запрос до воспроизведения HLS/AES-зашифрованного видео
Наши .m3u8 файлы включают в себя URL-адрес сервера лицензий, например:
EXT-X-KEY: Method = AES-128, URI = "https: // ...."
В нашем приложении iOS мы используем метод AVAssetResourceLoaderDelegate resourceLoader: shouldWaitForLoadingOfRequestedResource: , чтобы перехватить запрос, отправляемый AVPlayer (или некоторым объектом в AVFoundation) на сервер лицензий. В рамках этого метода мы добавляем токен (требуемый сервером лицензий) в queryString запроса.
Сервер лицензий получает запрос с помощью токена, возвращает ключ шифрования и начинается воспроизведение. Иными словами, все работает так, как ожидалось.
Однако, мы заметить (с помощью «Чарльз» HTTP-монитор), что после создания AVPlayerItem и до призывания resourceLoader: метод, AVFoundation посылает первоначальный запрос на URL-адрес сервера лицензий ; запрос, который не «маршрутизируется» через метод resourceLoader:. Этот запрос отклоняется на сервере, так как наш код iOS никогда не имеет возможности добавить токен перед тем, как запрос исчезнет.
Сводка событий:
• AVPlayerItem/AVAsset создается и инициализируется URL индексного файла .m3u8.
• Что-то в рамках фреймворка AVFoundation делает запрос на сервер лицензий, указанный в файле .m3u8. Этот начальный запрос НЕ перехвачен методом recourceLoader: shouldWaitForLoadingOfRequestedResource:, а немодифицированный запрос попадает на сервер лицензий. Поскольку запрос не содержит требуемый токен в queryString, он терпит неудачу, и ключ шифрования не возвращается.
• Второй запрос сделан AVFoundation на сервер licesnse. Этот запрос улавливается recourceLoader: ... и соответствующим образом изменен. Сервер лицензий возвращает ключ шифрования и начинается воспроизведение.
Это поведение может быть воспроизведено с помощью приложения AVARLDelegateDemo от Apple.
Вопросы:
Является ли первоначальный запрос HTTP посланный AVFoundation нормально?
Если да, то почему это необходимо и почему он не «маршрутизируется» через метод resourceLoader:?
Можно ли подавить первоначальный запрос или изменить его до его отправки?
Спасибо!
Hello user1899931. Мы также пытаемся реализовать тот же механизм для воспроизведения зашифрованных видео AES. Можете ли вы посоветовать мне, как вам удастся перезаписать # EXT-X-KEY с помощью URI и добавить маркер, сделанный во время выполнения (вероятно, JWT), а затем снова загрузить запрос? Ваша помощь будет высоко оценена. Благодаря! –