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

对于带有非零startend参数的匹配请求,nginx 将从文件中读取元数据,在请求的时间范围内准备流,然后将其发送给客户端。这具有与上述相同的开销。

如果匹配请求中不包含startend参数,则不会产生开销,并且文件将仅作为静态资源发送。一些播放器还支持字节范围请求,因此不需要此模块。

默认情况下未构建此模块,应使用--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的一部分使用。