Модуль 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’у достаточно начать отправлять в ответ содержимое файла. Если же метаданные находятся в конце файла, потребуется прочитать весь файл и подготовить новый поток, в котором метаданные предшествуют медийным данным. Это требует дополнительного процессорного времени, памяти и дискового ввода/вывода, поэтому лучше заранее подготовить исходный файл для псевдо-стриминга, нежели делать это для каждого запроса.

Модуль также поддерживает аргумент 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_limit_rate on | off | множитель;
Умолчание:
mp4_limit_rate off;
Контекст: http, server, location

Ограничивает скорость передачи ответа клиенту. Ограничение основывается на значении усреднённого битрейта запрашиваемого MP4-файла. Скорость вычисляется умножением битрейта на задаваемый множитель. Специальное значение “on” соответствует множителю 1.1. Специальное значение “off” отключает ограничение скорости. Ограничение устанавливается на запрос, поэтому, если клиент одновременно откроет два соединения, суммарная скорость будет вдвое выше заданного ограничения.

Директива доступна как часть коммерческой подписки.

Синтаксис: mp4_limit_rate_after время;
Умолчание:
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 edit-листа. Edit-листы поддерживаются большинством плееров и браузеров включая Chrome, Safari, QuickTime и ffmpeg, частично поддерживаются в Firefox.