vod: VOD-пакет, основанный на NGINX
Установка на Debian/Ubuntu
Эти документы применимы к пакету APT nginx-module-vod, предоставляемому репозиторием GetPageSpeed Extras.
- Настройте репозиторий APT, как описано в настройке репозитория APT.
- Установите модуль:
sudo apt-get update
sudo apt-get install nginx-module-vod
Показать версии и архитектуры
| Distro | Suite | Component | Architectures |
|----------|-------------------|-------------|-----------------|
| debian | bookworm | main | amd64, arm64 |
| debian | bookworm-mainline | main | amd64, arm64 |
| debian | trixie | main | amd64, arm64 |
| debian | trixie-mainline | main | amd64, arm64 |
| ubuntu | focal | main | amd64, arm64 |
| ubuntu | focal-mainline | main | amd64, arm64 |
| ubuntu | jammy | main | amd64, arm64 |
| ubuntu | jammy-mainline | main | amd64, arm64 |
| ubuntu | noble | main | amd64, arm64 |
| ubuntu | noble-mainline | main | amd64, arm64 |
nginx-vod-module 
Присоединяйтесь к списку организаций, использующих этот проект видео-пакетирования.
Для потокового видео, пожалуйста, используйте Media-Framework.
Функции
-
Пакетирование MP4 файлов в DASH, HDS, HLS, MSS на лету
-
Режимы работы:
- Локально - служить локально доступным файлам (локальный диск/NFS)
- Удаленно - служить файлам, доступным через HTTP с использованием диапазонных запросов
-
Сопоставлено - служить файлами согласно спецификации, закодированной в формате JSON. JSON может быть получен с удалённого сервера или прочитан из локального файла
-
Поддержка адаптивной битрейт
-
Поддержка плейлистов (воспроизведение нескольких разных медиафайлов один за другим) - только для сопоставленного режима
-
Поддержка имитации живого контента (создание живого потока из MP4 файлов) - только для сопоставленного режима
-
Поддержка резервирования для файлов, не найденных в локальных/сопоставленных режимах (полезно в много-центровых средах)
-
Видеокодеки: H264, H265 (DASH/HLS), AV1 (DASH/HLS), VP8 (DASH), VP9 (DASH)
-
Аудиокодеки: AAC, MP3 (HLS/HDS/MSS), AC-3 (DASH/HLS), E-AC-3 (DASH/HLS), VORBIS (DASH), OPUS (DASH), FLAC (HLS), DTS (HLS)
-
Поддержка субтитров -
Вход: 1. WebVTT 2. SRT 3. DFXP/TTML 4. CAP (Cheetah)
Выход: 1. DASH - либо один WebVTT, либо сегменты SMPTE-TT (настраиваемый) 2. HLS - сегментированный WebVTT (m3u8) 3. MSS - конвертированный в TTML и упакованный в фрагментированный MP4 (без поддержки стилизации)
-
Только аудио/только видео файлы
-
Альтернативные аудиоверсии - поддерживают оба:
- Генерация манифеста с различными аудиоверсиями, позволяя выбор на стороне клиента
-
Смешивание аудио и видео потоков из отдельных файлов / треков - предоставляет возможность служить разные аудиоверсии одного видео, без необходимости в какой-либо специальной поддержке на клиентской стороне.
-
Выбор треков для многоаудио/видеофайлов MP4
-
Изменение скорости воспроизведения - от 0.5x до 2x (требуется libavcodec и libavfilter)
-
Обрезка исходного файла (только от I-кадра до P-кадра)
-
Поддержка переменной длины сегментов - позволяет плееру быстро выбрать оптимальный битрейт, без накладных расходов коротких сегментов на всю продолжительность видео
-
Обрезка MP4 файлов для воспроизведения по прогрессивной загрузке
-
Захват миниатюры (требуется libavcodec) и изменение размера (требуется libswscale)
-
Карта громкости (требуется libavcodec) - возвращает CSV, содержащий уровень громкости в каждом интервале
-
Дешифрование MP4 файлов, зашифрованных CENC (возможно создать такие файлы с помощью MP4Box)
-
DASH: поддержка общего шифрования (CENC)
-
MSS: поддержка шифрования PlayReady
-
HLS: Генерация плейлиста I-кадров (EXT-X-I-FRAMES-ONLY)
-
HLS: поддержка шифрования AES-128 / SAMPLE-AES
Ограничения
-
Выбор треков и изменение скорости воспроизведения не поддерживаются в прогрессивной загрузке
-
Генерация плейлистов I-кадров не поддерживается, когда шифрование включено
-
Тестировалось только на Linux
rpm -ihv http://installrepo.kaltura.org/releases/kaltura-release.noarch.rpm
yum install kaltura-nginx
#### Debian/Ubuntu deb пакет
*УПОМЯНУТЬ: перед попыткой установить kaltura-nginx, вы также должны убедиться, что репозиторий multiverse включен*
Для Debian Wheezy [7], Debian Jessie [8], Ubuntu 14.04 и 14.10 добавьте этот репозиторий:
```sh
## wget -O - http://installrepo.kaltura.org/repo/apt/debian/kaltura-deb-curr.gpg.key|apt-key add -
## echo "deb [arch=amd64] http://installrepo.kaltura.org/repo/apt/debian propus main" > /etc/apt/sources.list.d/kaltura.list
Для Ubuntu 16.04, 16.10 добавьте этот репозиторий:
## wget -O - http://installrepo.kaltura.org/repo/apt/xenial/kaltura-deb-curr-256.gpg.key|apt-key add -
## echo "deb [arch=amd64] http://installrepo.kaltura.org/repo/apt/xenial propus main" > /etc/apt/sources.list.d/kaltura.list
Для Ubuntu 20.04 добавьте этот репозиторий:
## wget -O - http://installrepo.kaltura.org/repo/aptn/focal/kaltura-deb-256.gpg.key|apt-key add -
## echo "deb [arch=amd64] http://installrepo.kaltura.org/repo/aptn/focal quasar main" > /etc/apt/sources.list.d/kaltura.list
Затем установите пакет kaltura-nginx:
## apt-get update
## apt-get install kaltura-nginx
Если вы хотите воспользоваться следующими функциями: - Захват миниатюры - Изменение скорости воспроизведения - от 0.5x до 2x
Вам также потребуется установить пакет kaltura-ffmpeg (>= 3.1).
Структура URL
Основная структура URL
Основная структура URL модуля nginx-vod-module:
http://<domain>/<location>/<fileuri>/<filename>
Где:
* domain - домен сервера модуля nginx-vod-module
* location - местоположение, указанное в конфигурации nginx
* fileuri - URI к mp4 файлу:
* локальный режим - полный путь к файлу определяется в соответствии с директивами root / alias в nginx.conf
* сопоставленный режим - полный путь к файлу определяется в соответствии с JSON, полученным от upstream / локального файла
* удаленный режим - mp4 файл читается из upstream по частям
* Примечание: в сопоставленных и удаленных режимах URL запроса upstream следующий: http://<upstream>/<location>/<fileuri>?<extraargs>
(extraargs определяется параметром vod_upstream_extra_args)
* filename - описано ниже
Многочисленная структура URL
Многочисленные URL используются для кодирования нескольких URL под одним URL. Многочисленный URL может быть использован для указания URL нескольких различных MP4 файлов, которые должны быть включены вместе в DASH MPD, например.
Структура многочисленного URL:
http://<domain>/<location>/<prefix>,<middle1>,<middle2>,<middle3>,<postfix>.urlset/<filename>
Пример URL выше представляет три URL:
* http://<domain>/<location>/<prefix><middle1><postfix>/<filename>
* http://<domain>/<location>/<prefix><middle2><postfix>/<filename>
* http://<domain>/<location>/<prefix><middle3><postfix>/<filename>
Суффикс .urlset (может быть изменён с помощью vod_multi_uri_suffix) указывает на то, что URL должен восприниматься как многочисленный URL.
Например - URL http://example.com/hls/videos/big_buck_bunny_,6,9,15,00k.mp4.urlset/master.m3u8 вернёт манифест, содержащий:
* http://example.com/hls/videos/big_buck_bunny_600k.mp4/index.m3u8
* http://example.com/hls/videos/big_buck_bunny_900k.mp4/index.m3u8
* http://example.com/hls/videos/big_buck_bunny_1500k.mp4/index.m3u8
Параметры пути URL
Поддерживаются следующие параметры на пути URL:
* clipFrom - смещение в миллисекундах с начала видео, с которого должен начаться сгенерированный поток.
Например, .../clipFrom/10000/... создаст поток, который начнётся через 10 секунд после начала видео.
* clipTo - смещение в миллисекундах с начала видео, на котором должен закончиться сгенерированный поток.
Например, .../clipTo/60000/... создаст поток, обрезанный до 60 секунд.
* tracks - может использоваться для выбора конкретных аудио/видео треков. Структура параметра:
v<id1>-v<id2>-a<id1>-a<id2>...
Например, .../tracks/v1-a1/... выберет первый видео и первый аудио трек.
По умолчанию включаются все треки.
* shift - может использоваться для применения сдвига времени к одному или нескольким потокам. Структура параметра:
v<vshift>-a<ashift>-s<sshift>
Например, .../shift/v100/... применит сдвиг вперёд на 100мс к временным меткам видео.
Структура имени файла
Структура имени файла:
<basename>[<seqparams>][<fileparams>][<trackparams>][<langparams>].<extension>
Где:
* basename + extension - набор параметров специфичен для упаковщика (ниже приводится список для стандартных настроек):
* dash - manifest.mpd
* hds - manifest.f4m
* hls master playlist - master.m3u8
* hls media playlist - index.m3u8
* mss - manifest
* thumb - thumb-<offset>[<resizeparams>].jpg (offset - это временной сдвиг миниатюры в миллисекундах)
* volume_map - volume_map.csv
* seqparams - может использоваться для выбора конкретных последовательностей по id (предоставленным в JSON сопоставлении), например, master-sseq1.m3u8.
* fileparams - может использоваться для выбора конкретных последовательностей по индексу при использовании многочисленных URL.
Например, manifest-f1.mpd вернёт MPD только из первого URL.
* trackparams - может использоваться для выбора конкретных аудио/видео треков.
Например, manifest-a1.f4m вернёт F4M, содержащий только первый аудиопоток каждой последовательности.
По умолчанию включаются первый аудио и первый видео треки каждого файла.
Треки, выбранные по имени файла AND-извлекаются с треками, выбранными с помощью параметра пути /tracks/.
v0/a0 выбор всех аудио/видео треков соответственно.
Параметры a/v могут комбинироваться с f/s, например, f1-v1-f2-a1 = видео1 файла1 + аудио1 файла2, f1-f2-v1 = видео1 файла1 + видео1 файла2.
* langparams - может использоваться для фильтрации аудиотреков/субтитров в зависимости от их языка (код ISO639-3).
Например, master-leng.m3u8 вернёт только аудиотреки на английском.
* resizeparams - может использоваться для изменения размера возвращаемого изображения миниатюры. Например, thumb-1000-w150-h100.jpg захватывает миниатюру
через 1 секунду после начала видео и изменяет размер до 150x100. Если какая-либо из размеров опущена, её значение устанавливается так, чтобы
результирующее изображение сохранило пропорции видеоизображения.
Формат ответа сопоставления
При настроенном режиме сопоставления, nginx-vod-module отправляет HTTP-запрос на настроенный upstream сервер для получения схемы медиа потоков, которые он должен сгенерировать. Ответ должен быть в формате JSON.
Этот раздел содержит несколько простых примеров, за которыми следует справочник поддерживаемых объектов и полей. Но сначала несколько определений:
Source Clip- набор аудиофреймов и/или видеокадров (треков), извлечённых из одного медиафайлаGenerator- компонент, который может генерировать аудио/видеофреймы. В настоящее время единственным поддерживаемым генератором является генератор тишины.Filter- манипуляция, которая может быть применена к аудио/видеофреймам. Поддерживаются следующие фильтры:- изменение скорости (темпа) - применяется как к аудио, так и к видео
- изменение громкости аудио
- смешивание - может использоваться для объединения нескольких аудиотреков, или для объединения аудио из источника A с видео из источника B
Clip- результат применения нуля или более фильтров к набору исходных клиповDynamic Clip- клип, содержание которого заранее неизвестно, например, таргетированное рекламное содержаниеSequence- набор клипов, которые должны воспроизводиться один за другим.Set- несколько последовательностей, которые воспроизводятся вместе как адаптивный набор, каждая последовательность должна иметь одинаковое количество клипов.
Простое сопоставление
JSON ниже сопоставляет URI запроса с одним MP4 файлом:
{
"sequences": [
{
"clips": [
{
"type": "source",
"path": "/path/to/video.mp4"
}
]
}
]
}
При использовании многочисленных URL это единственный разрешённый шаблон JSON. Другими словами, невозможно объединить более сложные JSON-структуры с использованием многочисленного URL.
Адаптивный набор
В качестве альтернативы использованию многочисленного URL, адаптивный набор может быть определён через JSON:
{
"sequences": [
{
"clips": [
{
"type": "source",
"path": "/path/to/bitrate1.mp4"
}
]
},
{
"clips": [
{
"type": "source",
"path": "/path/to/bitrate2.mp4"
}
]
}
]
}
Плейлист
JSON ниже воспроизведёт 35 секунд video1, за которым последует 22 секунды video2:
{
"durations": [ 35000, 22000 ],
"sequences": [
{
"clips": [
{
"type": "source",
"path": "/path/to/video1.mp4"
},
{
"type": "source",
"path": "/path/to/video2.mp4"
}
]
}
]
}
Фильтры
JSON ниже берёт video1, воспроизводит его на скорости x1.5 и смешивает аудио результата с аудио video2, после его уменьшения до 50% громкости:
{
"sequences": [
{
"clips": [
{
"type": "mixFilter",
"sources": [
{
"type": "rateFilter",
"rate": 1.5,
"source": {
"type": "source",
"path": "/path/to/video1.mp4"
}
},
{
"type": "gainFilter",
"gain": 0.5,
"source": {
"type": "source",
"path": "/path/to/video2.mp4",
"tracks": "a1"
}
}
]
}
]
}
]
}
Непрерывная трансляция
JSON ниже является образцом непрерывной живой трансляции (=живая трансляция, в которой все видео имеют точно такие же параметры кодирования). На практике этот JSON должен быть сгенерирован каким-либо скриптом, так как он зависит от времени. (см. test/playlist.php для примерной реализации)
{
"playlistType": "live",
"discontinuity": false,
"segmentBaseTime": 1451904060000,
"firstClipTime": 1451917506000,
"durations": [83000, 83000],
"sequences": [
{
"clips": [
{
"type": "source",
"path": "/path/to/video1.mp4"
},
{
"type": "source",
"path": "/path/to/video2.mp4"
}
]
}
]
}
Непрерывная живой трансляции
JSON ниже является примером непостоянной живой трансляции (=живая трансляция, в которой видео имеют разные параметры кодирования). На практике, этот JSON должен быть сгенерирован каким-либо скриптом, так как он зависит от времени (см. test/playlist.php для примерной реализации)
{
"playlistType": "live",
"discontinuity": true,
"initialClipIndex": 171,
"initialSegmentIndex": 153,
"firstClipTime": 1451918170000,
"durations": [83000, 83000],
"sequences": [
{
"clips": [
{
"type": "source",
"path": "/path/to/video1.mp4"
},
{
"type": "source",
"path": "/path/to/video2.mp4"
}
]
}
]
}
Справочник сопоставления
Set (объект верхнего уровня в JSON сопоставлении)
Обязательные поля:
* sequences - массив объектов последовательности.
Сопоставление должно содержать как минимум одну последовательность и до 32 последовательностей.
Необязательные поля:
* id - строка, идентифицирующая набор. Идентификатор можно получить с помощью $vod_set_id.
* playlistType - строка, может быть установлена в live, vod или event (поддерживается только для HLS плейлистов), по умолчанию vod.
* durations - массив целых чисел, представляющих продолжительность клипов в миллисекундах.
Это поле является обязательным, если сопоставление содержит более одного клипа на последовательность.
Если указано, этот массив должен содержать по крайней мере один элемент и до 128 элементов.
* discontinuity - логическое значение, указывающее, имеют ли разные клипы в каждой последовательности
разные медиапараметры. Это поле имеет разные проявления в зависимости от
протокола доставки - значение true сгенерирует #EXT-X-DISCONTINUITY в HLS,
и многопериодный MPD в DASH. Значение по умолчанию - true, установите в false только если медиапро
дукты были перекодированы с точно такими же параметрами (например, для AVC
клипы должны иметь точно один и тот же SPS/PPS).
* segmentDuration - целое число, задающее продолжительность сегмента в миллисекундах. Это поле, если указано, имеет приоритет над значением, установленным в vod_segment_duration.
* consistentSequenceMediaInfo - логическое значение, в настоящее время влияет только на DASH. Когда установлено в true (по умолчанию)
MPD будет сообщать о тех же медиапараметрах в каждом элементе периода. Установка в false может иметь серьезные последствия для производительности при длинных последовательностях (nginx-vod-module должен
читать медиапараметры всех клипов, включенных в сопоставление, чтобы сгенерировать MPD)
* referenceClipIndex - целое число, устанавливающее (индекс на основе 1) клипа, который должен быть использован
для получения метаданных видео для запросов манифеста (кодек, ширина, высота и т.д.)
Если consistentSequenceMediaInfo установлено в false, этот параметр неэффективен -
все клипы парсятся. Если этот параметр не указан, nginx-vod-module использует последний клип
по умолчанию.
* notifications - массив объектов уведомлений (см. ниже), когда запрашивается сегмент,
все уведомления, которые попадают между началом и концом времени сегмента, срабатывают.
Уведомления должны быть упорядочены в порядке увеличения смещения.
* clipFrom - целое число, содержит отметку времени, указывающую, с какого момента должен начинаться возвращаемый поток.
Установка этого параметра эквивалентна передаче /clipFrom/ в URL.
* clipTo - целое число, содержит отметку времени, указывающую, где должен заканчиваться возвращаемый поток.
Установка этого параметра эквивалентна передаче /clipTo/ в URL.
* cache - логическое значение, если установлено в false, ответ сопоставления не будет сохранён в кэше (vod_mapping_cache).
Значение по умолчанию - true.
* closedCaptions - массив объектов закрытых субтитров (см. ниже), содержащих языки и идентификаторы
любых встроенных CEA-608 / CEA-708 субтитров. Если предоставлен пустой массив, модуль выведет
CLOSED-CAPTIONS=NONE на каждом теге EXT-X-STREAM-INF. Если список не появляется в JSON,
модуль не выведет никаких полей CLOSED-CAPTIONS в плейлисте.
Поля для живых:
* firstClipTime - целое число, обязательно для всех живых плейлистов, если не указаны clipTimes.
Содержит абсолютное время первого клипа в плейлисте, в миллисекундах с начала эпохи (unixtime x 1000)
* clipTimes - массив целых чисел, устанавливающий абсолютное время всех клипов в плейлисте,
в миллисекундах с начала эпохи (unixtime x 1000). Это поле может использоваться только когда
discontinuity установлено в true. Отметки времени могут содержать пробелы, однако они не могут перекрыватся
(clipTimes[n + 1] >= clipTimes[n] + durations[n])
* segmentBaseTime - целое число, обязательно для непрерывных живых потоков, содержит абсолютное
время первого сегмента потока, в миллисекундах с начала эпохи (unixtime x 1000).
Эта величина не должна изменяться во время воспроизведения.
Для непостоянных живых потоков это поле является необязательным:
* если не установлено, будут использоваться последовательные индексы сегментов во всём плейлисте.
В этом случае upstream сервер, генерирующий JSON сопоставления, должен поддерживать состояние,
и обновлять initialSegmentIndex каждый раз, когда клип удаляется из плейлиста.
* если установлено, временные пробелы между клипами не должны быть меньше, чем vod_segment_duration.
* firstClipStartOffset - целое число, необязательное, измеряется в миллисекундах. Это поле содержит
разницу между временем первого клипа и оригинальным временем начала первого клипа -
временем, которое он имел, когда он был первоначально добавлен (до сдвига живого окна)
* initialClipIndex - целое число, обязательно для непостоянных живых потоков, которые смешивают видео имеющие
разные параметры кодирования (SPS/PPS), содержит индекс первого клипа в плейлисте.
Каждый раз, когда клип выталкивается из начала плейлиста, это значение должно увеличиваться на единицу.
* initialSegmentIndex - целое число, обязательно для живых потоков, которые не устанавливают segmentBaseTime,
содержит индекс первого сегмента в плейлисте. Каждый раз, когда клип выталкивается из начала
плейлиста, это значение должно увеличиваться на количество сегментов в клипе.
* presentationEndTime - целое число, необязательное, измеряется в миллисекундах с начала эпохи.
Когда оно предоставляется, модуль сравнивает текущее время с данным значением,
и сигнализирует о конце текущей живой презентации, если presentationEndTime уже прошло.
В HLS, например, этот параметр контролирует, будет ли тег #EXT-X-ENDLIST
включён в медиа плейлист.
Когда параметр не предоставляется, модуль не сигнализирует о завершении живой презентации.
* expirationTime - целое число, необязательное, измеряется в миллисекундах с начала эпохи.
Когда оно предоставляется, модуль сравнивает текущее время с данным значением,
и если expirationTime прошло, модуль вернёт ошибку 404 для запросов манифестов
(запросы сегментов продолжат обрабатываться).
Когда как presentationEndTime, так и expirationTime прошли, priority нужно отдать presentationEndTime, т.е. запросы манифестов будут обработаны и будет сигнализироваться окончание презентации.
* liveWindowDuration - целое число, необязательное, предоставляет способ переопределить vod_live_window_duration
указанную в конфигурации. Если значение превышает абсолютное значение, указанное в
vod_live_window_duration, оно игнорируется.
* timeOffset - целое число, устанавливающее сдвиг, который должен применяться к серверным часам при обслуживании
живых запросов. Этот параметр может использоваться для тестирования будущих/прошлых событий.
Последовательность
Обязательные поля:
* clips - массив объектов Clip (обязательный). Количество элементов должно совпадать с количеством
указанных в массиве длительностей. Если массив длительностей не указан,
массив клипов должен содержать один элемент.
Необязательные поля:
* id - строка, идентифицирующая последовательность. Идентификатор можно получить с помощью $vod_sequence_id.
* language - 3-буквенный (ISO-639-2) код языка, это поле имеет приоритет над любым языком
указанным в медиафайле (MP4 mdhd atom)
* label - дружелюбная строка, идентифицирующая последовательность. Если язык указан,
дефолтная метка будет автоматически извлечена из неё - например, если язык - это ita,
по умолчанию будет использоваться italiano как метка.
* bitrate - объект, который может использоваться для установки битрейта для различных типов медиакодеков,
в битах в секунду. Например, {"v": 900000, "a": 64000}. Если битрейт не указан,
nginx-vod-module оценит его на основе последнего клипа в последовательности.
* avg_bitrate - объект, который может использоваться для установки среднего битрейта для различных типов медиакодеков,
в битах в секунду. Смотрите bitrate выше для образца объекта. Если указано, модуль будет использовать
значение для заполнения атрибута AVERAGE-BANDWIDTH в #EXT-X-STREAM-INF в HLS.
Клипы (абстрактные)
Обязательные поля:
* type - строка, определяющая тип клипа. Разрешённые значения:
* source
* rateFilter
* mixFilter
* gainFilter
* silence
* concat
* dynamic
Необязательные поля:
* keyFrameDurations - массив целых чисел, содержащий длительности в миллисекундах видеокадров ключевых кадров
в клипе. Это свойство может быть предоставлено только на верхнем уровне клипов каждой последовательности,
указание этого свойства на вложенных клипах не повлияет на результат.
Указание длительности ключевых кадров позволяет модулю как:
1. выравнивать сегменты по ключевым кадрам
2. сообщать корректные длительности сегментов в манифесте - предоставляя альтернативу установке
vod_manifest_segment_durations_mode на accurate, что не поддерживается для комплектов медиакодеков из нескольких клипов (по причинам производительности).
* firstKeyFrameOffset - целое число, смещение первого ключевого видео кадра в клипе,
измеряется в миллисекундах относительно firstClipTime. По умолчанию 0, если не указано.
Исходный клип
Обязательные поля:
* type - строка со значением source
* path - строка, содержащая путь к MP4 файлу. Строку "empty" можно использовать для обозначения
пустого файла субтитров (полезно в случае, когда только некоторые видео в плейлисте содержат субтитры)
Необязательные поля:
* id - строка, идентифицирующая исходный клип
* sourceType - задаёт интерфейс, который должен использоваться для чтения MP4 файла, разрешённые значения:
file и http. По умолчанию модуль использует http, если vod_remote_upstream_location установлен,
и file в противном случае.
* tracks - строка, которая указывает, какие треки должны использоваться, по умолчанию это "v1-a1",
что означает первый аудиотрек и первый аудиотрек.
* clipFrom - целое число, которое определяет смещение в миллисекундах от начала
медиафайла, с которого нужно начинать загружать кадры.
* encryptionKey - строка, закодированная в base64, содержащая ключ (128/192/256 бит), который должен использоваться
для дешифрования файла.
* encryptionIv - строка, закодированная в base64, содержащая iv (128 бит), который должен использоваться
для дешифрования файла.
* encryptionScheme - схема шифрования, которая использовалась для шифрования файла. В настоящее время,
поддерживаются только две схемы - cenc для MP4 файлов, aes-cbc для файлов с субтитрами.
Клипы фильтров
Обязательные поля:
* type - строка со значением rateFilter
* rate - число с плавающей запятой, указывающее коэффициент ускорения, например, значение 2 означает двойную скорость.
Разрешённые значения: от 0.5 до 2 с двумя десятичными знаками.
* source - объект клипа, на котором будет применяться фильтрация по скорости.
Клипы для фильтров громкости
Обязательные поля:
* type - строка со значением gainFilter
* gain - число с плавающей запятой, указывающее коэффициент усиления, например, значение 2 означает вдвое громче.
Громкость должна быть положительной с двумя десятичными знаками.
* source - объект клипа, на котором будет применяться фильтрация громкости.
Клипы смешивания
Обязательные поля:
* type - строка со значением mixFilter
* sources - массив объектов Clip для смешивания. Этот массив должен содержать как минимум один клип и
до 32 клипов.
Конкатенация клипа
Обязательные поля:
* type - строка со значением concat
* durations - массив целых чисел, представляющих длительности MP4 в миллисекундах,
этот массив должен совпадать с массивом paths по количеству и порядку.
Необязательные поля:
* paths - массив строк, содержащих пути к MP4 файлам. Либо paths, либо clipIds должны быть указаны.
* clipIds - массив строк, содержащий идентификаторы исходных клипов.
Идентификаторы преобразуются в пути с помощью запроса к URI, указанному в vod_source_clip_map_uri.
Либо paths, либо clipIds должны быть указаны.
* tracks - строка, указывающая, какие треки должны использоваться, по умолчанию это "v1-a1",
что означает первый видео трек и первый аудиотрек.
* offset - целое число в миллисекундах, указывающее временную метку первого кадра в
конкатенированном потоке относительно времени начала клипа.
* basePath - строка, которая будет добавлена в качестве префикса ко всем путям.
* notifications - массив объектов уведомлений (см. ниже), когда запрашивается сегмент,
все уведомления, которые попадают между началом и концом времени сегмента, срабатывают.
Уведомления должны быть упорядочены в порядке увеличения смещения.
Динамический клип
Обязательные поля:
* type - строка со значением dynamic
* id - строка, которая уникально идентифицирует динамический клип, используется для сопоставления клипа с его содержимым.
Уведомление
Обязательные поля:
* offset - целое число в миллисекундах, указывающее время, в которое уведомление должно быть сгенерировано.
Когда объект уведомления содержится в наборе медиа, offset относится к firstClipTime
(0 для vod). Когда объект уведомления содержится в конкатенированном клипе, offset относится к
началу конкатенированного клипа.
* id - строка, идентифицирующая уведомление, этот идентификатор может быть обращен к vod_notification_uri
с использованием переменной $vod_notification_id.
Закрытые субтитры
Обязательные поля:
* id - строка, идентифицирующая встроенные субтитры. Это станет полем INSTREAM-ID и должно
иметь одно из следующих значений: CC1, CC3, CC3, CC4, или SERVICEn, где n находится между 1 и 63.
* label - дружелюбная строка, указывающая язык дорожки закрытых субтитров.
Необязательные поля:
* language - 3-буквенный (ISO-639-2) код языка, указывающий язык дорожки закрытых субтитров.
Безопасность
Шифрование URL
В качестве альтернативы токенизации, шифрование URL может быть использовано для предотвращения возможности злоумышленника создавать воспроизводимый URL. Шифрование URL может быть реализовано с помощью https://github.com/kaltura/nginx-secure-token-module и поддерживается для HLS и DASH (с форматом манифеста, установленным на segmentlist).
С точки зрения безопасности, основное преимущество CDN токенов перед шифрованием URL в том, что CDN токены обычно истекают, в то время как зашифрованные URL - нет (кто-то, кто получает воспроизводимый URL, сможет использовать его без ограничения по времени)
Шифрование медиа
Nginx-vod-module поддерживает схемы шифрования HLS AES-128 и SAMPLE-AES. Основное различие между шим шифрованием медиа и DRM (подробности ниже) заключается в механизме, используемом для передачи ключа шифрования клиенту. При шифровании медиа ключ извлекается клиентом, выполняя простой GET-запрос к nginx-vod-module, в то время как с DRM ключ возвращается внутри специфического для поставщика лицензионного ответа.
Шифрование медиа сводит проблему безопасности медиа к необходимости защитить ключ шифрования. Сегменты медиа URL (которые составляют подавляющее большинство трафика) могут быть совершенно незащищёнными, и легко кешируемыми любыми прокси между клиентом и серверами (в отличие от токенизации). Запрос ключа шифрования может быть затем защищён с использованием одного из методов, упомянутых выше (CDN токены, правила доступа nginx и т.д.).
Кроме того, возможно настроить nginx-vod-module, чтобы вернуть ключ шифрования по HTTPS,
в то время как сегменты доставляются по HTTP. Способ конфигурации заключается в установке vod_segments_base_url
на http://nginx-vod-host и установки vod_base_url на https://nginx-vod-host.
DRM
Nginx-vod-module может выполнять шифрование на лету для MPEG DASH (CENC), MSS Play Ready и FairPlay HLS. Как и в случае с шифрованием медиа, шифрование выполняется во время обслуживания сегмента видео/аудио клиенту, поэтому при работе с DRM рекомендуется не обслуживать контент непосредственно из nginx-vod-module конечным пользователям. Более масштабируемая архитектура будет заключаться в использовании прокси-серверов или CDN для кэширования зашифрованных сегментов.
Для выполнения шифрования nginx-vod-module требуется несколько параметров, включая key & key_id, эти параметры
извлекаются с удалённого сервера с помощью HTTP GET запросов.
Параметр vod_drm_upstream_location указывает местоположение nginx, которое используется для доступа к серверу DRM,
а URI запроса настраивается с помощью vod_drm_request_uri (этот параметр может включать переменные nginx).
Ответ сервера DRM имеет формат JSON, следующий:
[{
"pssh": [{
"data": "CAESEGMyZjg2MTczN2NjNGYzODIaB2thbHR1cmEiCjBfbmptaWlwbXAqBVNEX0hE",
"uuid": "edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"
}],
"key": "GzoNU9Dfwc//Iq3/zbzMUw==",
"key_id": "YzJmODYxNzM3Y2M0ZjM4Mg=="
}]
pssh.data- base64 закодированные бинарные данные, формат этих данных специфичен для поставщика DRMpssh.uuid- UUID системы DRM, в данном случае, edef8ba9-79d6-4ace-a3c8-27dcd51d21ed обозначает Widevinekey- base64 закодированный ключ шифрования (128 бит)key_id- base64 закодированный идентификатор ключа (128 бит)iv- необязательный base64 закодированный вектор инициализации (128 бит). Вектор инициализации в настоящее время используется только в HLS (FairPlay), в других протоколах вектор инициализации создаётся автоматически модулем nginx-vod-module.
Примеры конфигураций
Apple FairPlay HLS:
location ~ ^/fpshls/p/\d+/(sp/\d+/)?serveFlavor/entryId/([^/]+)/(.*) {
vod hls;
vod_hls_encryption_method sample-aes;
vod_hls_encryption_key_uri "skd://entry-$2";
vod_hls_encryption_key_format "com.apple.streamingkeydelivery";
vod_hls_encryption_key_format_versions "1";
vod_drm_enabled on;
vod_drm_request_uri "/udrm/system/ovp/$vod_suburi";
vod_last_modified_types *;
add_header Access-Control-Allow-Headers '*';
add_header Access-Control-Expose-Headers 'Server,range,Content-Length,Content-Range';
add_header Access-Control-Allow-Methods 'GET, HEAD, OPTIONS';
add_header Access-Control-Allow-Origin '*';
expires 100d;
}
Общее шифрование HLS:
location ~ ^/cenchls/p/\d+/(sp/\d+/)?serveFlavor/entryId/([^/]+)/(.*) {
vod hls;
vod_hls_encryption_method sample-aes-cenc;
vod_hls_encryption_key_format "urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed";
vod_hls_encryption_key_format_versions "1";
vod_drm_enabled on;
vod_drm_request_uri "/udrm/system/ovp/$vod_suburi";
vod_last_modified_types *;
add_header Access-Control-Allow-Headers '*';
add_header Access-Control-Expose-Headers 'Server,range,Content-Length,Content-Range';
add_header Access-Control-Allow-Methods 'GET, HEAD, OPTIONS';
add_header Access-Control-Allow-Origin '*';
expires 100d;
}
Проверенные конфигурации
Следующий список конфигураций, которые были протестированы и признаны рабочими: * DASH/CENC с PlayReady & Widevine PSSH вместе * MSS PlayReady * HLS FairPlay
Рекомендации по производительности
-
Для средних/больших развертываний, не позволяйте пользователям воспроизводить видео непосредственно из модуля nginx-vod-module. Поскольку все различные протоколы стриминга, поддерживаемые nginx vod, основаны на HTTP, их можно кэшировать стандартными HTTP прокси / CDN. Для средних развертываний добавьте слой кэширования прокси между модулем vod и конечными пользователями (можно использовать стандартные серверы nginx с proxy_pass & proxy_cache). Для больших развертываний рекомендуется использовать CDN (например, Akamai, Level3 и т.д.).
В общем, лучше всего, чтобы nginx vod был как можно ближе к тому, где хранится mp4 файлы, и чтобы кэшируемые прокси были как можно ближе к конечным пользователям. 2. Включите кэши модуля nginx-vod-module: *
vod_metadata_cache- избавляет от необходимости повторно считывать метаданные видео для каждого сегмента. Этот кэш должен быть достаточно большим, порядка гигабайтов. *vod_response_cache- сохраняет ответы запросов манифеста. Этот кэш может не быть необходимым, когда используется второй слой кэширования серверов перед nginx vod. Нет необходимости выделять большой кэш под этот кэш, 128Мб вероятно будет более чем достаточно для большинства развертываний. *vod_mapping_cache- только для сопоставленного режима, несколько Мб, как правило, достаточно. * open_file_cache nginx - кэширует открытые дескрипторы файлов.Коэффициенты попадания/промахов этих кэшей могут отслеживаться путём включения счётчиков производительности (
vod_performance_counters) и настройки страницы статуса для nginx vod (vod_status) 3. В локальных и сопоставленных режимах включите aio. - nginx должен быть скомпилирован с поддержкой aio, и это должно быть включено в конфигурации nginx (aio on). Вы можете проверить, работает ли это, посмотрев на счётчики производительности на странице статуса vod - read_file (aio off) против async_read_file (aio on) 4. В локальных и сопоставленных режимах включите асинхронное открытие файлов - nginx должен быть скомпилирован с поддержкой потоков, иvod_open_file_thread_poolдолжен быть указан в nginx.conf. Вы можете проверить это, посмотрев на счётчики производительности на странице статуса vod - open_file против async_open_file. Обратите внимание, что open_file может быть ненулевым при включении vod_open_file_thread_pool, из-за кэша открытых файлов - открытые запросы, которые обслуживаются из кэша, будут засчитаны как синхронные open_file. 5. При использовании DASH/MSS с включённым DRM, если видеофайлы имеют один nalu на каждый кадр, установитеvod_min_single_nalu_per_frame_segmentв ненулевое значение. 6. Накладные расходы поmuxing потоков, сгенерированных этим модулем, могут быть снижены при изменении следующих параметров: * HDS - установитеvod_hds_generate_moof_atomв off * HLS - установитеvod_hls_mpegts_align_framesв off иvod_hls_mpegts_interleave_framesв on 7. Включите сжатие gzip для ответов манифеста -gzip_types application/vnd.apple.mpegurl video/f4m application/dash+xml text/xml8. Применяйте общие рекомендации по производительности nginx, такие как tcp_nodelay=on, client_header_timeout и т.д.
Директивы конфигурации - база
vod
- синтаксис:
vod segmenter - умолчание:
n/a - контекст:
location
Включает модуль nginx-vod в окружающее местоположение.
Разрешённые значения для segmenter:
none- обслуживает MP4 файлы как есть / обрезанныеdash- Динамическая адаптивная трансляция по HTTPhds- Упаковщик Adobe HTTP Dynamic Streaminghls- Упаковщик Apple HTTP Live Streamingmss- Упаковщик Microsoft Smooth Streamingthumb- захват миниатюрыvolume_map- карта громкости аудио
vod_mode
- синтаксис:
vod_mode mode - умолчание:
local - контекст:
http,server,location
Устанавливает режим доступа к файлам - локально, удаленно или сопоставлено (см. раздел функций выше для дополнительных сведений)
vod_status
- синтаксис:
vod_status - умолчание:
n/a - контекст:
location
Включает страницу статуса nginx-vod в окружающее местоположение.
Поддерживаются следующие параметры запроса:
* ?reset=1 - сбрасывает счётчики производительности и статистику кэша.
* ?format=prom - возвращает вывод в формате, совместимом с Prometheus (формат по умолчанию - XML).
Директивы конфигурации - сегментация
vod_segment_duration
- синтаксис:
vod_segment_duration duration - умолчание:
10s - контекст:
http,server,location
Устанавливает продолжительность сегмента в миллисекундах. Настоятельно рекомендуется использовать продолжительность сегмента, равную кратному значению GOP.
Если продолжительность сегмента не является кратной продолжительности GOP, и vod_align_segments_to_key_frames включен, могут быть значительные
различия между продолжительностью сегмента, сообщаемой в манифесте, и фактической продолжительностью сегмента. Это также может привести к
появлению пустых сегментов в потоке.
vod_live_window_duration
- синтаксис:
vod_live_window_duration duration - умолчание:
30000 - контекст:
http,server,location
Устанавливает общую продолжительность в миллисекундах сегментов, которые должны быть возвращены в живом манифесте.
Если значение положительное, nginx vod возвращает диапазон максимальных vod_live_window_duration миллисекунд, заканчивающийся на текущем серверном времени.
Если значение отрицательное, nginx vod возвращает диапазон максимальных -vod_live_window_duration миллисекунд из конца JSON сопоставления.
Если значение установлено в ноль, живой манифест будет содержать все сегменты, которые полностью содержатся в временном диапазоне JSON сопоставления.
vod_force_playlist_type_vod
- синтаксис:
vod_force_playlist_type_vod on/off - умолчание:
off - контекст:
http,server,location
Генерирует vod поток даже когда медиа набор имеет playlistType=live.
Включение этой настройки имеет следующие эффекты:
1. Временные метки кадров будут непрерывными и начинаться с нуля
2. Индексы сегментов будут начинаться с единицы
3. В случае HLS, возвращаемый манифест будет иметь как #EXT-X-PLAYLIST-TYPE:VOD, так и #EXT-X-ENDLIST
Это может быть полезно для вырезания vod частей из живого потока.
vod_force_continuous_timestamps
- синтаксис:
vod_force_continuous_timestamps on/off - умолчание:
off - контекст:
http,server,location
Генерировать непрерывные временные метки, даже когда медиа-набор имеет пробелы (пробелы могут быть созданы с помощью clipTimes)
Если временные метки ID3 включены (vod_hls_mpegts_output_id3_timestamps), они содержат оригинальные временные метки, которые были установлены в clipTimes.
vod_bootstrap_segment_durations
- синтаксис:
vod_bootstrap_segment_durations duration - умолчание:
none - контекст:
http,server,location
Добавляет длительность сегмента начальной загрузки в миллисекундах. Эта установка может быть использована для сокращения первых нескольких сегментов меньше, чем по умолчанию продолжительность сегмента, тем самым заставляя адаптивный выбор битрейта вступить в силу раньше без накладных расходов коротких сегментов на протяжении всего видео.
vod_align_segments_to_key_frames
- синтаксис:
vod_align_segments_to_key_frames on/off - умолчание:
off - контекст:
http,server,location
При включении модуль заставляет все сегменты начинаться с ключевого кадра. Включение этой настройки может привести к различиям
между фактическими длительностями сегментов и продолжительностями, сообщаемыми в манифесте (если vod_manifest_segment_durations_mode установлен на accurate).
vod_segment_count_policy
- синтаксис:
vod_segment_count_policy last_short/last_long/last_rounded - умолчание:
last_short - контекст:
http,server,location
Настраивает политику для расчёта количества сегментов, для segment_duration = 10 секунд: * last_short - файл продолжительностью 33 сек разбивается на - 10, 10, 10, 3 * last_long - файл продолжительностью 33 сек разбивается на - 10, 10, 13 * last_rounded - файл продолжительностью 33 сек разбивается на - 10, 10, 13, файл продолжительностью 38 сек разбивается на 10, 10, 10, 8
vod_manifest_duration_policy
- синтаксис:
vod_manifest_duration_policy min/max - умолчание:
max - контекст:
http,server,location
Настраивает политику для расчёта продолжительности манифеста, содержащего несколько потоков: * max - использует максимальную продолжительность потока (по умолчанию) * min - использует минимальную ненулевую продолжительность потока
vod_manifest_segment_durations_mode
- синтаксис:
vod_manifest_segment_durations_mode estimate/accurate - умолчание:
estimate - контекст:
http,server,location
Настраивает режим расчета длительности сегментов в запросах манифеста:
* estimate - сообщает длительность, как настроено в nginx.conf, например, если vod_segment_duration имеет значение 10000,
манифест HLS будет содержать #EXTINF:10
* accurate - сообщает точную длительность сегмента, с учётом длительностей кадров, например, для
частоты кадров 29.97 и 10-секундных сегментов он будет сообщать первый сегмент как 10.01. режим accurate также
учитывает выравнивание ключевых кадров, если параметр vod_align_segments_to_key_frames включён.
vod_media_set_override_json
- синтаксис:
vod_media_set_override_json json - умолчание:
{} - контекст:
http,server,location
Этот параметр предоставляет способ переопределить части JSON медиа-набора (только сопоставленный режим).
Например, vod_media_set_override_json '{"clipTo":20000}' обрезает медиа набор до 20 сек.
Значение параметра может содержать переменные.
Директивы конфигурации - upstream
vod_upstream_location
- синтаксис:
vod_upstream_location location - умолчание:
none - контекст:
http,server,location
Устанавливает местоположение nginx, которое используется для чтения MP4 файла (удалённый режим) или сопоставления запрашиваемого URI (сопоставленный режим).
vod_remote_upstream_location
- синтаксис:
vod_remote_upstream_location location - умолчание:
none - контекст:
http,server,location
Устанавливает местоположение nginx, которое используется для чтения MP4 файла в удалённом или сопоставленном режиме. Если эта директива установлена в сопоставленном режиме, модуль читает MP4 файлы по HTTP, рассматривая пути в JSON сопоставлении как URI (поведение по умолчанию - читать из локальных файлов)
vod_max_upstream_headers_size
- синтаксис:
vod_max_upstream_headers_size size - умолчание:
4k - контекст:
http,server,location
Устанавливает размер, выделяемый для хранения заголовков ответа при отправке upstream запросов (к vod_xxx_upstream_location).
vod_upstream_extra_args
- синтаксис:
vod_upstream_extra_args "arg1=value1&arg2=value2&..." - умолчание:
пусто - контекст:
http,server,location
Дополнительные аргументы строки запроса, которые должны быть добавлены к upstream запросу (только удалённый/сопоставленный режим). Значение параметра может содержать переменные.
vod_media_set_map_uri
- синтаксис:
vod_media_set_map_uri uri - умолчание:
$vod_suburi - контекст:
http,server,location
Устанавливает URI запросов сопоставления медиа-набора, значение параметра может содержать переменные.
В случае многочисленного URL, $vod_suburi будет текущим под-URI (отдельный запрос создаётся для каждого под URL)
vod_path_response_prefix
- синтаксис:
vod_path_response_prefix prefix - умолчание:
{"sequences":[{"clips":[{"type":"source","path":" - контекст:
http,server,location
Устанавливает префикс, который ожидается в ответах URI сопоставления (только сопоставленный режим).
vod_path_response_postfix
- синтаксис:
vod_path_response_postfix postfix - умолчание:
"}]}]} - контекст:
http,server,location
Устанавливает постфикс, который ожидается в ответах URI сопоставления (только сопоставленный режим).
vod_max_mapping_response_size
- синтаксис:
vod_max_mapping_response_size length - умолчание:
1K - контекст:
http,server,location
Устанавливает максимальную длину пути, возвращаемого от upstream (только сопоставленный режим).
Директивы конфигурации - резервирование
vod_fallback_upstream_location
- синтаксис:
vod_fallback_upstream_location location - умолчание:
none - контекст:
http,server,location
Устанавливает местоположение nginx, к которому запрос перенаправляется после возникновения ошибки "файл не найден" (локальные/сопоставленные режимы).
vod_proxy_header_name
- синтаксис:
vod_proxy_header_name name - умолчание:
X-Kaltura-Proxy - контекст:
http,server,location
Устанавливает имя HTTP заголовка, который используется для предотвращения циклов резервирования прокси (локальные/сопоставленные режимы).
vod_proxy_header_value
- синтаксис:
vod_proxy_header_value name - умолчание:
dumpApiRequest - контекст:
http,server,location
Устанавливает значение HTTP заголовка, который используется для предотвращения циклов резервирования прокси (локальные/сопоставленные режимы).
Директивы конфигурации - производительность
vod_metadata_cache
- синтаксис:
vod_metadata_cache zone_name zone_size [expiration] - умолчание:
off - контекст:
http,server,location
Конфигурирует размер и имя общего объекта памяти для кэша метаданных видео. Для MP4 файлов этот кэш хранит атом moov.
vod_mapping_cache
- синтаксис:
vod_mapping_cache zone_name zone_size [expiration] - умолчание:
off - контекст:
http,server,location
Конфигурирует размер и имя общего объекта памяти для кэша сопоставлений для vod (только сопоставленный режим).
vod_live_mapping_cache
- синтаксис:
vod_live_mapping_cache zone_name zone_size [expiration] - умолчание:
off - контекст:
http,server,location
Конфигурирует размер и имя общего объекта памяти для кэша сопоставлений для live (только сопоставленный режим).
vod_response_cache
- синтаксис:
vod_response_cache zone_name zone_size [expiration] - умолчание:
off - контекст:
http,server,location
Конфигурирует размер и имя общего объекта памяти для кэша ответов. Кэш ответов хранит манифесты и другой немедийный контент (например, сегмент инициализации DASH, ключ шифрования HLS и т.д.). Видеосегменты не кэшируются.
vod_live_response_cache
- синтаксис:
vod_live_response_cache zone_name zone_size [expiration] - умолчание:
off - контекст:
http,server,location
Конфигурирует размер и имя общего объекта памяти для кэша ответов для изменений времени живых ответов. Этот кэш хранит следующие типы ответов для live: DASH MPD, индекс HLS M3U8, HDS bootstrap, манифест MSS.
vod_initial_read_size
- синтаксис:
vod_initial_read_size size - умолчание:
4K - контекст:
http,server,location
Устанавливает размер начальной операции чтения MP4 файла.
vod_max_metadata_size
- синтаксис:
vod_max_metadata_size size - умолчание:
128MB - контекст:
http,server,location
Устанавливает максимальный поддерживаемый размер метаданных видео (для MP4 - размер атома moov)
vod_max_frames_size
- синтаксис:
vod_max_frames_size size - умолчание:
16MB - контекст:
http,server,location
Устанавливает лимит на общий размер кадров одного отдельного сегмента
vod_max_frame_count
- синтаксис:
vod_max_frame_count count - умолчание:
1048576 - контекст:
http,server,location
Устанавливает лимит на общее количество кадров, прочитанных для обслуживания не сегментного запроса (например, плейлист).
vod_segment_max_frame_count
- синтаксис:
vod_segment_max_frame_count count - умолчание:
65536 - контекст:
http,server,location
Устанавливает лимит на общее количество кадров, прочитанных для обслуживания запроса сегмента.
vod_cache_buffer_size
- синтаксис:
vod_cache_buffer_size size - умолчание:
256K - контекст:
http,server,location
Устанавливает размер кэшированных буферов, используемых при чтении кадров MP4.
vod_open_file_thread_pool
- синтаксис:
vod_open_file_thread_pool pool_name - умолчание:
off - контекст:
http,server,location
Включает использование асинхронного открытия файлов через пул потоков. Пул потоков должен быть определён с директивой thread_pool, если не указано имя пула, используется пул по умолчанию. Эта директива поддерживается только на nginx 1.7.11 и выше при компиляции с --add-threads. Примечание: эта директива в настоящее время отключает использование кэша открытых файлов nginx модулем nginx-vod-module
vod_output_buffer_pool
- синтаксис:
vod_output_buffer_pool size count - умолчание:
off - контекст:
http,server,location
Предварительно аллоцирует буферы для генерации данных ответов, что избавляет от необходимости выделять/освобождать буферы на каждый запрос.
vod_performance_counters
- синтаксис:
vod_performance_counters zone_name - умолчание:
off - контекст:
http,server,location
Конфигурирует имя общего объекта памяти для счётчиков производительности.
Директивы конфигурации - структура URL
vod_base_url
- синтаксис:
vod_base_url url - умолчание:
см. ниже - контекст:
http,server,location
Устанавливает базовый URL (схема + домен), который должен быть возвращён в ответах манифеста.
Значение параметра может содержать переменные, если параметр оценивается в пустую строку, будут использоваться относительные URLs.
Если параметр оценивается в строку, заканчивающуюся на /, предполагается, что это полный URL - модуль только добавляет
имя файла к нему, вместо полного URI.
Если не задано, базовый URL определяется следующим образом:
1. Если запрос не содержал заголовка хоста (HTTP/1.0), будут возвращены относительные URLs
2. В противном случае базовый URL будет $scheme://$http_host
Настройка в настоящее время затрагивает только HLS и DASH. В MSS и HDS относительные URLs всегда возвращаются.
vod_segments_base_url
- синтаксис:
vod_segments_base_url url - умолчание:
см. ниже - контекст:
http,server,location
Устанавливает базовый URL (схема + домен), который должен использоваться для доставки видеосегментов. Значение параметра может содержать переменные, если параметр оценивается в пустую строку, будут использоваться относительные URLs. Если не установлено, будет использован vod_base_url. Настройка в настоящее время затрагивает только HLS.
vod_multi_uri_suffix
- синтаксис:
vod_multi_uri_suffix suffix - умолчание:
.urlset - контекст:
http,server,location
Суффикс URL используется для определения многочисленных URL. Многочисленный URL - это способ кодирования нескольких различных URL, которые должны воспроизводиться вместе как адаптивный поток под одним URL. При использовании стандартного суффикса URL, например, может выглядеть так: http://host/hls/common-prefix,bitrate1,bitrate2,common-suffix.urlset/master.m3u8
vod_clip_to_param_name
- синтаксис:
vod_clip_to_param_name name - умолчание:
clipTo - контекст:
http,server,location
Имя параметра запроса для клипа, который должен быть запрошен.
vod_clip_from_param_name
- синтаксис:
vod_clip_from_param_name name - умолчание:
clipFrom - контекст:
http,server,location
Имя параметра запроса для клипа из.
vod_tracks_param_name
- синтаксис:
vod_tracks_param_name name - умолчание:
tracks - контекст:
http,server,location
Имя параметра запроса для треков.
vod_time_shift_param_name
- синтаксис:
vod_time_shift_param_name name - умолчание:
shift - контекст:
http,server,location
Имя параметра запроса для сдвига.
vod_speed_param_name
- синтаксис:
vod_speed_param_name name - умолчание:
speed - контекст:
http,server,location
Имя параметра запроса для скорости.
vod_lang_param_name
- синтаксис:
vod_lang_param_name name - умолчание:
lang - контекст:
http,server,location
Имя параметра запроса для языка.
vod_force_sequence_index
- синтаксис:
vod_force_sequence_index on/off - умолчание:
off - контекст:
http,server,location
Используйте индекс последовательности в сегментных URI, даже если есть только одна последовательность.
Директивы конфигурации - заголовки ответа
vod_expires
- синтаксис:
vod_expires time - умолчание:
none - контекст:
http,server,location
Устанавливает значение заголовков "Expires" и "Cache-Control" для успешных запросов.
Эта директива аналогична встроенной директиве nginx expires, за исключением того, что она поддерживает только сценарий истечения времени
(эпоха, макс, выключить, дневное время не поддерживается)
Главная мотивация использования этой директивы вместо встроенной expires заключается в том, чтобы иметь разные истечения для VOD и динамического живого контента.
Если эта директива не указана, nginx-vod-module не будет устанавливать заголовки "Expires" / "Cache-Control".
Эта настройка затрагивает все типы запросов в VOD плейлистах и запросах сегментов в живых плейлистах.
vod_expires_live
- синтаксис:
vod_expires_live time - умолчание:
none - контекст:
http,server,location
То же самое, что и vod_expires (выше) для живых запросов, которые не зависят от времени и не являются сегментами (например, HLS - master.m3u8, HDS - manifest.f4m).
vod_expires_live_time_dependent
- синтаксис:
vod_expires_live_time_dependent time - умолчание:
none - контекст:
http,server,location
То же самое, что и vod_expires (выше) для живых запросов, которые зависят от времени (HLS - index.m3u8, HDS - bootstrap.abst, MSS - manifest, DASH - manifest.mpd).
vod_last_modified
- синтаксис:
vod_last_modified time - умолчание:
none - контекст:
http,server,location
Устанавливает значение заголовка Last-Modified, возвращаемого в ответе, по умолчанию модуль не возвращает заголовок Last-Modified. Причина наличия этого параметра здесь заключается в поддержке If-Modified-Since / If-Unmodified-Since. Поскольку встроенный модуль фильтрации ngx_http_not_modified работает до любого другого модуля фильтрации заголовков, он не увидит никакие заголовки, установленные add_headers / more_set_headers. Это заставляет nginx всегда отвечать, как будто контент поменялся (412 для If-Unmodified-Since / 200 для If-Modified-Since) Для живых запросов, которые не являются сегментами (например, живой DASH MPD),