MP4#

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

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

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

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

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

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

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

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

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

Если аргумент start указывает на видеокадр, не являющийся ключевым, то начало такого видео может воспроизводиться с ошибками. В этом случае к запрашиваемому видео могут быть добавлены ближайший к точке start ключевой кадр и все промежуточные кадры между ними. При воспроизведении эти кадры будут скрыты при помощи edit-листа.

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

При сборке из исходного кода модуль не собирается по умолчанию; его необходимо включить с помощью параметра сборки ‑‑with‑http_mp4_module. В пакетах и образах из наших репозиториев модуль включен в сборку.

Осторожно

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

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

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

location /video/ {
    mp4;
    mp4_buffer_size     1m;
    mp4_max_buffer_size 5m;
}

Директивы#

mp4#

Синтаксис

mp4;

По умолчанию

Контекст

location

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

mp4_buffer_size#

Синтаксис

mp4_buffer_size размер;

По умолчанию

mp4_buffer_size 512K;

Контекст

http, server, location

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

mp4_max_buffer_size#

Синтаксис

mp4_max_buffer_size размер;

По умолчанию

mp4_max_buffer_size 10M;

Контекст

http, server, location

В ходе обработки метаданных может понадобиться буфер большего размера. Его размер не может превышать указанного, иначе Angie вернет серверную ошибку 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#

Синтаксис

mp4_limit_rate on | off | коэффициент;

По умолчанию

mp4_limit_rate off;

Контекст

http, server, location

Ограничивает скорость передачи запрошенного MP4-файла клиенту. Предельное значение вычисляется умножением заданного коэффициента на средний битрейт файла.

  • Специальное значение off отключает ограничение скорости.

  • Специальное значение on соответствует коэффициенту 1.1.

  • Начало действия ограничения регулируется значением mp4_limit_rate_after.

Запросы ограничиваются индивидуально: если клиент открыл два соединения, общая скорость удваивается. В связи с этим обратите внимание на limit_conn и сопутствующие директивы.

mp4_limit_rate_after#

Синтаксис

mp4_limit_rate_after время;

По умолчанию

mp4_limit_rate_after 60s;

Контекст

http, server, location

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

mp4_start_key_frame#

Синтаксис

mp4_start_key_frame on | off;

По умолчанию

mp4_start_key_frame off;

Контекст

http, server, location

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