encrypt video

Интеграция drmnow! и Shaka Packager

В данной статье мы расскажем, как подготавливать (шифровать) видео для работы с multi-drm от drmnow! с помощью Shaka Packager.

Содержание статьи:

Shaka Packager + Widevine, Playready, Wiseplay + DASH Manifest

Используйте следующий bash-скрипт для конвертации mp4 в MPEG-DASH.

#!/usr/bin/env bash

# Проект из личного кабинета cdnnow!
project=""

# Ключ доступа из личного кабинета cdnnow!
token=""

# Идентификатор контента, уникальное для каждого вашего видео файла имя
contentId=""

# Путь до исходного видео файла
videoSource="path/to/video.mp4"

# Путь до директории с результатами
outputFolder="path/to/output/folder"

# Shaka Packager

./packager \
in="$videoSource,stream=0,init_segment=$outputFolder/v0_init.m4v,segment_template=$outputFolder/v0_\$Number\$.m4v" \
in="$videoSource,stream=1,init_segment=$outputFolder/a0_init.m4a,segment_template=$outputFolder/a0_\$Number\$.m4a" \
--generate_static_live_mpd \
--segment_duration 6 \
--fragment_duration 6 \
--default_language ru \
--mpd_output "$outputFolder/index.mpd" \
--enable_widevine_encryption \
--protection_systems Widevine,PlayReady \
--key_server_url "https://$project.nowdrm.co/v2/keyservice/contentkey/get?token=$token" \
--content_id "$(echo $contentId | xxd -p)"

Советы

  • Shaka Packager отправляет запросы для получения ключей на /v2/keyservice/contentkey/get в формате, совместимом с Widevine Key Server:
    {"request": "<BASE64PAYLOAD>"}
    Здесь <BASE64PAYLOAD> — base64-закодированный JSON:
    {
        "content_id": "<CONTENTIDBASE64>",
        "policy":"some_value",
        "tracks": [
            {"type": "<QUALITYTYPE1>"},
            {"type": "<QUALITYTYPEN>"}
        ],
        "drm_types": [
            "<DRMTYPE1>",
            "<DRMTYPEN>"
        ],
        "protection_scheme": "some_value"
    }
    в котором <CONTENTIDBASE64> — base64-закодированный идентификатор контента, <QUALITYTYPE1>, <QUALITYTYPEN> — лейблы видео-/аудиодорожек, для которых требуется создать ключи (допустимые значения — SD, HD, UHD1, UHD2, AUDIO), <DRMTYPE1>, <DRMTYPEN> — типы DRM-систем, для которых требуется отдать тело PSSH в ответе (допустимые значения — WIDEVINE, PLAYREADY, FAIRPLAY, WISEPLAY). Ответ имеет вид:
    {"response": "<RESPONSEBASE64>"}
    Здесь <RESPONSEBASE64> — base64-закодированный JSON:
    {
        "status": "OK",
        "tracks": [
            {
                "type": "<QUALITYTYPE>",
                "key": "<KEYBASE64>",
                "pssh": [
                    {"data": "<PSSHBASE64>",
                    "drm_type": "<DRMTYPE>"}
                ],
                "key_id": "<KEYID>"
            }
        ],
        "drm": [
            {"type": "<DRMTYPE>", "system_id": "<DRMTYPEID>"}
        ]
    }
    в котором поле tracks содержит объекты, описывающие ключи и тела PSSH, по количеству запрошенных ключей. В каждом из объектов <QUALITYTYPEN> — название лейбла видео-/аудиодорожки, <KEYBASE64> — base64-закодированный ключ шифрования дорожки, <PSSHBASE64> — base64-закодированное тело PSSH, <DRMTYPE> — тип DRM-системы, переданный в запросе, <DRMTYPEID> — UUID-идентификатор DRM-истемы по спецификации DASH-IF.

    Обратите внимание — если вы планируете использовать один ключ для всех дорожек, то следует заменить /v2/keyservice/contentkey/get на /drm/keyservice/widevine/getcontentkey, лейблы дорожек при этом будут игнорироваться. При этом для запроса лицензий нужно будет использовать роуты /widevine, /playready, /fairplay, /wiseplay вместо /v2/widevine, /v2/playready, /v2/fairplay, /v2/wiseplay соответственно.
  • Строки, начинающиеся с “in”, соответствуют дорожкам аудио и видео в исходном mp4 файле.
    Для получения информации о дорожках используйте утилиту ffprobe, запустив команду ffprobe path/to/video.mp4.
  • Для того, чтобы используемый вами плеер правильно показывал язык дорожки в списке доступных дорожек, добавьте в строку, начинающуюся с "in" параметр "language=<LANG>", где <LANG> — двухсимвольное обозначение языка по ISO 639-1. Наиболее часто используемые: ru (русский), en (английский), de (немецкий), fr (французский), zh (китайский). Пример: in="$videoSource,stream=5,language=ru,init_segment=$outputFolder/a5_init.m4a,segment_template=$outputFolder/a5_\$Number\$.m4a"
  • Если вы планируете использовать AES CBC, добавьте в список параметров вызова Shaka Packager строку
    --protection-scheme cbcs \
  • Для совместимости с Wiseplay Вам понадобится специальная сборка Shaka Packager. Для ее получения напишите нам на электронную почту req@drmnow.ru.
    При этом необходимо заменить строку:
    --protection_systems Widevine,PlayReady \
    на
    --protection_systems Widevine,PlayReady,Wiseplay \
  • Вы можете использовать утилиту mp4dump для проверки правильности запаковки с помощью Shaka packager, а также при создании собственного запаковщика. Для этого нужно проверять первый чанк — в нем должна содержаться информация об используемых DRM-системах, а именно в mp4-атомах [pssh]. Эти атомы добавляются по числу используемых DRM-систем, их значением является полный заголовок pssh (pssh box). Помимо этого в mp4-атоме [tenc] содержится краткая информация о ключе шифрования: default_KID (key id, который будет использоваться по умолчанию для данной дорожки), default_Per_Sample_IV_Size (обычно 16), default_isProtected (1).
    Пример работы mp4dump для первого чанка видео, запакованного по скрипту выше: ./mp4dump path/to/output/folder/v0_init.mp4 (вывод только атомов [pssh]):
...
[pssh] size=12+76
  system_id = [ed ef 8b a9 79 d6 4a ce a3 c8 27 dc d5 1d 21 ed]
  data_size = 56
[pssh] size=12+538
  system_id = [9a 04 f0 79 98 40 42 86 ab 92 e6 5b e0 88 5f 95]
  data_size = 518
[pssh] size=12+235
  system_id = [3d 5e 6d 35 9b 9a 41 e8 b8 43 dd 3c 6e 72 c4 2c]
  data_size = 215

Полный вывод команды.

Присутствуют идентификаторы всех трех DRM-систем, то есть запаковка прошла успешно.

Обратите внимание — в ответе /v2/keyservice/contentkey/get отдается только тело pssh, которое Shaka packager сам приводит к виду pssh box. При реализации собственного запаковщика Вам нужно будет самостоятельно реализовать приведение к нужному виду, если вы планируете использовать совместимость с данным методом. Если вы хотите получать уже готовый pssh box, используйте SPEKE API (см. ниже).

Список идентификаторов DRM систем.

Shaka Packager + Fairplay + HLS playlist

Используйте следующий bash-скрипт для конвертации mp4 в HLS.

#!/usr/bin/env bash

# Проект из личного кабинета cdnnow!
project=""

# Ключ доступа из личного кабинета cdnnow!
token=""

# Идентификатор контента, уникальное для каждого вашего видео файла имя
contentId=""

# Идентификатор ключа шифрования
keyId=""

# Ключ шифрования, base64
keyBase64=""

# Начальный вектор ключа шифрования, base64
ivBase64=""

# Путь до исходного видео файла
videoSource="path/to/video.mp4"

# Путь до директории с результатами
outputFolder="path/to/output/folder"

# Shaka Packager

./packager \
in="$videoSource,stream=0,init_segment=$outputFolder/v0_init.m4v,segment_template=$outputFolder/v0_\$Number\$.m4v" \
in="$videoSource,stream=1,init_segment=$outputFolder/v1_init.m4v,segment_template=$outputFolder/v1_\$Number\$.m4v" \
in="$videoSource,stream=2,init_segment=$outputFolder/v2_init.m4v,segment_template=$outputFolder/v2_\$Number\$.m4v" \
in="$videoSource,stream=3,init_segment=$outputFolder/v3_init.m4v,segment_template=$outputFolder/v3_\$Number\$.m4v" \
in="$videoSource,stream=4,init_segment=$outputFolder/v4_init.m4v,segment_template=$outputFolder/v4_\$Number\$.m4v" \
in="$videoSource,stream=5,language=ru,init_segment=$outputFolder/a5_init.m4a,segment_template=$outputFolder/a5_\$Number\$.m4a" \
--segment_duration 6 \
--fragment_duration 6 \
--default_language ru \
--hls_master_playlist_output "$outputFolder/master.m3u8" \
--hls_playlist_type VOD \
--protection_scheme cbcs \
--enable_raw_key_encryption \
--protection_systems FairPlay \
--keys label=:key_id=${keyId//-/}:key=$(echo $keyBase64 | base64 -d | xxd -p) \
--iv $(echo $ivBase64 | base64 -d | xxd -p) \
--hls_key_uri skd://$contentId

Советы

Для получения значений переменных keyId, keyBase64, ivBase64 по contentId и keyId можно использовать SPEKE API V1 по адресу https://[project].nowdrm.co/drm/speke?token=[token].

Подробнее о SPEKE можно узнать в разделе Подготовка видео — SPEKE, а также на сайте AWS (разработчик формата)

В качестве keyBase64 следует использовать ContentKey.Data.Secret.PlainValue из ответа SPEKE, в качестве ivBase64 — атрибут explicitIV элемента ContentKey из ответа SPEKE. В качестве contentId рекомендуем использовать идентификатор контента, с которым были созданы ключи при обращении к SPEKE. Если вы планируете использовать бинарный формат запроса лицензии, в качестве contentId может быть взята произвольная строка, однако при запросах к серверу лицензии нужно будет указывать идентификатор контента, с которым ключи были исходно созданы. В ответе SPEKE для удобства также доступен base64-закодированный вариант идентификатора контента внутри элемента URIExtXKey.

Shaka Packager + Playready + MSS playlist

Используйте следующий bash-скрипт для конвертации mp4 в MSS.

#!/usr/bin/env bash

# Проект из личного кабинета cdnnow!
project=""

# Ключ доступа из личного кабинета cdnnow!
token=""

# Идентификатор контента, уникальное для каждого вашего видео файла имя
contentId=""

# Путь до исходного видео файла
videoSource="path/to/video.mp4"

# Путь до директории с результатами
outputFolder="path/to/output/folder"

# Shaka Packager With MSS support

./packager-mss \
in="$videoSource,stream=0,init_segment=$outputFolder/v0_init.m4v,segment_template=$outputFolder/v0_\$Number\$.m4v" \
in="$videoSource,stream=1,init_segment=$outputFolder/v1_init.m4v,segment_template=$outputFolder/v1_\$Number\$.m4v" \
in="$videoSource,stream=2,init_segment=$outputFolder/v2_init.m4v,segment_template=$outputFolder/v2_\$Number\$.m4v" \
in="$videoSource,stream=3,init_segment=$outputFolder/v3_init.m4v,segment_template=$outputFolder/v3_\$Number\$.m4v" \
in="$videoSource,stream=4,init_segment=$outputFolder/v4_init.m4v,segment_template=$outputFolder/v4_\$Number\$.m4v" \
in="$videoSource,stream=5,language=ru,init_segment=$outputFolder/a5_init.m4a,segment_template=$outputFolder/a5_\$Number\$.m4a" \
--segment_duration 6 \
--fragment_duration 6 \
--dvr_window_length 36 \
--default_language ru \
--duration 0 \
--segment_sap_aligned \
--fragment_sap_aligned \
--mss_client_manifest_output $outputFolder/manifest.ismc \
--enable_widevine_encryption \
--clear_lead 0 \
--protection_systems PlayReady \
--key_server_url "https://$project.nowdrm.co/v2/keyservice/contentkey/get?token=$token" \
--content_id "$(echo $contentId | xxd -p)" \
--license_acquisition_server_url https://[project].nowdrm.co/v2/playready \

Вам понадобится специальная сборка Shaka Packager с поддержкой MSS.
Для её получения напишите нам на электронную почту req@drmnow.ru.

Читайте также

Воспроизведение зашифрованного DRM видео.

↑ Наверх
Оставьте заявку

если вас заинтересовал наш сервис или есть вопросы

Напишите нам