В данной статье мы расскажем, как подготавливать (шифровать) видео для работы с multi-drm от drmnow! с помощью Shaka Packager.
Содержание статьи:
Используйте следующий 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)"
/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
соответственно.
ffprobe path/to/video.mp4
.
"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"
--protection-scheme cbcs \
--protection_systems Widevine,PlayReady \
на
--protection_systems Widevine,PlayReady,Wiseplay \
./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 систем.
Используйте следующий 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
.
Используйте следующий 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.