MP4#

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

当从源码构建时(请参阅 从源代码构建 Angie),默认情况下不会构建此模块;应使用 ‑‑with‑http_mp4_module build option 启用。

在来自 our repos 的软件包和镜像中,已包含此模块。

伪流式传输与兼容的媒体播放器协同工作。播放器通过HTTP请求向服务器发送指定开始时间的查询字符串参数(简单命名为start,以秒为单位),服务器响应流的位置与请求时间相对应,例如:

这允许在任何时间进行随机跳转,或者在时间轴中间开始播放。

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

要开始播放,播放器需要首先读取元数据。这是通过发送带有 start=0 参数的特殊请求完成的。许多编码软件将元数据插入文件的末尾。这对于伪流式传输来说并不理想,因为播放器必须先下载整个文件才能开始播放。如果元数据位于文件的开头,Angie只需开始发送文件内容即可。如果元数据位于文件末尾,Angie必须读取整个文件并准备一个新流,使元数据在媒体数据之前。这涉及一些CPU、内存和磁盘I/O开销,因此最好提前 prepare 原始文件以支持伪流式传输,而不是让Angie在每次这样的请求中进行处理。

该模块还支持HTTP请求的 end 参数,该参数设置播放的终点。end 参数可以与start参数一起指定或单独指定:

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

如果 start 参数指向非关键视频帧,则此类视频的开头将被破坏。为解决此问题,视频 可以start 点之前和它们之间的所有中间帧之前插入关键帧。这些帧将通过编辑列表从播放中隐藏。

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

小心

如果之前使用了第三方mp4模块,应将其禁用。

类似的FLV文件伪流式传输支持由 FLV 提供。

配置示例#

set_real_ip_from  192.168.1.0/24;
set_real_ip_from  192.168.2.1;
set_real_ip_from  2001:0db8::/32;
real_ip_header    X-Forwarded-For;
real_ip_recursive on;

指令#

mp4#

Syntax

mp4;

默认值

Context

location

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

mp4_buffer_size#

Syntax

mp4_buffer_size size;

默认值

mp4_buffer_size 512K;

Context

http, server, location

设置用于处理MP4文件的缓冲区的初始大小。

mp4_max_buffer_size#

Syntax

mp4_max_buffer_size size;

默认值

mp4_max_buffer_size 10M;

Context

http, server, location

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

"/some/movie/file.mp4" mp4 moov atom is too large: 12583268, you may want to increase mp4_max_buffer_size

mp4_limit_rate#

Syntax

mp4_limit_rate on | off | factor;

默认值

mp4_limit_rate off;

Context

http, server, location

限制将请求的MP4文件传输给客户端的速度。要计算限制,factor 乘以文件的平均比特率。

  • off 值禁用速率限制。

  • on 值设置 factor1.1

  • 限制在达到 mp4_limit_rate_after 设置的值后应用。

请求的速率限制是单独的:如果客户端打开两个连接,结果速率加倍。在这方面,请考虑使用 limit_conn 和相关指令。

mp4_limit_rate_after#

Syntax

mp4_limit_rate_after time;

默认值

mp4_limit_rate_after 60s;

Context

http, server, location

设置(在 playback time 中)传输的媒体数据量,以触发 mp4_limit_rate 设置的速率限制。

mp4_start_key_frame#

Syntax

mp4_start_key_frame on | off;

默认值

mp4_start_key_frame off;

Context

http, server, location

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