view xml/ru/docs/http/ngx_http_mp4_module.xml @ 2796:bcdb13e1e8c6

Minor updates to ngx_http_mp4_module module intro.
author Yaroslav Zhuravlev <yar@nginx.com>
date Fri, 12 Nov 2021 20:16:05 +0000
parents 1594ed379f1f
children 17ed19394953
line wrap: on
line source

<?xml version="1.0"?>

<!--
  Copyright (C) Nginx, Inc.
  -->

<!DOCTYPE module SYSTEM "../../../../dtd/module.dtd">

<module name="Модуль ngx_http_mp4_module"
        link="/ru/docs/http/ngx_http_mp4_module.html"
        lang="ru"
        rev="8">

<section id="summary">

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

<para>
Псевдо-стриминг работает в паре с совместимым медиаплеером.
Плеер посылает серверу HTTP-запрос с указанием точки времени старта
в аргументе
<literal>start</literal>
строки запроса (время задаётся в секундах), а сервер в
ответ посылает поток, у которого начальная позиция соответствует
запрошенному времени, например:
<example>
http://example.com/elephants_dream.mp4?start=238.88
</example>
Это позволяет в любой момент времени выполнить произвольное
позиционирование, а также начать воспроизведение с середины
временной шкалы.
</para>

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

<para>
До начала воспроизведения плееру необходимо прочитать метаданные.
Для этого он отсылает специальный запрос с аргументом
<literal>start=0</literal>.
Многие кодирующие программы добавляют метаданные в конец файла.
Это неоптимально для псевдо-стриминга, поскольку плееру
потребуется загрузить файл целиком прежде чем начать воспроизведение.
Если метаданные находятся в начале файла,
nginx’у достаточно начать отправлять в ответ содержимое файла.
Если же метаданные находятся в конце файла,
потребуется прочитать весь
файл и подготовить новый поток, в котором метаданные предшествуют
медийным данным.
Это требует дополнительного процессорного
времени, памяти и дискового ввода/вывода, поэтому лучше
заранее <link
url="https://github.com/flowplayer/flowplayer/wiki/7.1.1-video-file-correction">
подготовить исходный файл для псевдо-стриминга</link>,
нежели делать это для каждого запроса.
</para>

<para>
Модуль также поддерживает аргумент <literal>end</literal> HTTP-запроса
(1.5.13), задающий время окончания воспроизведения потока.
Аргумент <literal>end</literal> задаётся совместно с
аргументом <literal>start</literal>
или самостоятельно:
<example>
http://example.com/elephants_dream.mp4?start=238.88&amp;end=555.55
</example>
</para>

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

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

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

<para>
Схожая поддержка псевдо-стриминга для FLV-файлов обеспечивается модулем
<link doc="ngx_http_flv_module.xml">ngx_http_flv_module</link>.
</para>

</section>


<section id="example" name="Пример конфигурации">

<para>
<example>
location /video/ {
    mp4;
    mp4_buffer_size     1m;
    mp4_max_buffer_size 5m;
}
</example>
</para>

</section>


<section id="directives" name="Директивы">

<directive name="mp4">
<syntax/>
<default/>
<context>location</context>

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

</directive>


<directive name="mp4_buffer_size">
<syntax><value>размер</value></syntax>
<default>512K</default>
<context>http</context>
<context>server</context>
<context>location</context>

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

</directive>


<directive name="mp4_max_buffer_size">
<syntax><value>размер</value></syntax>
<default>10M</default>
<context>http</context>
<context>server</context>
<context>location</context>

<para>
В ходе обработки метаданных может понадобиться буфер большего размера.
Его размер не может превышать указанного,
иначе nginx вернёт серверную ошибку
<http-status code="500" text="Internal Server Error"/>
и запишет в лог следующее сообщение:
<example>
"/some/movie/file.mp4" mp4 moov atom is too large:
12583268, you may want to increase mp4_max_buffer_size
</example>
</para>

</directive>


<directive name="mp4_limit_rate">
<syntax>
    <literal>on</literal> |
    <literal>off</literal> |
    <value>множитель</value></syntax>
<default>off</default>
<context>http</context>
<context>server</context>
<context>location</context>

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

<para>
<note>
Директива доступна как часть
<commercial_version>коммерческой подписки</commercial_version>.
</note>
</para>

</directive>


<directive name="mp4_limit_rate_after">
<syntax><value>время</value></syntax>
<default>60s</default>
<context>http</context>
<context>server</context>
<context>location</context>

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

<para>
<note>
Директива доступна как часть
<commercial_version>коммерческой подписки</commercial_version>.
</note>
</para>

</directive>

</section>

</module>