vod: 基于 NGINX 的 VOD 打包器
安装
您可以在任何基于 RHEL 的发行版中安装此模块,包括但不限于:
- RedHat Enterprise Linux 7, 8, 9 和 10
- CentOS 7, 8, 9
- AlmaLinux 8, 9
- Rocky Linux 8, 9
- Amazon Linux 2 和 Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-vod
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-vod
通过在 /etc/nginx/nginx.conf 顶部添加以下内容来启用该模块:
load_module modules/ngx_http_vod_module.so;
本文档描述了 nginx-module-vod v1.33,于 2024 年 1 月 1 日发布。
nginx-vod-module 
有关直播视频流,请使用 Media-Framework。
特性
-
动态将 MP4 文件重新打包为 DASH、HDS、HLS、MSS
-
工作模式:
- 本地 - 提供本地可访问的文件(本地磁盘/NFS 挂载)
- 远程 - 通过 HTTP 使用范围请求提供可访问的文件
-
映射 - 根据以 JSON 格式编码的规范提供文件。JSON 可以从远程服务器获取,或从本地文件读取
-
自适应比特率支持
-
播放列表支持(一个接一个播放多个不同的媒体文件) - 仅限映射模式
-
模拟直播支持(从 MP4 文件生成直播流) - 仅限映射模式
-
在本地/映射模式下找不到文件的回退支持(在多数据中心环境中非常有用)
-
视频编码:H264、H265(DASH/HLS)、AV1(DASH/HLS)、VP8(DASH)、VP9(DASH)
-
音频编码:AAC、MP3(HLS/HDS/MSS)、AC-3(DASH/HLS)、E-AC-3(DASH/HLS)、VORBIS(DASH)、OPUS(DASH)、FLAC(HLS)、DTS(HLS)
-
字幕支持 -
输入: 1. WebVTT 2. SRT 3. DFXP/TTML 4. CAP(Cheetah)
输出: 1. DASH - 单个 WebVTT 或 SMPTE-TT 段(可配置) 2. HLS - 分段 WebVTT(m3u8) 3. MSS - 转换为 TTML 并打包在分段 MP4 中(不支持样式)
-
仅音频/仅视频文件
-
替代音频版本 - 同时支持:
- 生成具有不同音频版本的清单,允许在客户端进行选择
-
将来自不同文件/轨道的音频和视频流混合在一起 - 提供了服务单个视频的不同音频版本的能力,而无需客户端的任何特殊支持。
-
多音频/视频 MP4 文件的轨道选择
-
播放速率更改 - 0.5x 到 2x(需要 libavcodec 和 libavfilter)
-
源文件剪辑(仅从 I 帧到 P 帧)
-
支持可变段长度 - 使播放器能够快速选择最佳比特率,而不会因整个视频的短段而增加开销
-
剪辑 MP4 文件以进行渐进式下载播放
-
缩略图捕获(需要 libavcodec)和调整大小(需要 libswscale)
-
音量映射(需要 libavcodec) - 返回包含每个间隔音量级别的 CSV
-
解密 CENC 加密的 MP4 文件(可以使用 MP4Box 创建此类文件)
-
DASH:通用加密(CENC)支持
-
MSS:PlayReady 加密支持
-
HLS:生成 I 帧播放列表(EXT-X-I-FRAMES-ONLY)
-
HLS:支持 AES-128 / SAMPLE-AES 加密
限制
-
在渐进式下载中不支持轨道选择和播放速率更改
-
启用加密时不支持生成 I 帧播放列表
-
仅在 Linux 上测试
rpm -ihv http://installrepo.kaltura.org/releases/kaltura-release.noarch.rpm
yum install kaltura-nginx
#### Debian/Ubuntu deb 包
*Ubuntu 注意:在尝试安装 kaltura-nginx 之前,您还必须确保启用了 multiverse 仓库*
对于 Debian Wheezy [7]、Debian Jessie [8]、Ubuntu 14.04 和 14.10,添加此仓库:
```sh
## wget -O - http://installrepo.kaltura.org/repo/apt/debian/kaltura-deb-curr.gpg.key|apt-key add -
## echo "deb [arch=amd64] http://installrepo.kaltura.org/repo/apt/debian propus main" > /etc/apt/sources.list.d/kaltura.list
对于 Ubuntu 16.04、16.10 添加此仓库:
## wget -O - http://installrepo.kaltura.org/repo/apt/xenial/kaltura-deb-curr-256.gpg.key|apt-key add -
## echo "deb [arch=amd64] http://installrepo.kaltura.org/repo/apt/xenial propus main" > /etc/apt/sources.list.d/kaltura.list
对于 Ubuntu 20.04 添加此仓库:
## wget -O - http://installrepo.kaltura.org/repo/aptn/focal/kaltura-deb-256.gpg.key|apt-key add -
## echo "deb [arch=amd64] http://installrepo.kaltura.org/repo/aptn/focal quasar main" > /etc/apt/sources.list.d/kaltura.list
然后安装 kaltura-nginx 包:
## apt-get update
## apt-get install kaltura-nginx
如果您希望使用以下功能: - 缩略图捕获 - 播放速率更改 - 0.5x 到 2x
您还需要安装 kaltura-ffmpeg (>= 3.1) 包。
URL 结构
基本 URL 结构
nginx-vod-module URL 的基本结构为:
http://<domain>/<location>/<fileuri>/<filename>
其中:
* domain - nginx-vod-module 服务器的域名
* location - nginx 配置中指定的位置
* fileuri - 指向 mp4 文件的 URI:
* 本地模式 - 根据根 / alias nginx.conf 指令确定完整文件路径
* 映射模式 - 根据从上游/本地文件接收的 JSON 确定完整文件路径
* 远程模式 - 从上游以块的形式读取 mp4 文件
* 注意:在映射和远程模式中,上游请求的 URL 为 http://<upstream>/<location>/<fileuri>?<extraargs>
(extraargs 由 vod_upstream_extra_args 参数确定)
* filename - 详细信息如下
多 URL 结构
多 URL 用于在单个 URL 上编码多个 URL。多 URL 可用于指定多个不同 MP4 文件的 URL,这些文件应一起包含在 DASH MPD 中。
多 URL 的结构为:
http://<domain>/<location>/<prefix>,<middle1>,<middle2>,<middle3>,<postfix>.urlset/<filename>
上述示例 URL 表示 3 个 URL:
* http://<domain>/<location>/<prefix><middle1><postfix>/<filename>
* http://<domain>/<location>/<prefix><middle2><postfix>/<filename>
* http://<domain>/<location>/<prefix><middle3><postfix>/<filename>
后缀 .urlset(可以使用 vod_multi_uri_suffix 更改)表示该 URL 应被视为多 URL。
例如 - URL http://example.com/hls/videos/big_buck_bunny_,6,9,15,00k.mp4.urlset/master.m3u8 将返回一个清单,包含:
* http://example.com/hls/videos/big_buck_bunny_600k.mp4/index.m3u8
* http://example.com/hls/videos/big_buck_bunny_900k.mp4/index.m3u8
* http://example.com/hls/videos/big_buck_bunny_1500k.mp4/index.m3u8
URL 路径参数
以下参数在 URL 路径中受支持:
* clipFrom - 从视频开始的毫秒偏移量,生成的流应从此处开始。
例如,.../clipFrom/10000/... 将生成一个从视频开始 10 秒的流。
* clipTo - 从视频开始的毫秒偏移量,生成的流应在此处结束。
例如,.../clipTo/60000/... 将生成一个截断到 60 秒的流。
* tracks - 可用于选择特定的音频/视频轨道。参数的结构为:v<id1>-v<id2>-a<id1>-a<id2>...
例如,.../tracks/v1-a1/... 将选择第一个视频轨道和第一个音频轨道。
默认是包含所有轨道。
* shift - 可用于对一个或多个流应用时间偏移。参数的结构为:v<vshift>-a<ashift>-s<sshift>
例如,.../shift/v100/... 将对视频时间戳应用 100ms 的前移。
文件名结构
文件名的结构为:
<basename>[<seqparams>][<fileparams>][<trackparams>][<langparams>].<extension>
其中:
* basename + extension - 选项集是打包器特定的(以下列表适用于默认设置):
* dash - manifest.mpd
* hds - manifest.f4m
* hls 主播放列表 - master.m3u8
* hls 媒体播放列表 - index.m3u8
* mss - manifest
* thumb - thumb-<offset>[<resizeparams>].jpg(offset 是缩略图视频的偏移量,单位为毫秒)
* volume_map - volume_map.csv
* seqparams - 可用于按 ID 选择特定序列(在映射 JSON 中提供),例如 master-sseq1.m3u8。
* fileparams - 可用于在使用多 URL 时按索引选择特定序列。
例如,manifest-f1.mpd 将仅从第一个 URL 返回 MPD。
* trackparams - 可用于选择特定的音频/视频轨道。
例如,manifest-a1.f4m 将返回仅包含每个序列的第一个音频流的 F4M。
默认是包含每个文件的第一个音频和第一个视频轨道。
文件名中选择的轨道与通过 /tracks/ 路径参数选择的轨道进行 AND 操作。
v0/a0 分别选择所有视频/音频轨道。
a/v 参数可以与 f/s 组合,例如 f1-v1-f2-a1 = file1 的 video1 + file2 的 audio1, f1-f2-v1 = file1 的 video1 + file2 的 video1。
* langparams - 可用于根据其语言(ISO639-3 代码)过滤音轨/字幕。
例如,master-leng.m3u8 将仅返回英文音轨。
* resizeparams - 可用于调整返回的缩略图图像大小。例如,thumb-1000-w150-h100.jpg 捕获视频 1 秒处的缩略图,并将其调整为 150x100。如果省略其中一个维度,则其值设置为保持图像的宽高比。
映射响应格式
当配置为在映射模式下运行时,nginx-vod-module 向配置的上游服务器发出 HTTP 请求,以接收应生成的媒体流布局。 响应必须为 JSON 格式。
本节包含一些简单示例,后面是支持的对象和字段的参考。 但首先,几个定义:
Source Clip- 从单个媒体文件提取的一组音频和/或视频帧(轨道)Generator- 可以生成音频/视频帧的组件。目前,唯一支持的生成器是静音生成器。Filter- 可以应用于音频/视频帧的操作。支持以下过滤器:- 速率(速度)更改 - 适用于音频和视频
- 音量更改
- 混合 - 可用于将多个音轨合并在一起,或将源 A 的音频与源 B 的视频合并
Clip- 对一组源剪辑应用零个或多个过滤器的结果Dynamic Clip- 内容未知的剪辑,例如目标广告内容Sequence- 一组应依次播放的剪辑。Set- 作为自适应集合一起播放的多个序列,每个序列必须具有相同数量的剪辑。
简单映射
以下 JSON 将请求 URI 映射到单个 MP4 文件:
{
"sequences": [
{
"clips": [
{
"type": "source",
"path": "/path/to/video.mp4"
}
]
}
]
}
在使用多 URL 时,这是唯一允许的 JSON 模式。换句话说,无法使用多 URL 组合更复杂的 JSON。
自适应集合
作为使用多 URL 的替代方案,可以通过 JSON 定义自适应集合:
{
"sequences": [
{
"clips": [
{
"type": "source",
"path": "/path/to/bitrate1.mp4"
}
]
},
{
"clips": [
{
"type": "source",
"path": "/path/to/bitrate2.mp4"
}
]
}
]
}
播放列表
以下 JSON 将播放 35 秒的视频1,随后播放 22 秒的视频2:
{
"durations": [ 35000, 22000 ],
"sequences": [
{
"clips": [
{
"type": "source",
"path": "/path/to/video1.mp4"
},
{
"type": "source",
"path": "/path/to/video2.mp4"
}
]
}
]
}
过滤器
以下 JSON 取视频1,以 x1.5 的速度播放,并将结果的音频与视频2 的音频混合, 在将其音量降低到 50% 后:
{
"sequences": [
{
"clips": [
{
"type": "mixFilter",
"sources": [
{
"type": "rateFilter",
"rate": 1.5,
"source": {
"type": "source",
"path": "/path/to/video1.mp4"
}
},
{
"type": "gainFilter",
"gain": 0.5,
"source": {
"type": "source",
"path": "/path/to/video2.mp4",
"tracks": "a1"
}
}
]
}
]
}
]
}
连续直播
以下 JSON 是连续直播流的示例(=所有视频具有完全相同的编码参数的直播流)。 实际上,此 JSON 必须由某个脚本生成,因为它是时间依赖的。 (请参见 test/playlist.php 的示例实现)
{
"playlistType": "live",
"discontinuity": false,
"segmentBaseTime": 1451904060000,
"firstClipTime": 1451917506000,
"durations": [83000, 83000],
"sequences": [
{
"clips": [
{
"type": "source",
"path": "/path/to/video1.mp4"
},
{
"type": "source",
"path": "/path/to/video2.mp4"
}
]
}
]
}
非连续直播
以下 JSON 是非连续直播流的示例(=视频具有不同编码参数的直播流)。 实际上,此 JSON 必须由某个脚本生成,因为它是时间依赖的 (请参见 test/playlist.php 的示例实现)
{
"playlistType": "live",
"discontinuity": true,
"initialClipIndex": 171,
"initialSegmentIndex": 153,
"firstClipTime": 1451918170000,
"durations": [83000, 83000],
"sequences": [
{
"clips": [
{
"type": "source",
"path": "/path/to/video1.mp4"
},
{
"type": "source",
"path": "/path/to/video2.mp4"
}
]
}
]
}
映射参考
Set(映射 JSON 中的顶级对象)
必填字段:
* sequences - Sequence 对象数组。
映射必须至少包含一个序列,最多 32 个序列。
可选字段:
* id - 标识集合的字符串。可以通过 $vod_set_id 检索 id。
* playlistType - 字符串,可以设置为 live、vod 或 event(仅支持 HLS 播放列表),默认值为 vod。
* durations - 表示剪辑持续时间的整数数组,单位为毫秒。
如果映射包含每个序列多个剪辑,则该字段是必填的。
如果指定,则该数组必须包含至少一个元素,最多 128 个元素。
* discontinuity - 布尔值,指示每个序列中的不同剪辑是否具有不同的媒体参数。该字段根据交付协议具有不同的表现形式 - 值为 true 将在 HLS 中生成 #EXT-X-DISCONTINUITY,在 DASH 中生成多周期 MPD。默认值为 true,仅在媒体文件以完全相同的参数转码时设置为 false(例如,在 AVC 中,剪辑应具有完全相同的 SPS/PPS)。
* segmentDuration - 整数,设置段持续时间,单位为毫秒。此字段如果指定,将优先于 vod_segment_duration 中设置的值。
* consistentSequenceMediaInfo - 布尔值,目前仅影响 DASH。当设置为 true(默认)时,MPD 将在每个周期元素中报告相同的媒体参数。设置为 false 可能会对长序列的性能产生严重影响(nginx-vod-module 必须读取映射中包含的所有剪辑的媒体信息,以生成 MPD)。
* referenceClipIndex - 整数,设置应用于检索清单请求的视频元数据的剪辑的(基于 1 的)索引(编解码器、宽度、高度等)。
如果 consistentSequenceMediaInfo 设置为 false,则此参数无效 - 所有剪辑都会被解析。如果未指定此参数,nginx-vod-module 默认使用最后一个剪辑。
* notifications - 通知对象数组(见下文),当请求段时,所有在段的开始/结束时间之间的通知都会被触发。
通知必须按增序偏移顺序排列。
* clipFrom - 整数,包含一个时间戳,指示返回的流应从何处开始。
设置此参数相当于在 URL 上传递 /clipFrom/。
* clipTo - 整数,包含一个时间戳,指示返回的流应在何处结束。
设置此参数相当于在 URL 上传递 /clipTo/。
* cache - 布尔值,如果设置为 false,则映射响应将不会保存到缓存中(vod_mapping_cache)。
默认值为 true。
* closedCaptions - 包含语言和任何嵌入的 CEA-608 / CEA-708 字幕 ID 的闭合字幕对象数组(见下文)。如果提供了空数组,模块将在每个 EXT-X-STREAM-INF 标签上输出 CLOSED-CAPTIONS=NONE。如果 JSON 中未出现该列表,模块将不会在播放列表中输出任何 CLOSED-CAPTIONS 字段。
直播字段:
* firstClipTime - 整数,所有直播播放列表的必填项,除非指定了 clipTimes。
包含播放列表中第一个剪辑的绝对时间,单位为毫秒,自纪元以来(unixtime x 1000)
* clipTimes - 整数数组,设置播放列表中所有剪辑的绝对时间,单位为毫秒,自纪元以来(unixtime x 1000)。此字段仅在 discontinuity 设置为 true 时可用。时间戳可以包含间隙,但不允许重叠(clipTimes[n + 1] >= clipTimes[n] + durations[n])
* segmentBaseTime - 整数,连续直播流的必填项,包含流的第一个段的绝对时间,单位为毫秒,自纪元以来(unixtime x 1000)。
此值在播放过程中不得更改。
对于非连续直播流,此字段是可选的:
* 如果未设置,则在播放列表中将使用顺序段索引。
在这种情况下,生成映射 JSON 的上游服务器必须保持状态,并在每次从播放列表中删除剪辑时更新 initialSegmentIndex。
* 如果设置,则剪辑之间的时间间隔不得低于 vod_segment_duration。
* firstClipStartOffset - 整数,可选,以毫秒为单位测量。此字段包含第一个剪辑时间与第一个剪辑的原始开始时间之间的差值 -
它在最初添加时的时间(在直播窗口移动之前)
* initialClipIndex - 整数,对于混合具有不同编码参数(SPS/PPS)的非连续直播流是必填的,包含播放列表中第一个剪辑的索引。
每当剪辑从播放列表的头部推出时,此值必须增加 1。
* initialSegmentIndex - 整数,对于未设置 segmentBaseTime 的直播流是必填的,包含播放列表中第一个段的索引。
每当剪辑从播放列表的头部推出时,此值必须增加剪辑中的段数。
* presentationEndTime - 整数,可选,以毫秒为单位,自纪元以来。
提供时,模块将当前时间与提供的值进行比较,
如果 presentationEndTime 已过,则信号结束直播演示。
例如,在 HLS 中,此参数控制是否应在媒体播放列表中包含 #EXT-X-ENDLIST 标签。
当未提供该参数时,模块将不会发出直播演示结束的信号。
* expirationTime - 整数,可选,以毫秒为单位,自纪元以来。
提供时,模块将当前时间与提供的值进行比较,
如果 expirationTime 已过,模块将返回清单请求的 404 错误
(段请求将继续提供)。
当 presentationEndTime 和 expirationTime 都已过时,presentationEndTime 优先,即清单请求将被提供并信号结束演示。
* liveWindowDuration - 整数,可选,提供了一种覆盖配置中指定的 vod_live_window_duration 的方式。如果该值超过 vod_live_window_duration 中指定的绝对值,则将被忽略。
* timeOffset - 整数,设置在提供直播请求时应应用于服务器时钟的偏移量。此参数可用于测试未来/过去事件。
Sequence
必填字段:
* clips - Clip 对象数组(必填)。元素的数量必须与集合中指定的持续时间数组的数量匹配。如果未指定持续时间数组,则剪辑数组必须包含单个元素。
可选字段:
* id - 标识序列的字符串。可以通过 $vod_sequence_id 检索 id。
* language - 3 字母(ISO-639-2)语言代码,此字段优先于媒体文件中指定的任何语言(MP4 mdhd atom)
* label - 标识序列的友好字符串。如果指定了语言,则将自动派生默认标签 - 例如,如果语言为 ita,则默认使用 italiano 作为标签。
* bitrate - 可用于设置不同媒体类型的比特率的对象,以比特每秒为单位。例如,{"v": 900000, "a": 64000}。如果未提供比特率,nginx-vod-module 将根据序列中的最后一个剪辑进行估算。
* avg_bitrate - 可用于设置不同媒体类型的平均比特率的对象,以比特每秒为单位。有关示例对象,请参见上面的 bitrate。
Clip(抽象)
必填字段:
* type - 定义剪辑类型的字符串。允许的值为:
* source
* rateFilter
* mixFilter
* gainFilter
* silence
* concat
* dynamic
可选字段:
* keyFrameDurations - 整数数组,包含剪辑中视频关键帧的持续时间(以毫秒为单位)。
此属性只能在每个序列的顶级剪辑中提供,在嵌套剪辑中提供此属性无效。
提供关键帧持续时间使模块能够:
1. 将段对齐到关键帧
2. 在清单中报告正确的段持续时间 - 提供了一种替代设置
vod_manifest_segment_durations_mode 为 accurate 的方法,该方法不支持多剪辑
媒体集(出于性能原因)。
* firstKeyFrameOffset - 整数,剪辑中第一个视频关键帧的偏移量,
以毫秒为单位,相对于 firstClipTime。如果未提供,默认值为 0。
源剪辑
必填字段:
* type - 字符串,值为 source
* path - 字符串,包含 MP4 文件的路径。字符串 "empty" 可用于表示
一个空的字幕文件(在播放列表中仅有一些视频具有字幕时非常有用)
可选字段:
* id - 标识源剪辑的字符串
* sourceType - 设置应使用的接口以读取 MP4 文件,允许的值为:
file 和 http。默认情况下,如果设置了 vod_remote_upstream_location,模块使用 http,
否则使用 file。
* tracks - 字符串,指定应使用的轨道,默认值为 "v1-a1",
这意味着第一个视频轨道和第一个音频轨道
* clipFrom - 整数,指定一个毫秒偏移量,从媒体文件的开头开始加载帧
* encryptionKey - base64 编码的字符串,包含应用于解密文件的密钥(128/192/256 位)。
* encryptionIv - base64 编码的字符串,包含应用于解密文件的 iv(128 位)。
* encryptionScheme - 用于加密文件的加密方案。目前,仅支持两种方案 - cenc 用于 MP4 文件,aes-cbc 用于字幕文件。
速率过滤器剪辑
必填字段:
* type - 字符串,值为 rateFilter
* rate - 指定加速因子的浮点数,例如,值为 2 意味着双倍速度。
允许的值范围为 0.5 - 2,最多两位小数
* source - 要执行速率过滤的剪辑对象
增益过滤器剪辑
必填字段:
* type - 字符串,值为 gainFilter
* gain - 指定增益因子的浮点数,例如,值为 2 意味着声音加倍。
增益必须为正,最多两位小数
* source - 要执行增益过滤的剪辑对象
混合过滤器剪辑
必填字段:
* type - 字符串,值为 mixFilter
* sources - 要混合的 Clip 对象数组。此数组必须包含至少一个剪辑,最多 32 个剪辑。
连接剪辑
必填字段:
* type - 字符串,值为 concat
* durations - 整数数组,表示 MP4 持续时间,单位为毫秒,
此数组的数量必须与 paths 数组的数量匹配。
可选字段:
* paths - 字符串数组,包含 MP4 文件的路径。必须指定 paths 或 clipIds 之一。
* clipIds - 字符串数组,包含源剪辑的 id。
通过向 vod_source_clip_map_uri 中指定的 uri 发出请求将 id 转换为路径。
必须指定 paths 或 clipIds 之一。
* tracks - 字符串,指定应使用的轨道,默认值为 "v1-a1",
这意味着第一个视频轨道和第一个音频轨道
* offset - 以毫秒为单位的整数,指示在连接流中第一个帧的时间戳偏移
* basePath - 应作为前缀添加到所有路径的字符串
* notifications - 通知对象数组(见下文),当请求段时,
所有在段的开始/结束时间之间的通知都会被触发。
通知必须按增序偏移顺序排列。
动态剪辑
必填字段:
* type - 字符串,值为 dynamic
* id - 唯一标识动态剪辑的字符串,用于将剪辑映射到其内容
通知
必填字段:
* offset - 以毫秒为单位的整数,指示通知应触发的时间。
当通知对象包含在媒体集中时,offset 相对于 firstClipTime
(对于 vod 为 0)。当通知对象包含在连接剪辑中时,offset 相对于
连接剪辑的开头。
* id - 标识通知的字符串,此 id 可通过 vod_notification_uri
使用变量 $vod_notification_id 引用
闭合字幕
必填字段:
* id - 标识嵌入字幕的字符串。此字段将成为 INSTREAM-ID 字段,必须
具有以下值之一:CC1、CC3、CC3、CC4 或 SERVICEn,其中 n 在 1 到 63 之间。
* label - 指示闭合字幕轨道语言的友好字符串。
可选字段:
* language - 3 字母(ISO-639-2)语言代码,指示闭合字幕轨道的语言。
安全
URL 加密
作为令牌化的替代方案,可以使用 URL 加密来防止攻击者能够构造可播放的 URL。URL 加密可以通过 https://github.com/kaltura/nginx-secure-token-module 实现,并支持 HLS 和 DASH(清单格式设置为 segmentlist)。
在安全性方面,CDN 令牌相较于 URL 加密的主要优势在于 CDN 令牌通常会过期,而加密的 URL 不会(获得可播放 URL 的人将能够无限期使用它)
媒体加密
Nginx-vod-module 支持 AES-128 和 SAMPLE-AES HLS 加密方案。媒体加密与 DRM(下面详细说明)之间的主要区别在于将加密密钥传递给客户端的机制。使用媒体加密,客户端通过向 nginx-vod-module 发出简单的 GET 请求来获取密钥,而使用 DRM,密钥在特定于供应商的许可证响应中返回。
媒体加密将保护媒体的问题简化为保护加密密钥的需要。 媒体段 URL(构成绝大多数流量)可以完全不受保护,并且可以被客户端和服务器之间的任何代理轻松缓存(与令牌化不同)。 然后,可以使用上述提到的方法之一(CDN 令牌、nginx 访问规则等)来保护加密密钥请求。
此外,可以配置 nginx-vod-module 通过 HTTPS 返回加密密钥,同时通过 HTTP 传递段。配置此项的方法是将 vod_segments_base_url 设置为 http://nginx-vod-host,并将 vod_base_url 设置为 https://nginx-vod-host。
DRM
Nginx-vod-module 能够为 MPEG DASH(CENC)、MSS Play Ready 和 FairPlay HLS 执行动态加密。 与媒体加密的情况一样,加密是在向客户端提供视频/音频段时执行的,因此,在使用 DRM 时,建议不要直接从 nginx-vod-module 向最终用户提供内容。 更具可扩展性的架构是使用代理服务器或 CDN 来缓存加密段。
为了执行加密,nginx-vod-module 需要几个参数,包括 key 和 key_id,这些参数通过 HTTP GET 请求从外部服务器获取。
vod_drm_upstream_location 参数指定用于访问 DRM 服务器的 nginx 位置,
请求 uri 使用 vod_drm_request_uri 配置(此参数可以包含 nginx 变量)。
DRM 服务器的响应是 JSON,格式如下:
[{
"pssh": [{
"data": "CAESEGMyZjg2MTczN2NjNGYzODIaB2thbHR1cmEiCjBfbmptaWlwbXAqBVNEX0hE",
"uuid": "edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"
}],
"key": "GzoNU9Dfwc//Iq3/zbzMUw==",
"key_id": "YzJmODYxNzM3Y2M0ZjM4Mg=="
}]
pssh.data- base64 编码的二进制数据,此数据的格式特定于 drm 供应商pssh.uuid- drm 系统 UUID,在这种情况下,edef8ba9-79d6-4ace-a3c8-27dcd51d21ed 代表 Widevinekey- base64 编码的加密密钥(128 位)key_id- base64 编码的密钥标识符(128 位)iv- 可选的 base64 编码的初始化向量(128 位)。IV 目前仅在 HLS(FairPlay)中使用, 在其他协议中,IV 由 nginx-vod-module 自动生成。
示例配置
Apple FairPlay HLS:
location ~ ^/fpshls/p/\d+/(sp/\d+/)?serveFlavor/entryId/([^/]+)/(.*) {
vod hls;
vod_hls_encryption_method sample-aes;
vod_hls_encryption_key_uri "skd://entry-$2";
vod_hls_encryption_key_format "com.apple.streamingkeydelivery";
vod_hls_encryption_key_format_versions "1";
vod_drm_enabled on;
vod_drm_request_uri "/udrm/system/ovp/$vod_suburi";
vod_last_modified_types *;
add_header Access-Control-Allow-Headers '*';
add_header Access-Control-Expose-Headers 'Server,range,Content-Length,Content-Range';
add_header Access-Control-Allow-Methods 'GET, HEAD, OPTIONS';
add_header Access-Control-Allow-Origin '*';
expires 100d;
}
通用加密 HLS:
location ~ ^/cenchls/p/\d+/(sp/\d+/)?serveFlavor/entryId/([^/]+)/(.*) {
vod hls;
vod_hls_encryption_method sample-aes-cenc;
vod_hls_encryption_key_format "urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed";
vod_hls_encryption_key_format_versions "1";
vod_drm_enabled on;
vod_drm_request_uri "/udrm/system/ovp/$vod_suburi";
vod_last_modified_types *;
add_header Access-Control-Allow-Headers '*';
add_header Access-Control-Expose-Headers 'Server,range,Content-Length,Content-Range';
add_header Access-Control-Allow-Methods 'GET, HEAD, OPTIONS';
add_header Access-Control-Allow-Origin '*';
expires 100d;
}
验证过的配置
以下是经过测试并发现有效的配置列表: * DASH/CENC 与 PlayReady 和 Widevine PSSH 一起使用 * MSS PlayReady * HLS FairPlay
性能建议
-
对于中型/大型部署,不要让用户直接从 nginx-vod-module 播放视频。 由于 nginx vod 支持的所有不同流协议都是基于 HTTP 的,因此可以被标准 HTTP 代理/CDN 缓存。 对于中型规模,在 vod 模块和最终用户之间添加一层缓存代理 (可以使用标准 nginx 服务器与 proxy_pass 和 proxy_cache)。 对于大型部署,建议使用 CDN(如 Akamai、Level3 等)。
一般来说,最好将 nginx vod 尽可能靠近存储 mp4 文件的位置, 并将缓存代理尽可能靠近最终用户。 2. 启用 nginx-vod-module 缓存: *
vod_metadata_cache- 保存每个段重新读取视频元数据的需要。此缓存应相当大,约为 GB 级别。 *vod_response_cache- 保存清单请求的响应。当在 nginx vod 之前使用第二层缓存服务器时,可能不需要此缓存。 为此缓存分配一个大缓冲区没有必要,128M 对于大多数部署来说可能已经足够。 *vod_mapping_cache- 仅适用于映射模式,通常几 MB 就足够了。 * nginx 的 open_file_cache - 缓存打开的文件句柄。通过启用性能计数器(
vod_performance_counters)并为 nginx vod 设置状态页面(vod_status),可以跟踪这些缓存的命中/未命中比率。 3. 在本地和映射模式下,启用 aio。 - nginx 必须编译时支持 aio,并且必须在 nginx 配置中启用(aio on)。 您可以通过查看 vod 状态页面上的性能计数器来验证它是否有效 - read_file(aio off)与 async_read_file(aio on) 4. 在本地和映射模式下,启用异步文件打开 - nginx 必须编译时支持线程,并且必须在 nginx.conf 中指定vod_open_file_thread_pool。 您可以通过查看 vod 状态页面上的性能计数器来验证它是否有效 - open_file 与 async_open_file。请注意,由于打开文件缓存,启用vod_open_file_thread_pool时 open_file 可能为非零 - 从缓存提供的打开请求将被计为同步 open_file。 5. 当使用启用 DRM 的 DASH/MSS 时,如果视频文件每帧只有一个 nalu,请将vod_min_single_nalu_per_frame_segment设置为非零。 6. 通过更改以下参数可以减少此模块生成的流的复用开销: * HDS - 将vod_hds_generate_moof_atom设置为 off * HLS - 将vod_hls_mpegts_align_frames设置为 off,并将vod_hls_mpegts_interleave_frames设置为 on 7. 启用清单响应的 gzip 压缩 -gzip_types application/vnd.apple.mpegurl video/f4m application/dash+xml text/xml8. 应用常见的 nginx 性能最佳实践,例如 tcp_nodelay=on、client_header_timeout 等。
配置指令 - 基础
vod
- 语法:
vod segmenter - 默认:
n/a - 上下文:
location
在封闭位置启用 nginx-vod 模块。
segmenter 的允许值为:
none- 按原样/剪辑提供 MP4 文件dash- 基于 HTTP 的动态自适应流打包器hds- Adobe HTTP 动态流打包器hls- Apple HTTP 直播流打包器mss- Microsoft Smooth Streaming 打包器thumb- 缩略图捕获volume_map- 音频音量映射
vod_mode
- 语法:
vod_mode mode - 默认:
local - 上下文:
http,server,location
设置文件访问模式 - 本地、远程或映射(有关更多详细信息,请参见上面的功能部分)
vod_status
- 语法:
vod_status - 默认:
n/a - 上下文:
location
在封闭位置启用 nginx-vod 状态页面。
支持以下查询参数:
* ?reset=1 - 重置性能计数器和缓存统计信息。
* ?format=prom - 以与 Prometheus 兼容的格式返回输出(默认格式为 XML)。
配置指令 - 分段
vod_segment_duration
- 语法:
vod_segment_duration duration - 默认:
10s - 上下文:
http,server,location
设置段持续时间,单位为毫秒。强烈建议使用 GOP 持续时间的倍数作为段持续时间。
如果段持续时间不是 GOP 持续时间的倍数,并且启用了 vod_align_segments_to_key_frames,则清单中报告的段持续时间与实际段持续时间之间可能会存在显著差异。这也可能导致流中出现空段。
vod_live_window_duration
- 语法:
vod_live_window_duration duration - 默认:
30000 - 上下文:
http,server,location
设置应在直播清单中返回的段的总持续时间,单位为毫秒。
如果值为正,nginx vod 返回最大 vod_live_window_duration 毫秒的范围,结束于当前服务器时间。
如果值为负,nginx vod 返回最大 -vod_live_window_duration 毫秒的范围,从映射 JSON 的末尾开始。
如果值设置为零,则直播清单将包含所有完全包含在映射 JSON 时间框架内的段。
vod_force_playlist_type_vod
- 语法:
vod_force_playlist_type_vod on/off - 默认:
off - 上下文:
http,server,location
即使媒体集具有 playlistType=live,也生成 vod 流。
启用此设置具有以下效果:
1. 帧时间戳将是连续的,并从零开始
2. 段索引将从一开始
3. 在 HLS 的情况下,返回的清单将同时具有 #EXT-X-PLAYLIST-TYPE:VOD 和 #EXT-X-ENDLIST
这对于从直播流中剪辑 vod 部分非常有用。
vod_force_continuous_timestamps
- 语法:
vod_force_continuous_timestamps on/off - 默认:
off - 上下文:
http,server,location
即使媒体集存在间隙(可以通过使用 clipTimes 创建间隙),也生成连续时间戳。
如果启用了 ID3 时间戳(vod_hls_mpegts_output_id3_timestamps),它们包含在 clipTimes 中设置的原始时间戳。
vod_bootstrap_segment_durations
- 语法:
vod_bootstrap_segment_durations duration - 默认:
none - 上下文:
http,server,location
添加以毫秒为单位的引导段持续时间。此设置可用于使前几个段的持续时间短于默认段持续时间,从而使自适应比特率选择更早启动,而不会在整个视频中增加短段的开销。
vod_align_segments_to_key_frames
- 语法:
vod_align_segments_to_key_frames on/off - 默认:
off - 上下文:
http,server,location
启用时,模块强制所有段以关键帧开始。启用此设置可能会导致实际段持续时间与清单中报告的持续时间之间存在差异(除非将 vod_manifest_segment_durations_mode 设置为准确)。
vod_segment_count_policy
- 语法:
vod_segment_count_policy last_short/last_long/last_rounded - 默认:
last_short - 上下文:
http,server,location
配置计算段计数的策略,对于 segment_duration = 10 秒: * last_short - 33 秒的文件分段为 - 10, 10, 10, 3 * last_long - 33 秒的文件分段为 - 10, 10, 13 * last_rounded - 33 秒的文件分段为 - 10, 10, 13,38 秒的文件分段为 10, 10, 10, 8
vod_manifest_duration_policy
- 语法:
vod_manifest_duration_policy min/max - 默认:
max - 上下文:
http,server,location
配置包含多个流的清单的持续时间计算策略: * max - 使用最大流持续时间(默认) * min - 使用最小非零流持续时间
vod_manifest_segment_durations_mode
- 语法:
vod_manifest_segment_durations_mode estimate/accurate - 默认:
estimate - 上下文:
http,server,location
配置清单请求中段持续时间的计算模式:
* estimate - 报告持续时间,如在 nginx.conf 中配置,例如,如果 vod_segment_duration 的值为 10000,
则 HLS 清单将包含 #EXTINF:10
* accurate - 报告段的确切持续时间,考虑帧持续时间,例如,对于 29.97 的帧速率和 10 秒段,它将报告第一个段为 10.01。准确模式还考虑关键帧对齐,如果 vod_align_segments_to_key_frames 打开。
vod_media_set_override_json
- 语法:
vod_media_set_override_json json - 默认:
{} - 上下文:
http,server,location
此参数提供了一种覆盖媒体集 JSON 部分的方法(仅适用于映射模式)。
例如,vod_media_set_override_json '{"clipTo":20000}' 将媒体集剪辑到 20 秒。
参数值可以包含变量。
配置指令 - 上游
vod_upstream_location
- 语法:
vod_upstream_location location - 默认:
none - 上下文:
http,server,location
设置用于读取 MP4 文件(远程模式)或映射请求 URI(映射模式)的 nginx 位置。
vod_remote_upstream_location
- 语法:
vod_remote_upstream_location location - 默认:
none - 上下文:
http,server,location
设置用于读取远程或映射模式下 MP4 文件的 nginx 位置。如果在映射模式下设置此指令,则模块通过 HTTP 读取 MP4 文件,将映射 JSON 中的路径视为 URI(默认行为是从本地文件读取)
vod_max_upstream_headers_size
- 语法:
vod_max_upstream_headers_size size - 默认:
4k - 上下文:
http,server,location
设置在发出上游请求时用于保存响应头的大小(到 vod_xxx_upstream_location)。
vod_upstream_extra_args
- 语法:
vod_upstream_extra_args "arg1=value1&arg2=value2&..." - 默认:
empty - 上下文:
http,server,location
应添加到上游请求的额外查询字符串参数(仅限远程/映射模式)。 参数值可以包含变量。
vod_media_set_map_uri
- 语法:
vod_media_set_map_uri uri - 默认:
$vod_suburi - 上下文:
http,server,location
设置媒体集映射请求的 uri,参数值可以包含变量。
在多 URL 的情况下,$vod_suburi 将是当前子 uri(每个子 URL 发出单独请求)
vod_path_response_prefix
- 语法:
vod_path_response_prefix prefix - 默认:
{"sequences":[{"clips":[{"type":"source","path":" - 上下文:
http,server,location
设置在 URI 映射响应中预期的前缀(仅适用于映射模式)。
vod_path_response_postfix
- 语法:
vod_path_response_postfix postfix - 默认:
"}]}]} - 上下文:
http,server,location
设置在 URI 映射响应中预期的后缀(仅适用于映射模式)。
vod_max_mapping_response_size
- 语法:
vod_max_mapping_response_size length - 默认:
1K - 上下文:
http,server,location
设置从上游返回的路径的最大长度(仅适用于映射模式)。
配置指令 - 回退
vod_fallback_upstream_location
- 语法:
vod_fallback_upstream_location location - 默认:
none - 上下文:
http,server,location
设置在遇到文件未找到错误后请求转发的 nginx 位置(仅适用于本地/映射模式)。
vod_proxy_header_name
- 语法:
vod_proxy_header_name name - 默认:
X-Kaltura-Proxy - 上下文:
http,server,location
设置用于防止回退代理循环的 HTTP 头的名称(仅适用于本地/映射模式)。
vod_proxy_header_value
- 语法:
vod_proxy_header_value name - 默认:
dumpApiRequest - 上下文:
http,server,location
设置用于防止回退代理循环的 HTTP 头的值(仅适用于本地/映射模式)。
配置指令 - 性能
vod_metadata_cache
- 语法:
vod_metadata_cache zone_name zone_size [expiration] - 默认:
off - 上下文:
http,server,location
配置视频元数据缓存的大小和共享内存对象名称。对于 MP4 文件,此缓存保存 moov atom。
vod_mapping_cache
- 语法:
vod_mapping_cache zone_name zone_size [expiration] - 默认:
off - 上下文:
http,server,location
配置 VOD 的映射缓存的大小和共享内存对象名称(仅适用于映射模式)。
vod_live_mapping_cache
- 语法:
vod_live_mapping_cache zone_name zone_size [expiration] - 默认:
off - 上下文:
http,server,location
配置实时映射缓存的大小和共享内存对象名称(仅适用于映射模式)。
vod_response_cache
- 语法:
vod_response_cache zone_name zone_size [expiration] - 默认:
off - 上下文:
http,server,location
配置响应缓存的大小和共享内存对象名称。响应缓存保存清单和其他非视频内容(如 DASH 初始化段、HLS 加密密钥等)。视频段不缓存。
vod_live_response_cache
- 语法:
vod_live_response_cache zone_name zone_size [expiration] - 默认:
off - 上下文:
http,server,location
配置时间变化直播响应的响应缓存的大小和共享内存对象名称。 此缓存保存实时的以下类型的响应:DASH MPD、HLS 索引 M3U8、HDS 引导、MSS 清单。
vod_initial_read_size
- 语法:
vod_initial_read_size size - 默认:
4K - 上下文:
http,server,location
设置 MP4 文件的初始读取操作的大小。
vod_max_metadata_size
- 语法:
vod_max_metadata_size size - 默认:
128MB - 上下文:
http,server,location
设置支持的最大视频元数据大小(对于 MP4 - moov atom 大小)
vod_max_frames_size
- 语法:
vod_max_frames_size size - 默认:
16MB - 上下文:
http,server,location
设置为服务非段(例如播放列表)请求读取的帧的总大小的限制
vod_max_frame_count
- 语法:
vod_max_frame_count count - 默认:
1048576 - 上下文:
http,server,location
设置为服务段请求读取的帧的总计数的限制。
vod_segment_max_frame_count
- 语法:
vod_segment_max_frame_count count - 默认:
65536 - 上下文:
http,server,location
设置为服务段请求读取的帧的总计数的限制。
vod_cache_buffer_size
- 语法:
vod_cache_buffer_size size - 默认:
256K - 上下文:
http,server,location
设置在读取 MP4 帧时使用的缓存缓冲区的大小。
vod_open_file_thread_pool
- 语法:
vod_open_file_thread_pool pool_name - 默认:
off - 上下文:
http,server,location
启用通过线程池进行异步文件打开。 线程池必须通过 thread_pool 指令定义,如果未指定池名称,则使用默认池。 此指令仅在 nginx 1.7.11 或更高版本中支持,并且在编译时使用 --add-threads。 注意:此指令当前禁用 nginx-vod-module 使用 nginx 的 open_file_cache
vod_output_buffer_pool
- 语法:
vod_output_buffer_pool size count - 默认:
off - 上下文:
http,server,location
为生成响应数据预分配缓冲区,节省每个请求分配/释放缓冲区的需要。
vod_performance_counters
- 语法:
vod_performance_counters zone_name - 默认:
off - 上下文:
http,server,location
配置性能计数器的共享内存对象名称
配置指令 - url 结构
vod_base_url
- 语法:
vod_base_url url - 默认:
见下文 - 上下文:
http,server,location
设置应在清单响应中返回的基本 URL(方案 + 域)。
参数值可以包含变量,如果参数评估为空字符串,则将使用相对 URL。
如果参数评估为以 / 结尾的字符串,则假定为完整 URL - 模块仅将文件名附加到它,而不是完整 URI。
如果未设置,则基本 URL 通过以下方式确定:
1. 如果请求未包含主机头(HTTP/1.0),则将返回相对 URL
2. 否则,基本 URL 将为 $scheme://$http_host
该设置目前仅影响 HLS 和 DASH。在 MSS 和 HDS 中,总是返回相对 URL。
vod_segments_base_url
- 语法:
vod_segments_base_url url - 默认:
见下文 - 上下文:
http,server,location
设置应用于传递视频段的基本 URL(方案 + 域)。 参数值可以包含变量,如果参数评估为空字符串,则将使用相对 URL。 如果未设置,则将使用 vod_base_url。 该设置目前仅影响 HLS。
vod_multi_uri_suffix
- 语法:
vod_multi_uri_suffix suffix - 默认:
.urlset - 上下文:
http,server,location
用于标识多 URL 的 URL 后缀。多 URL 是一种编码多个不同 URL 的方式 应作为自适应流集合一起播放,位于单个 URL 下。当使用默认后缀时,HLS 集 URL 可能如下所示: http://host/hls/common-prefix,bitrate1,bitrate2,common-suffix.urlset/master.m3u8
vod_clip_to_param_name
- 语法:
vod_clip_to_param_name name - 默认:
clipTo - 上下文:
http,server,location
请求参数的剪辑到名称。
vod_clip_from_param_name
- 语法:
vod_clip_from_param_name name - 默认:
clipFrom - 上下文:
http,server,location
请求参数的剪辑从名称。
vod_tracks_param_name
- 语法:
vod_tracks_param_name name - 默认:
tracks - 上下文:
http,server,location
请求参数的轨道名称。
vod_time_shift_param_name
- 语法:
vod_time_shift_param_name name - 默认:
shift - 上下文:
http,server,location
请求参数的偏移名称。
vod_speed_param_name
- 语法:
vod_speed_param_name name - 默认:
speed - 上下文:
http,server,location
请求参数的速度名称。
vod_lang_param_name
- 语法:
vod_lang_param_name name - 默认:
lang - 上下文:
http,server,location
请求参数的语言名称。
vod_force_sequence_index
- 语法:
vod_force_sequence_index on/off - 默认:
off - 上下文:
http,server,location
即使只有一个序列,也在段 URI 中使用序列索引。
配置指令 - 响应头
vod_expires
- 语法:
vod_expires time - 默认:
none - 上下文:
http,server,location
设置成功请求的 "Expires" 和 "Cache-Control" 响应头的值。
此指令类似于 nginx 内置的 expires 指令,除了仅支持过期间隔场景
(纪元、最大、关闭、白天时间不支持)
使用此指令而不是内置 expires 的主要动机是为 VOD 和动态直播内容设置不同的过期时间。
如果未指定此指令,nginx-vod-module 将不会设置 "Expires" / "Cache-Control" 头。
此设置影响 VOD 播放列表中的所有请求类型和直播播放列表中的段请求。
vod_expires_live
- 语法:
vod_expires_live time - 默认:
none - 上下文:
http,server,location
与 vod_expires(上述)相同,但适用于不依赖时间且不是段的直播请求(例如 HLS - master.m3u8,HDS - manifest.f4m)。
vod_expires_live_time_dependent
- 语法:
vod_expires_live_time_dependent time - 默认:
none - 上下文:
http,server,location
与 vod_expires(上述)相同,但适用于依赖时间的直播请求(HLS - index.m3u8,HDS - bootstrap.abst,MSS - manifest,DASH - manifest.mpd)。
vod_last_modified
- 语法:
vod_last_modified time - 默认:
none - 上下文:
http,server,location
设置响应中返回的 Last-Modified 头的值,默认情况下模块不返回 Last-Modified 头。 设置此参数的原因是为了支持 If-Modified-Since / If-Unmodified-Since。 由于 nginx 内置的 ngx_http_not_modified_filter_module 在任何其他头过滤器模块之前运行,因此它将看不到通过 add_headers / more_set_headers 设置的任何头。 这使得 nginx 总是回复内容已更改(412 对于 If-Unmodified-Since / 200 对于 If-Modified-Since) 对于不依赖时间的直播请求(例如,实时 DASH MPD),Last-Modified 设置为当前服务器时间。
vod_last_modified_types
- 语法:
vod_last_modified_types mime-type1 mime-type2 ... - 默认:
none - 上下文:
http,server,location
设置应设置 Last-Modified 头的 MIME 类型。 特殊值 "*" 匹配任何 MIME 类型。
配置指令 - 广告拼接(仅适用于映射模式)
vod_dynamic_mapping_cache
- 语法:
vod_dynamic_mapping_cache zone_name zone_size [expiration] - 默认:
off - 上下文:
http,server,location
配置存储动态剪辑映射的缓存的大小和共享内存对象名称。
vod_dynamic_clip_map_uri
- 语法:
vod_dynamic_clip_map_uri uri - 默认:
none - 上下文:
http,server,location
设置应用于映射动态剪辑的 uri。
参数值可以包含变量,特别是 $vod_clip_id 包含应映射的剪辑的 id。
此 uri 的预期响应是包含连接剪辑对象的 JSON。
vod_source_clip_map_uri
- 语法:
vod_source_clip_map_uri uri - 默认:
none - 上下文:
http,server,location
设置应用于映射使用连接的 clipIds 属性定义的源剪辑的 uri。
参数值可以包含变量,特别是 $vod_clip_id 包含应映射的剪辑的 id。
此 uri 的预期响应是包含源剪辑对象的 JSON。
vod_redirect_segments_url
- 语法:
vod_redirect_segments_url url - 默认:
none - 上下文:
http,server,location
设置应重定向请求段的 url。
参数值可以包含变量,特别是 $vod_dynamic_mapping 包含动态剪辑映射的序列化表示。
vod_apply_dynamic_mapping
- 语法:
vod_apply_dynamic_mapping mapping - 默认:
none - 上下文:
http,server,location
使用给定表达式将动态剪辑映射到连接剪辑,此表达式由 $vod_dynamic_mapping 之前生成。
参数值可以包含变量。
vod_notification_uri
- 语法:
vod_notification_uri uri - 默认:
none - 上下文:
http,server,location
设置应用于发出通知的 uri。
参数值可以包含变量,特别是 $vod_notification_id 包含正在触发的通知的 id。
此 uri 的响应将被忽略。
配置指令 - DRM / 加密
vod_secret_key
- 语法:
vod_secret_key string - 默认:
empty - 上下文:
http,server,location
设置用于生成 TS 加密密钥和 DASH/MSS 加密 IV 的种子。 参数值可以包含变量,通常具有结构 "secret-$vod_filepath"。 请参见下面此模块添加的 nginx 变量列表。
vod_encryption_iv_seed
- 语法:
vod_encryption_iv_seed string - 默认:
empty - 上下文:
http,server,location
设置用于生成加密 IV 的种子,目前仅适用于 HLS/fMP4 的 AES-128 加密。 参数值可以包含变量。
vod_drm_enabled
- 语法:
vod_drm_enabled on/off - 默认:
off - 上下文:
http,server,location
启用时,模块根据从 drm 上游获取的响应加密媒体段。 目前仅支持 DASH 和 MSS(Play Ready)。
vod_drm_single_key
- 语法:
vod_drm_single_key on/off - 默认:
off - 上下文:
http,server,location
启用时,模块仅请求第一个序列的 drm 信息并将其应用于所有序列。 禁用时,单独为每个序列请求 drm 信息。 此外,在 DASH 中,启用此设置使模块将 ContentProtection 标签放置在 AdaptationSet 下, 否则,它将放置在 Representation 下。
vod_drm_clear_lead_segment_count
- 语法:
vod_drm_clear_lead_segment_count count - 默认:
1 - 上下文:
http,server,location
设置流开头的清晰(未加密)段的数量。清晰的前导使播放器能够开始播放,而无需等待许可证响应。
vod_drm_max_info_length
- 语法:
vod_drm_max_info_length length - 默认:
4K - 上下文:
http,server,location
设置从上游返回的 drm 信息的最大长度。
vod_drm_upstream_location
- 语法:
vod_drm_upstream_location location - 默认:
none - 上下文:
http,server,location
设置应用于获取文件的 DRM 信息的 nginx 位置。
vod_drm_info_cache
- 语法:
vod_drm_info_cache zone_name zone_size [expiration] - 默认:
off - 上下文:
http,server,location
配置 drm 信息缓存的大小和共享内存对象名称。
vod_drm_request_uri
- 语法:
vod_drm_request_uri uri - 默认:
$vod_suburi - 上下文:
http,server,location
设置 drm 信息请求的 uri,参数值可以包含变量。
在多 URL 的情况下,$vod_suburi 将是当前子 uri(每个子 URL 发出单独的 drm 信息请求)
vod_min_single_nalu_per_frame_segment
- 语法:
vod_min_single_nalu_per_frame_segment index - 默认:
0 - 上下文:
http,server,location
设置应假定每帧具有单个 h264 nalu 的最小段索引(基于 1)。 如果值为 0,则不对每帧的 nalu 数量做出假设。 此设置仅影响启用 DRM 的 DASH 和 MSS 配置。
在使用 libx264 转码视频时,默认情况下,所有帧都有一个单独的 nalu,除了包含 libx264 版权信息的第一个帧。 将此参数设置为大于 0 的值可以显著提高性能,因为可以提前计算段的布局,使模块能够: * 在生成时输出段缓冲区(不必等待整个段完成) * 避免处理不需要段数据的请求(例如 HEAD、范围 0-0 等)
配置指令 - DASH
vod_dash_absolute_manifest_urls
- 语法:
vod_dash_absolute_manifest_urls on/off - 默认:
on - 上下文:
http,server,location
启用时,服务器在 MPD 请求中返回绝对 URL。
vod_dash_manifest_file_name_prefix
- 语法:
vod_dash_manifest_file_name_prefix name - 默认:
manifest - 上下文:
http,server,location
MPD 文件的名称(隐含 mpd 扩展名)。
vod_dash_profiles
- 语法:
vod_dash_profiles profiles - 默认:
urn:mpeg:dash:profile:isoff-main:2011 - 上下文:
http,server,location
设置在清单响应中返回的 MPD 标签中的配置文件。
vod_dash_init_file_name_prefix
- 语法:
vod_dash_init_file_name_prefix name - 默认:
init - 上下文:
http,server,location
MP4 初始化文件的名称(隐含 mp4 扩展名)。
vod_dash_fragment_file_name_prefix
- 语法:
vod_dash_fragment_file_name_prefix name - 默认:
frag - 上下文:
http,server,location
片段文件的名称(隐含 m4s 扩展名)。
vod_dash_manifest_format
- 语法:
vod_dash_manifest_format format - 默认:
segmenttimeline - 上下文:
http,server,location
设置 MPD 格式,可用选项为:
* segmentlist - 使用