<!-- review: finished -->

<a id="http-mp4"></a>

# MP4

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

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

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

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

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

До начала воспроизведения плееру необходимо прочитать метаданные. Для этого он
отсылает специальный запрос с аргументом `start=0`. Многие кодирующие
программы добавляют метаданные в конец файла. Это неоптимально для
псевдо-стриминга, поскольку плееру потребуется загрузить файл целиком прежде чем
начать воспроизведение. Если метаданные находятся в начале файла, Angie
достаточно начать отправлять в ответ содержимое файла. Если же метаданные
находятся в конце файла, потребуется прочитать весь файл и подготовить новый
поток, в котором метаданные предшествуют медийным данным. Это требует
дополнительного процессорного времени, памяти и дискового ввода/вывода, поэтому
лучше заранее [подготовить](https://github.com/flowplayer/flowplayer/wiki/7.1.1-video-file-correction)
исходный файл для псевдо-стриминга, нежели делать это для каждого запроса.

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

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

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

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

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

При [сборке из исходного кода](https://angie.software//angie/docs/installation/sourcebuild.md#sourcebuild) модуль не собирается по умолчанию; его необходимо
включить с помощью [параметра сборки](https://angie.software//angie/docs/installation/sourcebuild.md#configure)
`‑‑with‑http_mp4_module`.
В пакетах и образах из
[наших репозиториев](https://angie.software//angie/docs/installation/index.md#install-packages)
модуль включен в сборку.

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

Схожая поддержка псевдо-стриминга для FLV-файлов обеспечивается модулем [FLV](https://angie.software//angie/docs/configuration/modules/http/http_flv.md#http-flv).

<a id="configuration-example-31"></a>

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

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

<a id="directives-32"></a>

## Директивы

<a id="index-0"></a>

<a id="id4"></a>

### mp4

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `mp4`;   |
|------------------------------------------------------------------------------------------|----------|
| По умолчанию                                                                             | —        |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | location |

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

<a id="index-1"></a>

<a id="mp4-buffer-size"></a>

### mp4_buffer_size

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `mp4_buffer_size` размер;   |
|------------------------------------------------------------------------------------------|-----------------------------|
| По умолчанию                                                                             | `mp4_buffer_size 512K;`     |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http, server, location      |

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

<a id="index-2"></a>

<a id="mp4-max-buffer-size"></a>

### mp4_max_buffer_size

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `mp4_max_buffer_size` размер;   |
|------------------------------------------------------------------------------------------|---------------------------------|
| По умолчанию                                                                             | `mp4_max_buffer_size 10M;`      |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | 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

<a id="index-3"></a>

<a id="mp4-limit-rate"></a>

### mp4_limit_rate

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `mp4_limit_rate` `on` | `off` | коэффициент;   |
|------------------------------------------------------------------------------------------|------------------------------------------------|
| По умолчанию                                                                             | `mp4_limit_rate off;`                          |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http, server, location                         |

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

- Специальное значение `off` отключает ограничение скорости.
- Специальное значение `on` соответствует коэффициенту `1.1`.
- Начало действия ограничения регулируется значением
  [mp4_limit_rate_after](#mp4-limit-rate-after).

Запросы ограничиваются индивидуально:
если клиент открыл два соединения,
общая скорость удваивается.
В связи с этим обратите внимание на [limit_conn](https://angie.software//angie/docs/configuration/modules/http/http_api.md#limit-conn) и сопутствующие директивы.

<a id="index-4"></a>

<a id="mp4-limit-rate-after"></a>

### mp4_limit_rate_after

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `mp4_limit_rate_after` время;   |
|------------------------------------------------------------------------------------------|---------------------------------|
| По умолчанию                                                                             | `mp4_limit_rate_after 60s;`     |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http, server, location          |

Задает
(в пересчете на
[время воспроизведения](https://angie.software//angie/docs/configuration/configfile.md#syntax))
объем медиаданных,
после передачи которого
скорость будет ограничена директивой
[mp4_limit_rate](#mp4-limit-rate).

<a id="index-5"></a>

<a id="mp4-start-key-frame"></a>

### mp4_start_key_frame

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `mp4_start_key_frame` `on` | `off`;   |
|------------------------------------------------------------------------------------------|---------------------------------------|
| По умолчанию                                                                             | `mp4_start_key_frame off;`            |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http, server, location                |

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