伪流媒体与兼容的Flash播放器一同工作。播放器发送给服务器一个带有指定开始时间的查询字符串参数(名称为start,定义为秒数)的请求,服务器响应指定查询开始时间的流,例如:
http://example.com/elephants_dream.mp4?start=238.88
这允许在任何时候执行随机搜索,或在时间线中间开始回放。
为了支持搜索,基于H.264格式存储媒体信息到一个所谓的“moov atom”中。这是文件中的一部分,保存整个文件的信息索引。
为了开始回放,播放器首先需要读取媒体信息。这需要发送一个带着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和end参数,就没有额外开销,文件只是简单的作为静态资源发送。一些播放器还支持byte-range请求,因此不需要这个模块。
这个模块默认不会构建,需要通过–with-http_mp4_module参数开启。
如果第三方mp4模块之前使用过,该模块应该禁用。
简单的flv伪流媒体支持通过ngx_http_flv_module模块提供。
示例配置
location /video/ { mp4; mp4_buffer_size 1m; mp4_max_buffer_size 5m; mp4_limit_rate on; mp4_limit_rate_after 30s; }
mp4
语法:mp4
默认:—
上下文:location
在location块内开启模块功能。
mp4_buffer_size
语法:mp4_buffer_size size
默认:mp4_buffer_size 512K
上下文:http, server, location
设置用于处理MP4文件的初始缓冲区大小。
mp4_max_buffer_size
语法:mp4_max_buffer_size size
默认:mp4_max_buffer_size 10M
上下文:http, server, location
在处理媒体信息的过程中,一个更大的缓冲区是有必要的。它的大小不能超过指定的大小,否则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 on | off | factor
默认:mp4_limit_rate off
上下文:http, server, location
限制传输给客户端响应的速率。这个限速基于MP4文件的平均比特率。为了计算这个速率,比特率会乘以定义的factor(因数)。特殊值“on”为因数1.1。特殊值“off”禁用限速。限制是针对每个请求的,所以如果客户端同时打开两个连接,则总速率为两倍设置的值。
该指令对商业版本可用。
mp4_limit_rate_after
语法:mp4_limit_rate_after time
默认:mp4_limit_rate_after 60s
上下文:http, server, location
设置初始的媒体数据大小(以时间为单位),超过这个值后响应将会被限速。
该指令对商业版本可用。