Модуль ngx_http_mp4_module
Пример конфигурации Директивы mp4 mp4_buffer_size mp4_max_buffer_size 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’у достаточно начать отправлять в ответ содержимое файла.
Если же метаданные находятся в конце файла,
потребуется прочитать весь
файл и подготовить новый поток, в котором метаданные предшествуют
медийным данным.
Это требует дополнительного процессорного
времени, памяти и дискового ввода/вывода, поэтому лучше
заранее
подготовить исходный файл для псевдо-стриминга,
нежели делать это для каждого запроса.
Модуль также поддерживает аргумент end
HTTP-запроса
(1.5.13), задающий время окончания воспроизведения потока.
Аргумент end
задаётся совместно с
аргументом start
или самостоятельно:
http://example.com/elephants_dream.mp4?start=238.88&end=555.55
Для запроса с ненулевыми аргументами
start
или end
nginx считывает из файла метаданные, готовит поток с запрошенным
диапазоном и отправляет его клиенту.
Это тоже требует дополнительных ресурсов, как указано выше.
Если аргумент start
указывает на
видеокадр, не являющийся ключевым,
то начало такого видео может воспроизводиться с ошибками.
В этом случае к запрашиваемому видео
могут быть добавлены
ближайший к точке start
ключевой кадр
и все промежуточные кадры между ними.
При воспроизведении эти кадры будут скрыты
при помощи edit-листа (1.21.4).
Если запрос, обрабатываемый этим модулем, не содержит аргументов
start
и end
,
дополнительные ресурсы не тратятся, а файл отсылается непосредственно как
статический ресурс.
Некоторые плееры также поддерживают запросы с указанием диапазона
запрашиваемых байт (byte-range requests), для них этот модуль не требуется.
По умолчанию этот модуль не собирается, его сборку необходимо
разрешить с помощью конфигурационного параметра
--with-http_mp4_module
.
Если ранее использовался сторонний модуль mp4, следует его отключить.
Схожая поддержка псевдо-стриминга для FLV-файлов обеспечивается модулем ngx_http_flv_module.
Пример конфигурации
location /video/ { mp4; mp4_buffer_size 1m; mp4_max_buffer_size 5m; }
Директивы
Синтаксис: |
mp4; |
---|---|
Умолчание: | — |
Контекст: |
location |
Включает в содержащем location обработку этим модулем.
Синтаксис: |
mp4_buffer_size |
---|---|
Умолчание: |
mp4_buffer_size 512K; |
Контекст: |
http , server , location |
Задаёт начальный размер буфера, используемого при обработке MP4-файлов.
Синтаксис: |
mp4_max_buffer_size |
---|---|
Умолчание: |
mp4_max_buffer_size 10M; |
Контекст: |
http , server , location |
В ходе обработки метаданных может понадобиться буфер большего размера. Его размер не может превышать указанного, иначе nginx вернёт серверную ошибку 500 (Internal Server Error) и запишет в лог следующее сообщение:
"/some/movie/file.mp4" mp4 moov atom is too large: 12583268, you may want to increase mp4_max_buffer_size
Синтаксис: |
mp4_start_key_frame |
---|---|
Умолчание: |
mp4_start_key_frame off; |
Контекст: |
http , server , location |
Эта директива появилась в версии 1.21.4.
Включает режим, в котором видео всегда начинается с ключевого видеокадра.
Если аргумент start
не указывает на ключевой кадр,
то первоначальные кадры будут скрыты при помощи mp4 edit-листа.
Edit-листы поддерживаются большинством плееров и браузеров
включая Chrome, Safari, QuickTime и ffmpeg,
частично поддерживаются в Firefox.