ngx_http_mp4_module 模块

优质
小牛编辑
131浏览
2023-12-01

模块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"

翻译: litianqing