Перейти к содержанию

Настройка DRM-плеера

Ниже описано, как ваш плеер получает лицензию от сервера лицензий MEGOGO для каждой системы DRM: Widevine, FairPlay и PlayReady. Сначала прочитайте раздел DRM: там описано, какую систему DRM использует ваш ключ.

Перед началом работы

Убедитесь, что:

  • MEGOGO настроил систему DRM вашего ключа для каждой платформы (см. DRM);
  • вы умеете получать поток — прошли инструкцию Воспроизведение видео.

Как плеер получает лицензию

  1. Ваше приложение отправляет /stream и получает src, drm_type, license_server, а для FairPlay — еще и license_certificate.
  2. Плеер загружает манифест из src и видит, что видео зашифровано.
  3. Плеер отправляет запрос лицензии на license_server.
  4. Сервер лицензий возвращает лицензию. Плеер расшифровывает видео и воспроизводит его.

Используйте 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 Отправляйте запрос лицензии плеера без изменений

Все коды ошибок приведены в разделе Каталог ошибок.

Дальнейшие шаги


Версия руководства 1.5, 2026-10-31 · Сообщить о проблеме на этой странице