Nginx 中 ngx_http_mp4_module 模块的使用
一、概述
模块 ngx_http_mp4_module 为 H.264/AAC 文件(主要是以 .mp4、.m4v、和.m4a 为扩展名的文件)提供伪流媒体服务端支持。
伪流媒体是与 Flash 播放器一起配合使用的。播放器向服务端发送 HTTP 请求,请求中的查询串是以开始时间为参数的(以 start 简单命名,并以秒为单位指定),而服务端以流响应,这样流的开始位置就能于请求中的时间相对应。 例如:
http://example.com/elephants_dream.mp4?start=238.88
这允许在任何时间执行随机搜索,或在时间线中间开始播放。
二、实现随机访问
为了支持随机访问,H.264格式会将元数据放到 "moov atom"中。 "moov atom" 是文件的一部分,放有整个文件的索引信息。为了开启回放,播放器首先需要读取元数据。 这是通过发送一 start=0 为参数请求来完成的。 许多编码软件会将元数据插入到文件末尾, 这样做对伪流媒体来说是不好的:元数据需要在文件开始时定位好,否则整个文件需要下载完才能开始播放。 如果文件组织的很好(将元数据放到文件开头),那么 nginx 仅仅返回文件的内容, 否则,nginx 不得不读取文件并准备一个新的流,将元数据放在媒体数据前面, 这将导致一些CPU,内存,磁盘I/O开销。 所以一个比较好的做法是为伪流媒体准备文件, 而不是让 nginx 处理请求时去处理。
对于匹配有非零 start 参数的请求,nginx 从文件中读取元数据,从请求的偏移位置开始准备流数据发送给客户端。 这与上面描述的情况有同样的开销。如果匹配的请求没有包含 start 参数,就不会有额外开销,而文件仅仅是以静态资源被发送。 一些播放器也支持字节范围请求,所以就根本不需要这个模块。
该模块还支持设置播放结束点的 HTTP 请求 (1.5.13) 的 end 参数。 end 参数可以与 start 参数一起指定,也可以单独指定,如下:
http://example.com/elephants_dream.mp4?start=238.88&end=555.55
对于具有非零 start 或 end 参数的匹配请求,nginx 将从文件中读取元数据,准备具有请求时间范围的流,并将其发送到客户端。这具有与上述相同的开销。
如果 start 参数指向非关键视频帧,则该视频的开头将被破坏。为了解决这个问题,视频可以在开始点之前加上关键帧以及它们之间的所有中间帧。这些帧将使用编辑列表 (1.21.4) 从播放中隐藏。
如果匹配的请求不包含 start 和 end 参数,则没有开销,文件仅作为静态资源发送。一些播放器还支持字节范围请求,因此不需要此模块。
这个模块默认是不安装的,需要通过 --with-http_mp4_module 来配置开启。假如你在使用第三方的 mp4 模块,一定要关闭该模块。一个简单的支持 FLV 文件的伪流媒体由模块 ngx_http_flv_module 提供。
三、实例
location /video/ {
mp4;
mp4_buffer_size 1m;
mp4_max_buffer_size 5m;
}
1、mp4 指令
语法: mp4;
默认值: —
上下文: location
配置开启该模块处理当前路径。
2、mp4_buffer_size 指令
语法: mp4_buffer_size size;
默认值: mp4_buffer_size 512K;
上下文: http, server, location
设置处理MP4文件的初始内存大小。
3、mp4_max_buffer_size 指令
语法: mp4_max_buffer_size size;
默认值: mp4_max_buffer_size 10M;
上下文: http, server, location
在处理元数据时,可能必需较大的缓存。 它的大小不能超过size指定的值, 否则nginx将会返回服务器错误, 500 (Internal Server Error), 并记录如下日志:
"/some/movie/file.mp4" mp4 moov atom is too large:
12583268, you may want to increase mp4_max_buffer_size"
4、mp4_limit_rate 指令
语法:mp4_limit_rate on | off | factor;
默认值:mp4_limit_rate off;
上下文:http, server, location
限制对客户端的响应传输速率。该速率受所提供 MP4 文件的平均比特率限制。为了计算速率,比特率乘以指定的因子。特殊值“on”对应于因子 1.1。特殊值“off”禁用速率限制。该限制是针对每个请求设置的,因此如果客户端同时打开两个连接,则总体速率将是指定限制的两倍。该指令作为我们商业订阅的一部分提供。
5、mp4_limit_rate_after 指令
语法:mp4_limit_rate_after time;
默认值:mp4_limit_rate_after 60s;
上下文:http, server, location
设置媒体数据的初始数量(以播放时间衡量),之后对客户端的响应的进一步传输将受到速率限制。该指令作为我们商业订阅的一部分提供。
6、mp4_start_key_frame 指令
语法:mp4_start_key_frame on | off;
默认值:mp4_start_key_frame off;
上下文:http, server, location
该指令出现在 1.21.4 版中。强制输出视频始终以关键视频帧开头。如果 start 参数未指向关键帧,则使用 mp4 编辑列表隐藏初始帧。Chrome、Safari、QuickTime 和 ffmpeg 等主要播放器和浏览器都支持编辑列表,Firefox 部分支持。