Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
nginx
GitHub Repository: nginx/nginx.org
Path: blob/main/xml/ru/docs/http/ngx_http_mp4_module.xml
1 views
1
<?xml version="1.0"?>
2
3
<!--
4
Copyright (C) Nginx, Inc.
5
-->
6
7
<!DOCTYPE module SYSTEM "../../../../dtd/module.dtd">
8
9
<module name="Модуль ngx_http_mp4_module"
10
link="/ru/docs/http/ngx_http_mp4_module.html"
11
lang="ru"
12
rev="9">
13
14
<section id="summary">
15
16
<para>
17
Модуль <literal>ngx_http_mp4_module</literal> обеспечивает серверную поддержку
18
псевдо-стриминга для файлов в формате MP4.
19
Такие файлы обычно имеют расширения
20
<path>.mp4</path>, <path>.m4v</path> и <path>.m4a</path>.
21
</para>
22
23
<para>
24
Псевдо-стриминг работает в паре с совместимым медиаплеером.
25
Плеер посылает серверу HTTP-запрос с указанием точки времени старта
26
в аргументе
27
<literal>start</literal>
28
строки запроса (время задаётся в секундах), а сервер в
29
ответ посылает поток, у которого начальная позиция соответствует
30
запрошенному времени, например:
31
<example>
32
http://example.com/elephants_dream.mp4?start=238.88
33
</example>
34
Это позволяет в любой момент времени выполнить произвольное
35
позиционирование, а также начать воспроизведение с середины
36
временной шкалы.
37
</para>
38
39
<para>
40
В форматах, основанных на H.264, метаданные, необходимые для поддержки
41
позиционирования, хранятся в так называемом “moov-атоме”.
42
Это часть файла, которая содержит индексную информацию для всего файла.
43
</para>
44
45
<para>
46
До начала воспроизведения плееру необходимо прочитать метаданные.
47
Для этого он отсылает специальный запрос с аргументом
48
<literal>start=0</literal>.
49
Многие кодирующие программы добавляют метаданные в конец файла.
50
Это неоптимально для псевдо-стриминга, поскольку плееру
51
потребуется загрузить файл целиком прежде чем начать воспроизведение.
52
Если метаданные находятся в начале файла,
53
nginx’у достаточно начать отправлять в ответ содержимое файла.
54
Если же метаданные находятся в конце файла,
55
потребуется прочитать весь
56
файл и подготовить новый поток, в котором метаданные предшествуют
57
медийным данным.
58
Это требует дополнительного процессорного
59
времени, памяти и дискового ввода/вывода, поэтому лучше
60
заранее <link
61
url="https://github.com/flowplayer/flowplayer/wiki/7.1.1-video-file-correction">
62
подготовить исходный файл для псевдо-стриминга</link>,
63
нежели делать это для каждого запроса.
64
</para>
65
66
<para>
67
Модуль также поддерживает аргумент <literal>end</literal> HTTP-запроса
68
(1.5.13), задающий время окончания воспроизведения потока.
69
Аргумент <literal>end</literal> задаётся совместно с
70
аргументом <literal>start</literal>
71
или самостоятельно:
72
<example>
73
http://example.com/elephants_dream.mp4?start=238.88&amp;end=555.55
74
</example>
75
</para>
76
77
<para>
78
Для запроса с ненулевыми аргументами
79
<literal>start</literal> или <literal>end</literal>
80
nginx считывает из файла метаданные, готовит поток с запрошенным
81
диапазоном и отправляет его клиенту.
82
Это тоже требует дополнительных ресурсов, как указано выше.
83
</para>
84
85
<para id="keyframe">
86
Если аргумент <literal>start</literal> указывает на
87
видеокадр, не являющийся ключевым,
88
то начало такого видео может воспроизводиться с ошибками.
89
В этом случае к запрашиваемому видео
90
<link id="mp4_start_key_frame">могут</link> быть добавлены
91
ближайший к точке <literal>start</literal> ключевой кадр
92
и все промежуточные кадры между ними.
93
При воспроизведении эти кадры будут скрыты
94
при помощи edit-листа (1.21.4).
95
</para>
96
97
<para>
98
Если запрос, обрабатываемый этим модулем, не содержит аргументов
99
<literal>start</literal> и <literal>end</literal>,
100
дополнительные ресурсы не тратятся, а файл отсылается непосредственно как
101
статический ресурс.
102
Некоторые плееры также поддерживают запросы с указанием диапазона
103
запрашиваемых байт (byte-range requests), для них этот модуль не требуется.
104
</para>
105
106
<para>
107
По умолчанию этот модуль не собирается, его сборку необходимо
108
разрешить с помощью конфигурационного параметра
109
<literal>--with-http_mp4_module</literal>.
110
<note>
111
Если ранее использовался сторонний модуль mp4, следует его отключить.
112
</note>
113
</para>
114
115
<para>
116
Схожая поддержка псевдо-стриминга для FLV-файлов обеспечивается модулем
117
<link doc="ngx_http_flv_module.xml">ngx_http_flv_module</link>.
118
</para>
119
120
</section>
121
122
123
<section id="example" name="Пример конфигурации">
124
125
<para>
126
<example>
127
location /video/ {
128
mp4;
129
mp4_buffer_size 1m;
130
mp4_max_buffer_size 5m;
131
}
132
</example>
133
</para>
134
135
</section>
136
137
138
<section id="directives" name="Директивы">
139
140
<directive name="mp4">
141
<syntax/>
142
<default/>
143
<context>location</context>
144
145
<para>
146
Включает в содержащем location обработку этим модулем.
147
</para>
148
149
</directive>
150
151
152
<directive name="mp4_buffer_size">
153
<syntax><value>размер</value></syntax>
154
<default>512K</default>
155
<context>http</context>
156
<context>server</context>
157
<context>location</context>
158
159
<para>
160
Задаёт начальный размер буфера, используемого при обработке MP4-файлов.
161
</para>
162
163
</directive>
164
165
166
<directive name="mp4_max_buffer_size">
167
<syntax><value>размер</value></syntax>
168
<default>10M</default>
169
<context>http</context>
170
<context>server</context>
171
<context>location</context>
172
173
<para>
174
В ходе обработки метаданных может понадобиться буфер большего размера.
175
Его размер не может превышать указанного,
176
иначе nginx вернёт серверную ошибку
177
<http-status code="500" text="Internal Server Error"/>
178
и запишет в лог следующее сообщение:
179
<example>
180
"/some/movie/file.mp4" mp4 moov atom is too large:
181
12583268, you may want to increase mp4_max_buffer_size
182
</example>
183
</para>
184
185
</directive>
186
187
188
<directive name="mp4_limit_rate">
189
<syntax>
190
<literal>on</literal> |
191
<literal>off</literal> |
192
<value>множитель</value></syntax>
193
<default>off</default>
194
<context>http</context>
195
<context>server</context>
196
<context>location</context>
197
198
<para>
199
Ограничивает скорость передачи ответа клиенту.
200
Ограничение основывается на значении усреднённого битрейта запрашиваемого
201
MP4-файла.
202
Скорость вычисляется умножением битрейта на задаваемый
203
<value>множитель</value>.
204
Специальное значение “<literal>on</literal>” соответствует множителю 1.1.
205
Специальное значение “<literal>off</literal>” отключает ограничение скорости.
206
Ограничение устанавливается на запрос, поэтому, если клиент одновременно
207
откроет два соединения, суммарная скорость будет вдвое выше
208
заданного ограничения.
209
</para>
210
211
<para>
212
<note>
213
Директива доступна как часть
214
<commercial_version>коммерческой подписки</commercial_version>.
215
</note>
216
</para>
217
218
</directive>
219
220
221
<directive name="mp4_limit_rate_after">
222
<syntax><value>время</value></syntax>
223
<default>60s</default>
224
<context>http</context>
225
<context>server</context>
226
<context>location</context>
227
228
<para>
229
Задаёт начальный объём медиаданных (измеряется как время воспроизведения),
230
после отправки которого начинает ограничиваться
231
скорость передачи ответа клиенту.
232
</para>
233
234
<para>
235
<note>
236
Директива доступна как часть
237
<commercial_version>коммерческой подписки</commercial_version>.
238
</note>
239
</para>
240
241
</directive>
242
243
244
<directive name="mp4_start_key_frame">
245
<syntax><literal>on</literal> | <literal>off</literal></syntax>
246
<default>off</default>
247
<context>http</context>
248
<context>server</context>
249
<context>location</context>
250
<appeared-in>1.21.4</appeared-in>
251
252
<para>
253
Включает режим, в котором видео всегда начинается с ключевого видеокадра.
254
Если аргумент <literal>start</literal> не указывает на ключевой кадр,
255
то первоначальные кадры будут скрыты при помощи mp4 edit-листа.
256
Edit-листы поддерживаются большинством плееров и браузеров
257
включая Chrome, Safari, QuickTime и ffmpeg,
258
частично поддерживаются в Firefox.
259
</para>
260
261
</directive>
262
263
</section>
264
265
</module>
266
267