On this page
Module ngx_http_mp4_module
ngx_http_mp4_module
模块为 MP4 文件提供了伪流服务器端支持。此类文件通常具有.mp4
,.m4v
或.m4a
文件 extensions。
伪流与兼容的 Flash Player 结合使用。播放器使用查询字符串参数(简单命名为start
并以秒为单位)中指定的开始时间向服务器发送 HTTP 请求,服务器响应流,使其开始位置与请求的时间相对应,例如:
http://example.com/elephants_dream.mp4?start=238.88
这允许在任何时间执行随机搜索,或在时间轴中间开始播放。
为了支持搜索,基于 H.264 的格式将元数据存储在所谓的“ moov 原子”中。它是文件的一部分,其中包含整个文件的索引信息。
要开始播放,播放器首先需要读取元数据。这是通过发送带有start=0
参数的特殊请求来完成的。许多编码软件将元数据插入文件的末尾。对于伪流而言,这不是最佳选择,因为播放器必须在开始播放之前下载整个文件。如果元数据位于文件的开头,那么 nginx 只需开始发送回文件内容就足够了。如果元数据位于文件的末尾,则 nginx 必须读取整个文件并准备一个新的流,以便元数据位于媒体数据之前。这涉及一些 CPU,内存和磁盘 I/O 开销,因此最好预先准备用于伪流的原始文件,而不是让 nginx 对每个此类请求都这样做。
该模块还支持 HTTP 请求(1.5.13)的end
参数,该参数设置回放的 endpoints。 end
参数可以用start
参数指定,也可以分别指定:
http://example.com/elephants_dream.mp4?start=238.88&end=555.55
对于带有非零start
或end
参数的匹配请求,nginx 将从文件中读取元数据,在请求的时间范围内准备流,然后将其发送给客户端。这具有与上述相同的开销。
如果匹配请求中不包含start
和end
参数,则不会产生开销,并且文件将仅作为静态资源发送。一些播放器还支持字节范围请求,因此不需要此模块。
默认情况下未构建此模块,应使用--with-http_mp4_module
配置参数启用它。
Note
如果以前使用了第三方 mp4 模块,则应将其禁用。
ngx_http_flv_module模块为 FLV 文件提供了类似的伪流支持。
Example Configuration
location /video/ {
mp4;
mp4_buffer_size 1m;
mp4_max_buffer_size 5m;
mp4_limit_rate on;
mp4_limit_rate_after 30s;
}
Directives
Syntax: | mp4; |
Default: | — |
Context: | location |
打开周围位置的模块处理。
Syntax: | mp4_buffer_size size; |
Default: | mp4_buffer_size 512K; |
Context: | http , server , location |
设置用于处理 MP4 文件的缓冲区的初始size
。
Syntax: | mp4_max_buffer_size size; |
Default: | mp4_max_buffer_size 10M; |
Context: | http , server , location |
在元数据处理期间,可能需要更大的缓冲区。它的大小不能超过指定的size
,否则 nginx 将返回 500(内部服务器错误)服务器错误,并记录以下消息:
"/some/movie/file.mp4" mp4 moov atom is too large:
12583268, you may want to increase mp4_max_buffer_size
Syntax: | mp4_limit_rate on | off | factor; |
Default: | mp4_limit_rate off; |
Context: | http , server , location |
限制向客户端传输响应的速率。该速率受所提供的 MP4 文件的平均比特率的限制。要计算速率,将比特率乘以指定的factor
。特殊值“ on
”对应于系数 1.1. 特殊值“ off
”禁用速率限制。该限制是根据请求设置的,因此,如果客户端同时打开两个连接,则总速率将是指定限制的两倍。
Note
该指令可作为commercial subscription的一部分使用。
Syntax: | mp4_limit_rate_after time; |
Default: | mp4_limit_rate_after 60s; |
Context: | http , server , location |
设置媒体数据的初始数量(以回放时间衡量),之后将进一步限制对客户端的响应传输速率。
Note
该指令可作为commercial subscription的一部分使用。