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

vod: Пакетировщик VOD на основе NGINX

Установка

Вы можете установить этот модуль в любой дистрибутив на базе RHEL, включая, но не ограничиваясь:

  • RedHat Enterprise Linux 7, 8, 9 и 10
  • CentOS 7, 8, 9
  • AlmaLinux 8, 9
  • Rocky Linux 8, 9
  • Amazon Linux 2 и Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-vod
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-vod

Включите модуль, добавив следующее в начало файла /etc/nginx/nginx.conf:

load_module modules/ngx_http_vod_module.so;

Этот документ описывает nginx-module-vod v1.33, выпущенный 1 января 2024 года.


nginx-vod-module Build Status

Присоединяйтесь к списку организаций, использующих этот проект пакетировщика видео.

Для потоковой передачи видео в реальном времени, пожалуйста, используйте 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-Frame до P-frame)

  • Поддержка переменной длины сегментов - позволяет проигрывателю быстро выбирать оптимальный битрейт, без накладных расходов на короткие сегменты на протяжении всего видео

  • Обрезка 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 пакет
*Примечание для Ubuntu: перед попыткой установить 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>

Пример выше представляет 3 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, содержащий только первый аудиопоток каждой последовательности. По умолчанию включаются первые аудио и видео дорожки каждого файла. Выбранные дорожки в имени файла объединяются с дорожками, выбранными с помощью параметра пути /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.

Этот раздел содержит несколько простых примеров, за которыми следует справочник поддерживаемых объектов и полей. Но сначала несколько определений:

  1. Source Clip - набор аудио и/или видео кадров (дорожек), извлеченных из одного медиафайла
  2. Generator - компонент, который может генерировать аудио/видео кадры. В настоящее время единственным поддерживаемым генератором является генератор тишины.
  3. Filter - манипуляция, которая может быть применена к аудио/видео кадрам. Поддерживаются следующие фильтры:
  4. изменение скорости (темпа) - применяется как к аудио, так и к видео
  5. изменение громкости аудио
  6. смешивание - может быть использовано для объединения нескольких аудиодорожек, или для объединения аудио источника A с видео источника B
  7. Clip - результат применения нуля или более фильтров к набору исходных клипов
  8. Dynamic Clip - клип, содержимое которого заранее неизвестно, например, целевая реклама
  9. Sequence - набор клипов, которые должны воспроизводиться один за другим.
  10. 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 - массив объектов Sequence. Сопоставление должно содержать как минимум одну последовательность и до 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 прошли, приоритет имеет presentationEndTime, т.е. запросы манифеста будут обслуживаться и сигнализировать о завершении презентации. * liveWindowDuration - целое число, необязательное, предоставляет способ переопределить vod_live_window_duration указанный в конфигурации. Если значение превышает абсолютное значение, указанное в vod_live_window_duration, оно игнорируется. * timeOffset - целое число, устанавливающее смещение, которое должно быть применено к часам сервера при обслуживании живых запросов. Этот параметр может быть использован для тестирования будущих/прошлых событий.

Sequence

Обязательные поля: * clips - массив объектов Clip (обязательно). Количество элементов должно соответствовать количеству элементов массива длительностей, указанного в наборе. Если массив длительностей не указан, массив клипов должен содержать один элемент.

Необязательные поля: * id - строка, идентифицирующая последовательность. Идентификатор может быть получен с помощью $vod_sequence_id. * language - трехбуквенный (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.

Clip (абстрактный)

Обязательные поля: * 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 - трехбуквенный (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 поддерживает схемы шифрования AES-128 и SAMPLE-AES HLS. Основное отличие между шифрованием медиа и 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 двоичные данные, формат этих данных специфичен для поставщика DRM
  • pssh.uuid - UUID системы drm, в данном случае, edef8ba9-79d6-4ace-a3c8-27dcd51d21ed обозначает Widevine
  • key - закодированный в base64 ключ шифрования (128 бит)
  • key_id - закодированный в base64 идентификатор ключа (128 бит)
  • iv - необязательный закодированный в base64 вектор инициализации (128 бит). IV в настоящее время используется только в HLS (FairPlay), в других протоколах IV генерируется автоматически модулем 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

Рекомендации по производительности

  1. Для средних/крупных развертываний не позволяйте пользователям воспроизводить видео напрямую из 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. Нет необходимости выделять большой буфер для этого кэша, 128M, вероятно, более чем достаточно для большинства развертываний. * vod_mapping_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. Накладные расходы на мультиплексирование потоков, генерируемых этим модулем, могут быть уменьшены путем изменения следующих параметров: * 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/xml 8. Применяйте общие лучшие практики производительности nginx, такие как tcp_nodelay=on, client_header_timeout и т.д.

Директивы конфигурации - база

vod

  • синтаксис: vod segmenter
  • по умолчанию: n/a
  • контекст: location

Включает модуль nginx-vod в окружающем местоположении. Допустимые значения для segmenter:

  1. none - обслуживает MP4 файлы как есть / обрезанные
  2. dash - Пакетировщик динамической адаптивной потоковой передачи по HTTP
  3. hds - Пакетировщик Adobe HTTP Dynamic Streaming
  4. hls - Пакетировщик Apple HTTP Live Streaming
  5. mss - Пакетировщик Microsoft Smooth Streaming
  6. thumb - захват миниатюр
  7. 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&..."
  • по умолчанию: empty
  • контекст: 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

Настраивает размер и имя объекта общей памяти кэша сопоставления для живых (только сопоставленный режим).

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

Настраивает размер и имя объекта общей памяти кэша ответов для живых ответов, изменяющихся во времени. Этот кэш хранит следующие типы ответов для живых: DASH MPD, HLS индекс M3U8, HDS начальный, 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 (схема + домен), который должен быть возвращен в ответах манифеста. Значение параметра может содержать переменные, если параметр оценивается в пустую строку, будут использоваться относительные URL. Если параметр оценивается в строку, заканчивающуюся на /, предполагается, что это полный URL - модуль только добавляет имя файла к нему, вместо полного URI. Если не установлено, базовый URL определяется следующим образом: 1. Если запрос не содержал заголовка хоста (HTTP/1.0), будут возвращены относительные URL 2. В противном случае базовый URL будет $scheme://$http_host Настройка в настоящее время влияет только на HLS и DASH. В MSS и HDS всегда возвращаются относительные URL.

vod_segments_base_url

  • синтаксис: vod_segments_base_url url
  • по умолчанию: см. ниже
  • контекст: http, server, location

Устанавливает базовый URL (схема + домен), который должен быть использован для доставки видео сегментов. Значение параметра может содержать переменные, если параметр оценивается в пустую строку, будут использоваться относительные URL. Если не установлено, будет использоваться vod_base_url. Настройка в настоящее время влияет только на HLS.

vod_multi_uri_suffix

  • синтаксис: vod_multi_uri_suffix suffix
  • по умолчанию: .urlset
  • контекст: http, server, location

Суффикс URL, который используется для идентификации множественных URL. Множественный URL - это способ кодирования нескольких различных URL которые должны воспроизводиться вместе как набор адаптивной потоковой передачи, под одним URL. Когда используется суффикс по умолчанию, URL набора HLS может выглядеть так: 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" для успешных запросов. Эта директива аналогична встроенной директиве expires nginx, за исключением того, что она поддерживает только сценарий истечения интервала (эпоха, максимум, отключено, время суток не поддерживаются) Основная мотивация использования этой директивы вместо встроенной expires заключается в том, чтобы иметь разные сроки действия для VOD и динамического живого контента. Если эта директива не указана, nginx-vod-module не будет устанавливать заголовки "Expires" / "Cache-Control". Эта настройка влияет на все типы запросов в VOD плейлистах и запросах сегментов в живых плейлистах.

vod_expires_live

  • синтаксис: vod_expires_live time
  • по умолчанию: none
  • контекст: http, server, location

То же самое, что и vod_expires (выше) для живых запросов, которые не зависят от времени и не являются