Перейти до змісту

Налаштування 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)
Content 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 Content ID у SPC не є ключем цього відео. Використовуйте ID ключа з skd://

PlayReady (drm_type: playready)

Платформи: Smart TV (Samsung Tizen, LG webOS та інші), Xbox, PlayStation, Microsoft Edge. Потік: DASH або MSS — залежно від налаштування вашого ключа.

Запит Тіло Відповідь
POST на license_server Стандартний запит ліцензії PlayReady (license challenge, 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 · Повідомити про проблему на цій сторінці