模块 ngx_http_mp4_module


示例Directives
mp4
mp4_buffer_size
mp4_max_buffer_size
mp4_limit_rate
mp4_limit_rate_after
mp4_start_key_frame

该模块提供伪流式处理 对 MP4 文件的服务器端支持。 此类文件通常具有 、 、 或文件扩展名。ngx_http_mp4_module.mp4.m4v.m4a

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

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

这允许随时执行随机查找或开始播放 在时间线的中间。

为了支持查找,基于 H.264 的格式存储元数据 在所谓的“Moov Atom”中。 它是文件的一部分,用于保存 整个文件。

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

该模块还支持 HTTP 请求的参数 (1.5.13) 设置播放的结束点。 可以使用 argument 指定 或单独:endendstart

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

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

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

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

默认情况下,此模块不是构建的,应使用 configuration 参数启用它。--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;
}

Directives

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

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

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

设置用于 处理 MP4 文件。size

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

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

"/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, ,serverlocation

限制向客户端传输响应的速率。 该速率根据 MP4 文件已投放。 要计算速率,请将比特率乘以指定的 . 特殊值 “” 对应于系数 1.1。 特殊值 “” 禁用速率限制。 限制是按请求设置的,因此,如果客户端同时打开 两个连接,则总体速率将是 2 倍 指定为指定的限制。factoronoff

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

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

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

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

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

该Directives出现在版本 1.21.4 中。

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