模块 ngx_http_mp4_module
Example Configuration Directives mp4 mp4_buffer_size mp4_max_buffer_size mp4_limit_rate mp4_limit_rate_after mp4_start_key_frame |
该ngx_http_mp4_module
模块为 MP4 文件提供伪流服务器端支持。此类文件通常具有.mp4
、.m4v
或.m4a
文件扩展名。
伪流媒体与兼容的媒体播放器结合使用。播放器向服务器发送一个 HTTP 请求,并在查询字符串参数中指定开始时间(简单命名
start
并以秒为单位指定),服务器使用流进行响应,使其开始位置与请求的时间相对应,例如:
http://example.com/elephants_dream.mp4?start=238.88
这允许随时执行随机搜索,或在时间线中间开始播放。
为了支持查找,基于 H.264 的格式将元数据存储在所谓的“moov 原子”中。它是文件的一部分,保存整个文件的索引信息。
要开始播放,播放器首先需要读取元数据。这是通过发送带有参数的特殊请求来完成的
start=0
。许多编码软件在文件末尾插入元数据。这对于伪流媒体来说不是最佳选择,因为播放器必须在开始播放之前下载整个文件。如果元数据位于文件的开头,则 nginx 只需开始发送回文件内容就足够了。如果元数据位于文件末尾,nginx 必须读取整个文件并准备一个新流,以便元数据位于媒体数据之前。这涉及一些 CPU、内存和磁盘 I/O 开销,因此最好提前准备用于
伪流的原始文件,而不是让 nginx 对每个此类请求都执行此操作。
该模块还支持end
HTTP 请求 (1.5.13) 的参数,用于设置播放的终点。参数end
可以与参数一起指定
start
,也可以单独指定:
http://example.com/elephants_dream.mp4?start=238.88&end=555.55
对于带有非零
start
或end
参数的匹配请求,nginx将从文件中读取元数据,准备具有请求时间范围的流,并将其发送到客户端。这具有与上述相同的开销。
如果start
参数指向非关键视频帧,则此类视频的开头将被破坏。要解决此问题,可以在视频
前面添加点之前的关键帧start
以及它们之间的所有中间帧。这些帧将通过编辑列表 (1.21.4) 隐藏起来以防止播放。
如果匹配的请求不包含
start
和end
参数,则不会产生任何开销,并且文件将仅作为静态资源发送。有些播放器还支持字节范围请求,因此不需要此模块。
该模块不是默认构建的,需要通过
--with-http_mp4_module
配置参数启用。
如果以前使用过第三方 mp4 模块,则应将其禁用。
ngx_http_flv_module模块 为 FLV 文件提供类似的伪流支持 。
配置示例
location /video/ { mp4; mp4_buffer_size 1m; mp4_max_buffer_size 5m; mp4_limit_rate on; mp4_limit_rate_after 30s; }
指令
句法: |
mp4; |
---|---|
默认: | — |
语境: |
location |
打开周围位置的模块处理。
句法: |
mp4_buffer_size |
---|---|
默认: |
mp4_buffer_size 512K; |
语境: |
http , server ,location |
size
设置用于处理 MP4 文件的缓冲区的
初始值。
句法: |
mp4_max_buffer_size |
---|---|
默认: |
mp4_max_buffer_size 10M; |
语境: |
http , server ,location |
在元数据处理期间,可能需要更大的缓冲区。它的大小不能超过指定的size
,否则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 off; |
语境: |
http , server ,location |
限制向客户端传输响应的速率。该速率根据所提供的 MP4 文件的平均比特率进行限制。要计算速率,请将比特率乘以指定的
factor
。特殊值“ on
”对应系数1.1。特殊值“ off
”禁用速率限制。该限制是按请求设置的,因此如果客户端同时打开两个连接,则总体速率将是指定限制的两倍。
该指令可作为我们 商业订阅的一部分提供。
句法: |
mp4_limit_rate_after |
---|---|
默认: |
mp4_limit_rate_after 60s; |
语境: |
http , server ,location |
设置媒体数据的初始量(以播放时间衡量),之后向客户端进一步传输响应将受到速率限制。
该指令可作为我们 商业订阅的一部分提供。
句法: |
mp4_start_key_frame |
---|---|
默认: |
mp4_start_key_frame off; |
语境: |
http , server ,location |
该指令出现在版本 1.21.4 中。
强制输出视频始终以关键视频帧开始。如果start
参数不指向关键帧,则使用 mp4 编辑列表隐藏初始帧。主要播放器和浏览器(例如 Chrome、Safari、QuickTime 和 ffmpeg)均支持编辑列表,Firefox 部分支持。