模块 ngx_http_mp4_module


示例Directives
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 必须读取整个文件并准备一个新的 stream,以便 元数据位于媒体数据之前。 这涉及一些 CPU、内存和磁盘 I/O 开销。 所以提前准备一个伪推流的原始文件是个好主意, 而不是让 nginx 对每个此类请求都执行此作。

该模块还支持endHTTP 请求的参数 (1.5.13) 设置播放的结束点。 这end参数可以使用start论点 或单独:

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

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

如果startargument 指向 非 key 视频帧, 此类视频的开头将被打破。 要解决此问题,可以在视频前面加上 之前的关键帧start点 以及它们之间的所有中间帧。 这些帧将在播放中隐藏 使用编辑列表 (1.21.4)。

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

这个模块不是默认构建的,它应该使用--with-http_mp4_moduleconfiguration 参数。

如果以前使用过第三方 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;
}

Directives

语法: mp4;
默认值:
上下文: location

在周围位置打开模块处理。

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

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

语法: mp4_max_buffer_size size;
默认值:
mp4_max_buffer_size 10M;
上下文: http,server,location

在元数据处理期间,可能需要更大的缓冲区。 其大小不能超过指定的size, 否则 nginx 将返回 500 (Internal Server Error) 服务器错误, 并记录以下消息:

"/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“ 禁用速率限制。 限制是按请求设置的,因此,如果客户端同时打开 两个连接,则总体速率将是 2 倍 指定为指定的限制。

该Directives作为我们商业订阅的一部分提供。

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

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

该Directives作为我们商业订阅的一部分提供。

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

该Directives出现在版本 1.21.4 中。

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