Подключение mp4 модуля в nginx

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

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

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

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

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

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

Для запроса с ненулевым аргументом start nginx считывает из файла метаданные, готовит поток с запрошенного смещения, и отправляет его клиенту. Это тоже требует дополнительных ресурсов, как указано выше.

Если запрос, обрабатываемый этим модулем, не содержит аргумента start, дополнительные ресурсы не тратятся, а файл отсылается просто как статический ресурс. Некоторые плееры также поддерживают запросы с указанием диапазона запрашиваемых байт (byte-range requests), для них вообще не требуется этот модуль.

По умолчанию этот модуль не собирается, его сборку необходимо разрешить с помощью конфигурационного параметра --with-http_mp4_module.
Если ранее использовался сторонний модуль mp4, следует его отключить.

Схожая поддержка псевдо-стриминга для FLV-файлов обеспечивается модулем ngx_http_flv_module.
Пример конфигурации

location ~ \.mp4$ {
root /var/www/html;
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

Опубликовано в nginx

Рубрики