ngx_http_mp4_module 模块

ngx_http_mp4_module 模块为 MP4 文件提供伪流服务器端支持。此类文件通常具有 .mp4、.m4v 或 .m4a 文件扩展名。

伪流与兼容的媒体播放器协同工作。播放器使用查询字符串参数中指定的开始时间(简单地命名为 start 并以秒为单位指定)向服务器发送 HTTP 请求,服务器以流响应,使其开始位置对应于请求的时间,例如:

http://example.com/elephants_dream.mp4?start=238.88

这允许在任何时间执行随机搜索,或在时间线中间开始播放。

为了支持搜索,基于 H.264 的格式将元数据存储在所谓的“moov atom”中。它是保存整个文件的索引信息的文件的一部分。

要开始播放,播放器首先需要读取元数据。这是通过发送带有 start=0 参数的特殊请求来完成的。许多编码软件在文件末尾插入元数据。这对于伪流来说不是最佳的,因为播放器必须在开始播放之前下载整个文件。如果元数据位于文件的开头,nginx 只需开始发送文件内容就足够了。如果元数据位于文件末尾,则 nginx 必须读取整个文件并准备新的流,以便元数据位于媒体数据之前。 这涉及到一些 CPU、内存和磁盘 I/O 开销,因此最好提前准备一个用于伪流传输的原始文件,而不是让 nginx 对每个此类请求都执行此操作。

该模块还支持设置播放结束点的 HTTP 请求 (1.5.13) 的 end 参数。 end 参数可以与 start 参数一起指定,也可以单独指定:

http://example.com/elephants_dream.mp4?start=238.88&end=555.55

对于具有非零 start 或 end 参数的匹配请求,nginx 将从文件中读取元数据,准备具有请求时间范围的流,并将其发送到客户端。这具有与上述相同的开销。

如果 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 指令

语 法:mp4;
默认值:—
上下文:location

在当前 location 配置块上启用 mp4 模块功能。

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 文件的平均比特率限制。为了计算速率,比特率乘以指定的因子。特殊值“on”对应于因子 1.1。特殊值“off”禁用速率限制。该限制是针对每个请求设置的,因此如果客户端同时打开两个连接,则总体速率将是指定限制的两倍。

该指令作为我们商业订阅的一部分提供。

mp4_limit_rate_after 指令

语 法:mp4_limit_rate_after time;
默认值:mp4_limit_rate_after 60s;
上下文:http, server, location

设置媒体数据的初始数量(以播放时间衡量),之后对客户端的响应的进一步传输将受到速率限制。

该指令作为我们商业订阅的一部分提供。

mp4_start_key_frame 指令

语 法:mp4_start_key_frame on | off;
默认值:mp4_start_key_frame off;
上下文:http, server, location

该指令出现在 1.21.4 版中。

强制输出视频始终以关键视频帧开头。如果 start 参数未指向关键帧,则使用 mp4 编辑列表隐藏初始帧。Chrome、Safari、QuickTime 和 ffmpeg 等主要播放器和浏览器都支持编辑列表,Firefox 部分支持。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号