MP4#
该模块为 MP4 文件提供伪流媒体的服务器端支持。这类文件通常具有 .mp4、.m4v 或 .m4a 文件扩展名。
当 从源代码构建 时,该模块默认并不构建;应通过 ‑‑with‑http_mp4_module
构建选项 启用它。
在来自 我们的仓库 的软件包和镜像中,该模块已包含在构建中。
伪流媒体与兼容的媒体播放器协同工作。播放器向服务器发送一个 HTTP 请求,请求中指定查询字符串参数的开始时间(简单命名为 start,单位为秒),服务器则回应以使其起始位置对应于请求的时间,例如:
http://example.com/elephants_dream.mp4?start=238.88
这允许在任意时间进行随机寻址,或从时间轴中间开始播放。
为了支持寻址,基于 H.264 的格式在所谓的 “moov atom” 中存储元数据。它是文件的一部分,包含整个文件的索引信息。
为了开始播放,播放器首先需要读取元数据。这是通过发送一个带有 start=0 参数的特殊请求来完成的。许多编码软件将元数据插入到文件的末尾。这对于伪流媒体来说是不理想的,因为播放器必须在开始播放之前下载整个文件。如果元数据位于文件的开头,对于 Angie 来说,只需开始发送文件内容即可。如果元数据位于文件的末尾,Angie 必须读取整个文件并准备一个新的流,以便元数据在媒体数据之前。这涉及一些 CPU、内存和磁盘 I/O 的开销,因此最好提前 准备 原始文件以进行伪流媒体,而不是让 Angie 在每个这样的请求上都执行此操作。
该模块还支持 HTTP 请求的 end
参数,该参数设置播放的结束点。end
参数可以与 start 参数一起指定,也可以单独指定:
http://example.com/elephants_dream.mp4?start=238.88&end=555.55
对于包含非零 start
或 end
参数的匹配请求,Angie 将从文件中读取元数据,准备请求时间范围的流,并将其发送给客户端。这与上述描述的开销相同。
如果 start
参数指向非关键视频帧,则视频的开头将会损坏。为了解决此问题,视频可以在 start
点之前添加关键帧以及它们之间的所有中间帧。这些帧将通过编辑列表从播放中隐藏。
如果匹配请求不包含 start
和 end
参数,则没有开销,文件将简单地作为静态资源发送。一些播放器也支持字节范围请求,因此不需要此模块。
小心
如果之前使用了第三方的 mp4 模块,则应将其禁用。
对于 FLV 文件,提供了类似的伪流媒体支持:FLV。 在周围位置启用模块处理。 设置用于处理 MP4 文件的缓冲区的初始大小。 在元数据处理期间,可能需要更大的缓冲区。其大小不得超过指定大小,否则 Angie 将返回 500(内部服务器错误)服务器错误,并记录以下消息: "/some/movie/file.mp4" mp4 moov atom 太大:12583268,您可能需要增加 mp4_max_buffer_size 对请求的 MP4 文件的传输进行速率限制。要计算限制,将 factor 乘以文件的平均比特率。 限制在达到由 mp4_limit_rate_after 设置的值后应用。 请求是单独进行速率限制的:如果客户端打开两个连接,结果速率翻倍。因此,考虑使用 limit_conn 和随附指令。 设置(以 播放时间 为单位)传输的媒体数据量触发由 mp4_limit_rate 设置的速率限制。 强制输出视频始终以关键视频帧开始。如果开始参数不指向关键帧,则初始帧将通过 mp4 编辑列表隐藏。编辑列表受到主要播放器和浏览器的支持,如 Chrome、Safari、QuickTime 和 ffmpeg,Firefox 部分支持。配置示例#
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#
mp4_buffer_size#
mp4_max_buffer_size#
mp4_limit_rate#
off
值禁用速率限制。on
值设置 factor 为 1.1
。mp4_limit_rate_after#
mp4_start_key_frame#