模块 ngx_http_mp4_module

示例配置
指令
     mp4
     mp4_buffer_size
     mp4_max_buffer_size
     mp4_limit_rate
     mp4_limit_rate_after
     mp4_start_key_frame

ngx_http_mp4_module 模块为 MP4 文件提供伪流媒体服务器端支持。此类文件通常具有 .mp4.m4v.m4a 文件名扩展名。

伪流媒体与兼容媒体播放器协同工作。播放器向服务器发送一个 HTTP 请求,其中在查询字符串参数(仅命名为 start 并以秒为单位指定)中指定了开始时间,并且服务器使用流响应,其开始位置对应于请求的时间,例如

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

这允许在任何时间执行随机寻址,或在时间轴中间开始播放。

为了支持寻址,基于 H.264 的格式将元数据存储在所谓的“moov atom”中。它是包含整个文件索引信息的该文件的一部分。

要开始播放,播放器首先需要读取元数据。这是通过发送带有 start=0 参数的特殊请求来完成的。许多编码软件将元数据插入到文件末尾。这对于伪流媒体来说不是最优的,因为播放器必须在开始播放之前下载整个文件。如果元数据位于文件开头,nginx 只需开始发回文件内容就足够了。如果元数据位于文件末尾,nginx 必须读取整个文件并准备一个新的流,以便元数据位于媒体数据之前。这涉及一些 CPU、内存和磁盘 I/O 开销,因此最好预先准备一个用于伪流媒体的原始文件,而不是让 nginx 在每次此类请求时执行此操作。

该模块还支持 HTTP 请求的 end 参数(1.5.13),该参数设置回放的结束点。end 参数可以与 start 参数一起指定,也可以单独指定

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

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

如果 start 参数指向非关键视频帧,则此类视频的开头将被中断。要解决此问题,可以在 start 点之前和它们之间的所有中间帧之前,使用关键帧为视频 添加 前缀。这些帧将使用编辑列表(1.21.4)从回放中隐藏。

如果匹配请求不包括 startend 参数,则没有开销,并且文件将简单地作为静态资源发送。一些播放器还支持字节范围请求,因此不需要此模块。

此模块默认情况下不构建,应该使用 --with-http_mp4_module 配置参数启用它。

如果以前使用过第三方 mp4 模块,则应该禁用它。

ngx_http_flv_module 模块为 FLV 文件提供了类似的伪流支持。

示例配置

location /video/ {
    mp4;
    mp4_buffer_size       1m;
    mp4_max_buffer_size   5m;
    mp4_limit_rate        on;
    mp4_limit_rate_after  30s;
}

指令

语法 mp4;
默认值
上下文 location

在周围位置中启用模块处理。

语法 mp4_buffer_size size;
默认值
mp4_buffer_size 512K;
上下文 http, server, location

设置用于处理 MP4 文件的缓冲区的初始 size

语法 mp4_max_buffer_size size;
默认值
mp4_max_buffer_size 10M;
上下文 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

语法 mp4_limit_rate on | off | factor;
默认值
mp4_limit_rate off;
上下文 http, server, location

限制响应传输到客户端的速率。速率限制基于所提供 MP4 文件的平均比特率。要计算速率,比特率乘以指定的 factor。特殊值“on”对应于因子 1.1。特殊值“off”禁用速率限制。限制是针对每个请求设置的,因此,如果客户端同时打开两个连接,则总体速率将是指定限制的两倍。

此指令是我们 商业订阅 的一部分。

语法 mp4_limit_rate_after time;
默认值
mp4_limit_rate_after 60s;
上下文 http, server, location

设置媒体数据(以播放时间衡量)的初始数量,在此数量之后,对客户端的响应的进一步传输将受到速率限制。

此指令是我们 商业订阅 的一部分。

语法 mp4_start_key_frame on | off;
默认值
mp4_start_key_frame off;
上下文 http, server, location

此指令出现在 1.21.4 版本中。

强制输出视频始终以关键视频帧开头。如果 start 参数未指向关键帧,则使用 mp4 编辑列表隐藏初始帧。编辑列表受 Chrome、Safari、QuickTime 和 ffmpeg 等主要播放器和浏览器支持,Firefox 部分支持。