URL-адрес лицензии FairPlay в службах мультимедиа Azure

Я работаю над проектом, в котором мне нужно настроить защиту контента DRM для моих видео. Он отлично работает для Widevine и PlayReady, и теперь мне нужно настроить FairPlay.

Я следовал инструкциям в Руководстве по созданию учетных данных FPS, поэтому у меня есть сертификат и запрос. Я создал параметр политики ключа содержимого, следуя этому руководству: Лицензионные требования и конфигурация Apple FairPlay. Используя интерфейс командной строки, я вижу, что для него определены запросы fairPlayPfx и fairPlayPfxPassword.

Я использую политику потоковой передачи Predefined_MultiDrmStreaming, и у меня есть локатор потоковой передачи, который возвращает пять URL-адресов потоковой передачи (два для DASH, два для HLS и один для SmoothStreaming).

Я использую video-js и videojs-contrib-eme для воспроизведения видео. Чтобы настроить систему ключей FairPlay, мне нужен URL-адрес сертификата и URL-адрес лицензии FairPlay в соответствии с документацией: Получить сертификат / лицензию по URL.

Моя проблема в том, что я не знаю, где найти этот URL-адрес лицензии. Я проверил файл манифеста HLS, но его там нет. Я использую службу лицензирования служб мультимедиа Azure по умолчанию, поэтому я не отменяю customLicenseAcquisitionUrlTemplate в политике потоковой передачи.

Заранее спасибо!

-- редактировать --

Файл моего манифеста (формат = m3u8-cmaf, encryption = cbcs-aapl):

#EXTM3U
#EXT-X-VERSION:7
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio",NAME="aac_und_2_127998_2_1",LANGUAGE="und",DEFAULT=YES,AUTOSELECT=YES,CHANNELS="2",URI="QualityLevels(127998)/Manifest(aac_und_2_127998_2_1,format=m3u8-cmaf,encryption=cbcs-aapl)"
#EXT-X-STREAM-INF:BANDWIDTH=239626,RESOLUTION=320x180,CODECS="avc1.64000d,mp4a.40.2",AUDIO="audio"
QualityLevels(90502)/Manifest(video,format=m3u8-cmaf,encryption=cbcs-aapl)
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=239626,RESOLUTION=320x180,CODECS="avc1.64000d",URI="QualityLevels(90502)/Manifest(video,format=m3u8-cmaf,type=keyframes,encryption=cbcs-aapl)"
#EXT-X-STREAM-INF:BANDWIDTH=310148,RESOLUTION=480x270,CODECS="avc1.640015,mp4a.40.2",AUDIO="audio"
QualityLevels(159506)/Manifest(video,format=m3u8-cmaf,encryption=cbcs-aapl)
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=310148,RESOLUTION=480x270,CODECS="avc1.640015",URI="QualityLevels(159506)/Manifest(video,format=m3u8-cmaf,type=keyframes,encryption=cbcs-aapl)"
#EXT-X-STREAM-INF:BANDWIDTH=413000,RESOLUTION=640x360,CODECS="avc1.64001e,mp4a.40.2",AUDIO="audio"
QualityLevels(260144)/Manifest(video,format=m3u8-cmaf,encryption=cbcs-aapl)
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=413000,RESOLUTION=640x360,CODECS="avc1.64001e",URI="QualityLevels(260144)/Manifest(video,format=m3u8-cmaf,type=keyframes,encryption=cbcs-aapl)"
#EXT-X-STREAM-INF:BANDWIDTH=633193,RESOLUTION=960x540,CODECS="avc1.64001f,mp4a.40.2",AUDIO="audio"
QualityLevels(475597)/Manifest(video,format=m3u8-cmaf,encryption=cbcs-aapl)
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=633193,RESOLUTION=960x540,CODECS="avc1.64001f",URI="QualityLevels(475597)/Manifest(video,format=m3u8-cmaf,type=keyframes,encryption=cbcs-aapl)"
#EXT-X-STREAM-INF:BANDWIDTH=138973,CODECS="mp4a.40.2",AUDIO="audio"
QualityLevels(127998)/Manifest(aac_und_2_127998_2_1,format=m3u8-cmaf,encryption=cbcs-aapl)

Файл моего манифеста (формат = m3u8-aapl, encryption = cbcs-aapl):

#EXTM3U
#EXT-X-VERSION:5
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio",NAME="aac_und_2_127998_2_1",LANGUAGE="und",DEFAULT=YES,AUTOSELECT=YES,URI="QualityLevels(127998)/Manifest(aac_und_2_127998_2_1,format=m3u8-aapl)"
#EXT-X-STREAM-INF:BANDWIDTH=239626,RESOLUTION=320x180,CODECS="avc1.64000d,mp4a.40.2",AUDIO="audio"
QualityLevels(90502)/Manifest(video,format=m3u8-aapl)
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=239626,RESOLUTION=320x180,CODECS="avc1.64000d",URI="QualityLevels(90502)/Manifest(video,format=m3u8-aapl,type=keyframes)"
#EXT-X-STREAM-INF:BANDWIDTH=310148,RESOLUTION=480x270,CODECS="avc1.640015,mp4a.40.2",AUDIO="audio"
QualityLevels(159506)/Manifest(video,format=m3u8-aapl)
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=310148,RESOLUTION=480x270,CODECS="avc1.640015",URI="QualityLevels(159506)/Manifest(video,format=m3u8-aapl,type=keyframes)"
#EXT-X-STREAM-INF:BANDWIDTH=413000,RESOLUTION=640x360,CODECS="avc1.64001e,mp4a.40.2",AUDIO="audio"
QualityLevels(260144)/Manifest(video,format=m3u8-aapl)
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=413000,RESOLUTION=640x360,CODECS="avc1.64001e",URI="QualityLevels(260144)/Manifest(video,format=m3u8-aapl,type=keyframes)"
#EXT-X-STREAM-INF:BANDWIDTH=633193,RESOLUTION=960x540,CODECS="avc1.64001f,mp4a.40.2",AUDIO="audio"
QualityLevels(475597)/Manifest(video,format=m3u8-aapl)
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=633193,RESOLUTION=960x540,CODECS="avc1.64001f",URI="QualityLevels(475597)/Manifest(video,format=m3u8-aapl,type=keyframes)"
#EXT-X-STREAM-INF:BANDWIDTH=138973,CODECS="mp4a.40.2",AUDIO="audio"
QualityLevels(127998)/Manifest(aac_und_2_127998_2_1,format=m3u8-aapl)

person Lucas Silva    schedule 14.12.2020    source источник


Ответы (2)


URL-адрес лицензии FairPlay можно найти в списке воспроизведения верхнего уровня (или второго уровня) HLS, он имеет вид: URI = skd: //eventgridmediaservice.keydelivery.westus2-2.media.azure.net/FairPlay/? Kid = 70d14e71-4380-470c-acff-61dea6382ccf

Вам нужно заменить skd на https.

person William Zhang    schedule 14.12.2020
comment
У меня нет ничего похожего на этот URI в моих файлах HLS. За всеми URI следует QualityLevels. Я отредактировал свой вопрос, показывая часть первых трех строк каждого файла. Вы почему его нет? - person Lucas Silva; 15.12.2020
comment
Это странно. Вот пример URL-адреса с FairPlay: eventgridmediaservice-usw22.streaming.media.azure.net/. Я подозреваю, что у вас есть проблема с конфигурацией FairPlay, такой как StreamingLocator. Если вы используете .NET SDK, не могли бы вы попробовать использовать перечисление для имени политики потоковой передачи: PredefinedStreamingPolicy.MultiDrmStreaming? - person William Zhang; 16.12.2020
comment
Я создал локатор потоковой передачи с помощью перечисления, но получил тот же результат. У него пять URL-адресов, но ни один из HLS не имеет лицензионного URI. Могу ли я еще что-нибудь попробовать? - person Lucas Silva; 17.12.2020
comment
Вы также смотрели плейлист уровня 2 HLS? - person William Zhang; 18.12.2020
comment
Я не уверен, что такое уровень 2, но URL-адреса потоковой передачи имеют два URL-адреса HLS, один для m3u8-cmaf, а другой для файла манифеста m3u8-aapl. Если вы это имеете в виду, я проверил оба файла, и у них нет URL-адреса лицензии. - person Lucas Silva; 29.12.2020
comment
Под слоем 2 я имею в виду плейлист с уровнем битрейта: предположим, вы выбрали m3u8-aapl, получили плейлист первого уровня, в котором вы можете найти URL-адреса для каждого битрейта. - person William Zhang; 30.12.2020
comment
Я нашел это сообщение в блоге: azure.microsoft.com/en-us/blog/ У него есть обходной путь для добавления URL-адреса лицензии в файл манифеста с помощью прокси, но он предназначен для токена AES + и Я использую токен DRM + JWT. Я не уверен, стоит ли мне попробовать что-то похожее на эту реализацию прокси. Я обновил свой вопрос, добавив полный файл манифеста, чтобы вы могли видеть плейлист уровня 2 HLS. Отвечая на ваш предыдущий вопрос, похоже, что URL-адрес лицензии тоже отсутствует. - person Lucas Silva; 08.01.2021
comment
Этот документ предназначен для сценария HLS + AES, только в этом случае Safari на iOS не позволяет API предоставлять токен доступа для получения ключа дешифрования. Так что не используйте его для случая DRM (FairPlay). Я все еще думаю, что ваша проблема может быть связана с неправильной настройкой ContentKeyPolicy. Если все настроено правильно, у вас должен быть URL-адрес лицензии. Вот пример такого HLS + FairPlay: eventgridmediaservice-usw22.streaming.media.azure.net/ - person William Zhang; 10.01.2021
comment
Проблема заключалась в политике потоковой передачи, для параметра allowPersistentLicense было установлено значение false. Когда я изменил его на true, он добавил URL-адрес лицензии в файл манифеста. Моя политика Fairplay ContentKeyPolicy была скопирована с этой страницы: docs .microsoft.com / en-us / azure / media-services / latest /. Потом просто добавляю в список ContentKeyPolicyOption с ограничением. Моя полная реализация очень похожа на эту: github.com/Azure-Samples/media-services-v3-dotnet-tutorials/ Спасибо, что изучили это. - person Lucas Silva; 10.01.2021

Мне удалось получить URL-адрес лицензии в файле манифеста. Мне пришлось создать настраиваемую политику потоковой передачи с allowPersistentLicense, установленным в значение true в конфигурации FairPlay DRM. Для политики потоковой передачи Predefined_MultiDrmStreaming это значение установлено как false.

person Lucas Silva    schedule 08.01.2021
comment
Привет, @Lucas, я работаю над аналогичной функциональностью, я могу воспроизводить видео на Android с manifest URL, JWT Token & Widevine License URL. Я получаю Widevine License URL из файла манифеста и передаю его в код плеера. Видео воспроизводится правильно, так как я жестко запрограммировал эти данные. Мой вопрос в том, как мы можем программно извлечь этот URL-адрес лицензии из файла манифеста и передать его в код плеера Exo. - person Kavita_p; 15.04.2021
comment
Привет, @Kavita_p, у меня есть API, который возвращает файл манифеста. Поэтому я вызываю эту конечную точку во внешнем интерфейсе и ищу licenseUrl=" с помощью функции IndexOf. Я добавляю 12 к результату, потому что licenseUrl=" имеет 12 символов, и это дает мне позицию, с которой начинается URL-адрес лицензии. После этого я снова использую IndexOf, передавая позицию, в которой URL-адрес лицензии начинает поиск закрывающих кавычек после URL-адреса лицензии. И это возвращает позицию, где заканчивается URL-адрес лицензии. Теперь я могу использовать функцию Slice, передавая начальную и конечную позиции, чтобы извлечь URL-адрес лицензии. Надеюсь, это поможет. - person Lucas Silva; 21.04.2021
comment
Спасибо за ответ @Lucas, это единственный способ извлечь licenseUrl? Я использую службу мультимедиа Azure, разве она не предоставляет API, который может возвращать licenseUrl? - person Kavita_p; 21.04.2021
comment
Я также использую службу мультимедиа Azure, и, насколько мне известно, у них нет API, который возвращает только URL-адрес лицензии. У них есть API, который возвращает файл манифеста, и URL-адрес лицензии находится в этом файле. Поэтому нам нужно извлечь его из файла манифеста. Если вы найдете способ лучше, поделитесь им со мной. - person Lucas Silva; 22.04.2021
comment
Однозначно спасибо за информацию :) - person Kavita_p; 22.04.2021