模块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 size ; | 默认值: | mp4_buffer_size 512K; | 上下文: | http , server , location | 设置处理MP4文件的初始内存大小。 语法: | 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"
|