nginx-quic/docs/html/http/ngx_http_mp4_module.html
2011-09-15 08:59:38 +00:00

90 lines
4.3 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>HTTP MP4 Module</title></head><body><center><h3>HTTP MP4 Module</h3></center><center><h4>Summary</h4></center><p>
The module <code>ngx_http_mp4_module</code> provides pseudo-streaming
server-side support for H.264/AAC files typically having filename extensions
<code>.mp4</code>, <code>.m4v</code>,
and <code>.m4a</code>.
</p><p>
Pseudo-streaming works in alliance with conformant Flash players.
A player sends an HTTP request to the server with a start time
argument in the request URIs query string (named simply
<code>start</code>
and specified in seconds), and the server responds with a stream
so that its start position corresponds to the requested time,
for example:
<blockquote><pre>
http://example.com/elephants_dream.mp4?start=238.88
</pre></blockquote>
This allows for a random seeking at any time, or starting playback
in the middle of a timeline.
</p><p>
To support seeking, H.264-based formats store the metadata
in the so-called “moov atom.”
It is a part of the file that holds the index information for the
whole file.
</p><p>
To start playback, a player first needs to read metadata.
This is done by sending a special request with the
<code>start=0</code>
argument. Many encoding software will insert the metadata at
the end of the file. This is bad for pseudo-streaming:
the metadata needs to be located at the beginning of the file,
or else the entire file will have to be downloaded before it
starts playing. If a file is well-formed (with metadata at the
beginning of a file), nginx just sends back the contents of a file.
Otherwise, it has to read the file and prepare a new stream so that
metadata comes before media data.
This involves some CPU, memory, and disk I/O overhead,
so it is a good idea to
<a href="http://flowplayer.org/plugins/streaming/pseudostreaming.html#prepare">
prepare an original file for pseudo-streaming</a>,
rather than having nginx do this on every such request.
</p><p>
For a matching request with a non-zero
<code>start</code>
argument, nginx will read metadata from the file, prepare the
stream starting from the requested offset, and send it to a client.
This has the same overhead as described above.
</p><p>
If a matching request does not include the
<code>start</code>
argument, there is no overhead, and the file is just sent as a static resource.
Some players also support byte-range requests, and thus do not require
this module at all.
</p><p>
This module is not built by default, it should be enabled with the
<code>--with-http_mp4_module</code>
configuration parameter.
If you were using the third-party mp4 module, be sure to disable it.
</p><p>
A similar pseudo-streaming support for FLV files is provided by the module
<a href="ngx_http_flv_module.html">ngx_http_flv_module</a>.
</p><a name="example"></a><center><h4>Example Configuration</h4></center><p><blockquote><pre>
location /video/ {
mp4;
mp4_buffer_size 1m;
mp4_max_buffer_size 5m;
}
</pre></blockquote></p><a name="directives"></a><center><h4>Directives</h4></center><hr><a name="mp4"></a><strong>syntax</strong>:
<code>mp4</code><br><strong>default</strong>:
<strong>none</strong><br><strong>context</strong>:
<code>location</code><br><p>
Turns on module processing in a surrounding location.
</p><hr><a name="mp4_buffer_size"></a><strong>syntax</strong>:
<code>mp4_buffer_size <code><i>size</i></code></code><br><strong>default</strong>:
<code>mp4_buffer_size 512K</code><br><strong>context</strong>:
<code>http</code>, <code>server</code>, <code>location</code><br><p>
Sets the initial size of a memory buffer used to process MP4 files.
</p><hr><a name="mp4_max_buffer_size"></a><strong>syntax</strong>:
<code>mp4_max_buffer_size <code><i>size</i></code></code><br><strong>default</strong>:
<code>mp4_max_buffer_size 10M</code><br><strong>context</strong>:
<code>http</code>, <code>server</code>, <code>location</code><br><p>
During metadata processing, a larger buffer may become necessary.
Its size cannot exceed the specified <code><i>size</i></code>,
or else nginx will return the server error
500 (Internal Server Error),
and log the following:
<blockquote><pre>
"/some/movie/file.mp4" mp4 moov atom is too large:
12583268, you may want to increase mp4_max_buffer_size
</pre></blockquote></p></body></html>