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
参数,就不会有额外开销,而文件仅仅是以静态资源被发送。 一些播放器也支持字节范围请求,所以就根本不需要这个模块。
这个模块默认是不安装的,需要通过 --with-http_mp4_module
来配置开启。
假如你在使用第三方的mp4模块,一定要关闭该模块。
一个简单的支持FLV文件的伪流媒体由模块 ngx_http_flv_module 提供。
示例配置
location /video/ { mp4; mp4_buffer_size 1m; mp4_max_buffer_size 5m; }
指令
语法: | mp4; |
默认值: | — |
上下文: | location |
配置开启该模块处理当前路径。
语法: | mp4_buffer_size |
默认值: | mp4_buffer_size 512K; |
上下文: | http , server , location |
设置处理MP4文件的初始内存大小。
语法: | mp4_max_buffer_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"
翻译: litianqing |