Настройка DRM-плеера¶
Ниже описано, как ваш плеер получает лицензию от сервера лицензий MEGOGO для каждой системы DRM: Widevine, FairPlay и PlayReady. Сначала прочитайте раздел DRM: там описано, какую систему DRM использует ваш ключ.
Перед началом работы¶
Убедитесь, что:
- MEGOGO настроил систему DRM вашего ключа для каждой платформы (см. DRM);
- вы умеете получать поток — прошли инструкцию Воспроизведение видео.
Как плеер получает лицензию¶
- Ваше приложение отправляет
/streamи получаетsrc,drm_type,license_server, а для FairPlay — еще иlicense_certificate. - Плеер загружает манифест из
srcи видит, что видео зашифровано. - Плеер отправляет запрос лицензии на
license_server. - Сервер лицензий возвращает лицензию. Плеер расшифровывает видео и воспроизводит его.
Используйте license_server в точности в том виде, в каком его
получили: не изменяйте его и не собирайте самостоятельно. В параметре
ref он содержит подписанный путь к потоку — это единственная
авторизация. Заголовки и токены не нужны.
ВНИМАНИЕ
license_server, как и src, предназначен только для этого
пользователя и этого воспроизведения. Отправляйте новый запрос
/stream каждый раз, когда пользователь запускает воспроизведение.
Widevine (drm_type: modular)¶
Платформы: веб (Chrome, Firefox, Edge), Android, Android TV, некоторые модели Smart TV. Поток: DASH.
| Запрос | Тело | Ответ |
|---|---|---|
POST на license_server |
Запрос лицензии (license challenge) от плеера: двоичные данные в том виде, в каком их сформировал плеер | Лицензия (двоичные данные, application/octet-stream) |
Большинство плееров сначала отправляют на тот же URL запрос сертификата сервера (service certificate). Сервер лицензий отвечает на него, поэтому получать сертификат самостоятельно не нужно.
Веб: Shaka Player¶
const player = new shaka.Player();
await player.attach(document.querySelector("video"));
player.configure({
drm: { servers: { "com.widevine.alpha": stream.license_server } },
});
await player.load(stream.src);
stream — объект data из ответа /stream.
Android: Media3 ExoPlayer¶
val mediaItem = MediaItem.Builder()
.setUri(stream.src)
.setDrmConfiguration(
MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID)
.setLicenseUri(stream.licenseServer)
.build()
)
.build()
player.setMediaItem(mediaItem)
player.prepare()
FairPlay (drm_type: fairplay)¶
Платформы: iOS, iPadOS, tvOS, Safari на macOS. Поток: HLS.
| Шаг | Что делать |
|---|---|
| Сертификат | Получите сертификат приложения из license_certificate (двоичные данные, DER) |
| ID контента | Возьмите текст после skd:// в URI ключа в плейлисте (#EXT-X-KEY или #EXT-X-SESSION-KEY). Это 32-символьный шестнадцатеричный ID ключа |
| Запрос | Отправьте SPC (двоичные данные) методом POST на license_server с заголовком Content-Type: application/octet-stream |
| Ответ | CKC (двоичные данные) |
В плейлисте может быть несколько ключей, например для аудио, SD и Full HD. Плеер отправляет отдельный запрос для каждого ключа.
iOS и tvOS: AVContentKeySession¶
func contentKeySession(_ session: AVContentKeySession,
didProvide keyRequest: AVContentKeyRequest) {
// keyRequest.identifier is the key URI: "skd://<key ID>"
guard let uri = keyRequest.identifier as? String,
let contentId = uri.replacingOccurrences(of: "skd://", with: "").data(using: .utf8)
else { return }
// certificate: the bytes from license_certificate
keyRequest.makeStreamingContentKeyRequestData(forApp: certificate,
contentIdentifier: contentId,
options: nil) { spc, error in
guard let spc = spc else { keyRequest.processContentKeyResponseError(error!); return }
var request = URLRequest(url: licenseServer) // license_server
request.httpMethod = "POST"
request.setValue("application/octet-stream", forHTTPHeaderField: "Content-Type")
request.httpBody = spc
URLSession.shared.dataTask(with: request) { ckc, _, error in
guard let ckc = ckc else { keyRequest.processContentKeyResponseError(error!); return }
keyRequest.processContentKeyResponse(
AVContentKeyResponse(fairPlayStreamingKeyResponseData: ckc))
}.resume()
}
}
Safari¶
Используйте встроенное воспроизведение HLS в Safari (элемент video) с
поддержкой FairPlay в браузере. Через библиотеку hls.js FairPlay сейчас
не работает.
Ошибки¶
Если сервер лицензий не может прочитать запрос, он возвращает HTTP 400 с
пустым телом. Причина указана в заголовке X-Error:
X-Error |
Причина |
|---|---|
Invalid SPC data size |
SPC пустой или слишком короткий |
Invalid SPC certificate |
SPC сформирован с другим сертификатом. Используйте license_certificate |
Invalid asset ID |
ID контента в SPC не соответствует ни одному ключу этого видео. Используйте ID ключа из skd:// |
PlayReady (drm_type: playready)¶
Платформы: Smart TV (Samsung Tizen, LG webOS и другие), Xbox, PlayStation, Microsoft Edge. Поток: DASH или MSS — в зависимости от настройки вашего ключа.
| Запрос | Тело | Ответ |
|---|---|---|
POST на license_server |
Стандартный запрос лицензии PlayReady (SOAP), который формирует плеер | Ответ с лицензией PlayReady |
Укажите license_server в плеере как URL лицензии. Не добавляйте
дополнительные данные (custom data): запрос авторизуется параметром
ref в URL.
ПРИМЕЧАНИЕ
На Samsung Tizen версии Full HD и 4K с PlayReady SL3000
воспроизводятся в HTML5-элементе video. Используйте его, а не
встроенный плеер Tizen.
Защита устройства для каждого качества¶
Какое качество может воспроизвести устройство, зависит от его уровня защиты DRM и от HDCP подключения к экрану:
| Качество | Widevine | FairPlay | PlayReady |
|---|---|---|---|
| SD, HD (до 720) | Достаточно L3 (программная защита) | Дополнительных требований нет | Дополнительных требований нет |
| Full HD (1080) | L1 (аппаратная защита) и HDCP 2.x | Дополнительных требований нет | SL3000 и HDCP 2.2 |
| 4K (UHD) | L1 и HDCP 2.2 | HDCP 2.2 | SL3000 и HDCP 2.2 |
Если устройство не соответствует этим требованиям, плеер не получает ключи для более высоких качеств. Для некоторых видео и регионов правообладатели могут устанавливать более строгие требования.
Ошибки сервера лицензий¶
| HTTP-статус | Причина | Что делать |
|---|---|---|
| 403 | Значение ref неверное или уже недействительно |
Снова отправьте /stream и используйте новый license_server |
| 400 (FairPlay) | Неверный SPC. См. X-Error |
См. Ошибки FairPlay |
| 500 (Widevine) | Тело запроса не является запросом лицензии Widevine | Отправляйте запрос лицензии плеера без изменений |
Все коды ошибок приведены в разделе Каталог ошибок.
Дальнейшие шаги¶
- Настройки воспроизведения: аудиодорожки и субтитры.
- Чек-лист запуска: проверьте видео с DRM на каждой платформе.
Версия руководства 1.5, 2026-10-31 · Сообщить о проблеме на этой странице