Spec-Zone.ru › nginx

Модуль ngx_http_mp4_module

  • Пример конфигурации
  • Директивы
  • mp4
  • mp4_buffer_size
  • mp4_max_buffer_size
  • mp4_limit_rate
  • mp4_limit_rate_after
  • mp4_start_key_frame

Модуль ngx_http_mp4_module предоставляет серверную поддержку псевдопотокового воспроизведения файлов MP4. Такие файлы обычно имеют расширения .mp4, .m4v, или .m4a.

Псевдопотоковое воспроизведение работает совместно с совместимым медиаплеером. Плеер отправляет HTTP-запрос на сервер со временем начала, указанным в аргументе строки запроса (называемом просто start и задаваемом в секундах), и сервер отвечает потоком таким образом, что его начальная позиция соответствует запрошенному времени, например:

http://example.com/elephants_dream.mp4?start=238.88

Это позволяет выполнять произвольный поиск в любое время или начинать воспроизведение в середине временной шкалы.

Для поддержки поиска форматы на основе H.264 хранят метаданные в так называемом «атоме moov». Это часть файла, содержащая информацию об индексе всего файла.

Для начала воспроизведения плеер сначала должен прочитать метаданные. Это делается путем отправки специального запроса с аргументом start=0. Многие программы кодирования вставляют метаданные в конец файла. Это не оптимально для псевдопотокового воспроизведения, так как плеер должен загрузить весь файл перед запуском воспроизведения. Если метаданные расположены в начале файла, nginx достаточно просто начать отправку содержимого файла. Если метаданные находятся в конце файла, nginx должен прочитать весь файл и подготовить новый поток, чтобы метаданные предшествовали медиаданным. Это влечёт некоторые затраты на ЦП, память и ввод-вывод с диска, поэтому хорошая идея — подготовить исходный файл для псевдопотокового воспроизведения заранее, вместо того, чтобы nginx делал это при каждом таком запросе.

Модуль также поддерживает аргумент end HTTP-запроса (1.5.13), который устанавливает конечную точку воспроизведения. Аргумент end может быть указан с аргументом start или отдельно:

http://example.com/elephants_dream.mp4?start=238.88&end=555.55

При соответствующем запросе с ненулевым аргументом start или end nginx прочитает метаданные из файла, подготовит поток с запрошенным диапазоном времени и отправит его клиенту. Это имеет те же затраты, что и описанные выше.

Если аргумент start указывает на видеокадр, который не является ключевым, начало такого видео будет нарушено. Для решения этой проблемы видео можно добавить ключевой кадр перед start точкой и со всеми промежуточными кадрами между ними. Эти кадры будут скрыты от воспроизведения с помощью списка редактирования (1.21.4).

Если соответствующий запрос не включает аргументы start и end, затрат нет, и файл отправляется просто как статический ресурс. Некоторые плееры также поддерживают запросы с диапазоном байтов, и поэтому им не нужен этот модуль.

Этот модуль не собирается по умолчанию, его следует включить с параметром конфигурации --with-http_mp4_module.

Если ранее использовался сторонний модуль mp4, его следует отключить.

Аналогичная поддержка псевдопотокового воспроизведения для файлов FLV предоставляется модулем ngx_http_flv_module.

Пример конфигурации

location /video/ {
    mp4;
    mp4_buffer_size       1m;
    mp4_max_buffer_size   5m;
    mp4_limit_rate        on;
    mp4_limit_rate_after  30s;
}

Директивы

Синтаксис: mp4;
Значение по умолчанию: —
Контекст: location

Включает обработку модуля в окружающем месте.

Синтаксис: mp4_buffer_size size;
Значение по умолчанию: mp4_buffer_size 512K;
Контекст: http, server, location

Устанавливает начальный size буфера, используемого для обработки файлов MP4.

Синтаксис: mp4_max_buffer_size size;
Значение по умолчанию: mp4_max_buffer_size 10M;
Контекст: http, server, location

Во время обработки метаданных может потребоваться больший буфер. Его размер не может превышать указанного size, в противном случае nginx вернёт ошибку сервера 500 (Внутренняя ошибка сервера) и запишет следующее сообщение:

"/some/movie/file.mp4" mp4 moov atom is too large:
12583268, you may want to increase mp4_max_buffer_size
Синтаксис: mp4_limit_rate on | off | factor;
Значение по умолчанию: mp4_limit_rate off;
Контекст: http, server, location

Ограничивает скорость передачи ответа клиенту. Скорость ограничена на основе средней битрейта серверного файла MP4. Для расчёта скорости битрейт умножается на указанный factor. Специальное значение «on» соответствует коэффициенту 1,1. Специальное значение «off» отключает ограничение скорости. Ограничение устанавливается на запрос, поэтому если клиент одновременно открывает два соединения, общая скорость будет в два раза больше указанного предела.

Эта директива доступна в рамках нашей коммерческой подписки.
Синтаксис: mp4_limit_rate_after time;
Значение по умолчанию: mp4_limit_rate_after 60s;
Контекст: http, server, location

Устанавливает начальное количество медиаданных (измеряемых во времени воспроизведения) после которого дальнейшая передача ответа клиенту будет ограничена по скорости.

Эта директива доступна в рамках нашей коммерческой подписки.
Синтаксис: mp4_start_key_frame on | off;
Значение по умолчанию: mp4_start_key_frame off;
Контекст: http, server, location

Эта директива появилась в версии 1.21.4.

Принудительно устанавливает, что выходное видео всегда начинается с ключевого кадра. Если аргумент start не указывает на ключевой кадр, начальные кадры скрываются с помощью списка редактирования mp4. Списки редактирования поддерживаются основными плеерами и браузерами, такими как Chrome, Safari, QuickTime и ffmpeg, частично поддерживаются Firefox.

© 2002-2021 Igor Sysoev
© 2011-2024 Nginx, Inc.
Licensed under the BSD License.
https://nginx.org/en/docs/http/ngx_http_mp4_module.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API