模块 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 原子”中。它是文件的一部分,包含整个文件的索引信息。
要开始播放,播放器首先需要读取元数据。这是通过发送带有 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
对于具有非零 start
或 end
参数的匹配请求,nginx 将从文件中读取元数据,准备具有请求时间范围的流,并将其发送到客户端。这与上面描述的开销相同。
如果 start
参数指向非关键视频帧,则此类视频的开头将出现损坏。要解决此问题,可以在 start
点之前用关键帧和它们之间的所有中间帧来填充视频 内容。这些帧将使用编辑列表 (1.21.4) 从播放中隐藏。
如果匹配请求不包含 start
和 end
参数,则没有开销,并且文件仅作为静态资源发送。一些播放器也支持字节范围请求,因此不需要此模块。
此模块默认未构建,应使用 --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 |
在周围的 location 中开启模块处理。
语法 |
mp4_buffer_size |
---|---|
默认值 |
mp4_buffer_size 512K; |
上下文 |
http 、server 、location |
设置用于处理 MP4 文件的缓冲区的初始 size
。
语法 |
mp4_max_buffer_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 |
---|---|
默认值 |
mp4_limit_rate off; |
上下文 |
http 、server 、location |
限制对客户端的响应传输速率。速率限制基于所提供的 MP4 文件的平均比特率。为了计算速率,比特率将乘以指定的 factor
。特殊值“on
”对应于系数 1.1。特殊值“off
”禁用速率限制。限制针对每个请求设置,因此如果客户端同时打开两个连接,则总速率将是指定限制的两倍。
此指令作为我们 商业订阅 的一部分提供。
语法 |
mp4_limit_rate_after |
---|---|
默认值 |
mp4_limit_rate_after 60s; |
上下文 |
http 、server 、location |
设置初始媒体数据量(以播放时间衡量),在此之后,对客户端的响应的进一步传输将受到速率限制。
此指令作为我们 商业订阅 的一部分提供。
语法 |
mp4_start_key_frame |
---|---|
默认值 |
mp4_start_key_frame off; |
上下文 |
http 、server 、location |
此指令出现在 1.21.4 版本中。
强制输出视频始终以关键视频帧开头。如果 start
参数不指向关键帧,则使用 mp4 编辑列表隐藏初始帧。Chrome、Safari、QuickTime 和 ffmpeg 等主要播放器和浏览器支持编辑列表,Firefox 部分支持。