Модуль ngx_http_mp4_module обеспечивает серверную поддержку
псевдо-стриминга для файлов в формате MP4.
Такие файлы обычно имеют расширения
.mp4 , .m4v и .m4a .
Псевдо-стриминг работает в паре с совместимым Flash-плеером.
Плеер посылает серверу 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 и end ,
дополнительные ресурсы не тратятся, а файл отсылается непосредственно как
статический ресурс.
Некоторые плееры также поддерживают запросы с указанием диапазона
запрашиваемых байт (byte-range requests), для них этот модуль не требуется.
По умолчанию этот модуль не собирается, его сборку необходимо
разрешить с помощью конфигурационного параметра
--with-http_mp4_module .
Схожая поддержка псевдо-стриминга для 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
|
Задаёт начальный объём медиаданных (измеряется как время воспроизведения),
после отправки которого начинает ограничиваться
скорость передачи ответа клиенту.
|