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参数一起指定或单独指定:
对于具有非零 start
或 end
参数的匹配请求,Angie将从文件中读取元数据,准备具有请求时间范围的流,并将其发送给客户端。这与上述描述的开销相同。
如果 start
参数指向非关键视频帧,则此类视频的开头将被破坏。为解决此问题,视频 可以 在 start
点之前和它们之间的所有中间帧之前插入关键帧。这些帧将通过编辑列表从播放中隐藏。
如果匹配请求不包含 start
和 end
参数,则没有开销,文件仅作为静态资源发送。一些播放器还支持字节范围请求,因此不需要此模块。
小心
如果之前使用了第三方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#
在周围位置启用模块处理。
mp4_buffer_size#
设置用于处理MP4文件的缓冲区的初始大小。
mp4_max_buffer_size#
在处理元数据期间,可能需要更大的缓冲区。其大小不能超过指定大小,否则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#
限制将请求的MP4文件传输给客户端的速度。要计算限制,factor 乘以文件的平均比特率。
off
值禁用速率限制。on
值设置 factor 为1.1
。限制在达到 mp4_limit_rate_after 设置的值后应用。
请求的速率限制是单独的:如果客户端打开两个连接,结果速率加倍。在这方面,请考虑使用 limit_conn 和相关指令。
mp4_limit_rate_after#
设置(在 playback time 中)传输的媒体数据量,以触发 mp4_limit_rate 设置的速率限制。
mp4_start_key_frame#
强制输出视频始终以关键视频帧开始。如果start参数不指向关键帧,初始帧将使用mp4编辑列表隐藏。主要播放器和浏览器如Chrome、Safari、QuickTime和ffmpeg支持编辑列表,Firefox部分支持。