nginx-vod-module README中文版

基于2022年12月的原README

基于Nginx的点播Packager

nginx-vod-module

功能

  • On-the-fly repackaging of MP4 files to DASH, HDS, HLS, MSS

  • 即时重打包MP4文件为DASH、HDS、HLS、MSS协议

  • Working modes:

  • 工作模式:

  1. Local - serve locally accessible files (local disk/NFS mounted)

  1. 本地 - 使用本地可访问的文件(本地磁盘/NFS挂载)

  1. Remote - serve files accessible via HTTP using range requests

  1. 远程 - 通过HTTP协议使用range请求来访问文件

  1. Mapped - serve files according to a specification encoded in JSON format. The JSON can pulled from a remote server, or read from a local file

  1. 映射 - 根据一个指定格式的JSON文件来访问文件。JSON可以来自于远程服务器,也可以从本地读取。

  • Adaptive bitrate support

  • 支持自适应码率

  • Playlist support (playing several different media files one after the other) - mapped mode only

  • 支持播放列表(一个接一个播放几个不同的媒体文件) - 仅映射模式

  • Simulated live support (generating a live stream from MP4 files) - mapped mode only

  • 支持虚拟直播(从MP4文件生成一个直播流) - 仅映射模式

  • Fallback support for file not found in local/mapped modes (useful in multi-datacenter environments)

  • 在本地和映射模式下,支持在文件不存在时播放备选视频。(多数据中心时非常有用)

  • Video codecs: H264, H265 (DASH/HLS), AV1 (DASH/HLS), VP8 (DASH), VP9 (DASH)

  • 视频编码:H264、H265(DASH/HLS)、AV1(DASH/HLS)、VP8(DASH)、VP9(DASH)

  • Audio codecs: AAC, MP3 (HLS/HDS/MSS), AC-3 (DASH/HLS), E-AC-3 (DASH/HLS), VORBIS (DASH), OPUS (DASH), FLAC (HLS), DTS (HLS)

  • 音频编码:AAC、MP3(HLS/HDS/MSS)、AC-3(DASH/HLS)、E-AC-3(DASH/HLS)、VORBIS(DASH)、OPUS(DASH)、FLAC(HLS)、DTS(HLS)

  • Captions support -

  • 字幕支持 -

输入:

  1. WebVTT

  1. SRT

  1. DFXP/TTML

  1. CAP (Cheetah)

输出:

  1. DASH - either a single WebVTT or SMPTE-TT segments (configurable)

  1. DASH - 一个单独的WebVTT或者SMPTE-TT切片(可以设置)

  1. HLS - segmented WebVTT (m3u8)

  1. HLS - 切片WebVTT

  1. MSS - converted to TTML and packaged in fragmented MP4 (no support for styling)

  1. MSS - 转换成TTML并打包进fmp4(不支持样式)

  • Audio only/video only files

  • 支持纯音频/纯视频文件

  • Alternative audio renditions - supporting both:

  • 可选的音频副本

  1. Generation of manifest with different audio renditions, allowing selection on the client side

  1. 一批不同音频副本的manifest,允许在客户端端进行选择。

  1. Muxing together audio and video streams from separate files / tracks - provides the ability

to serve different audio renditions of a single video, without the need for any special support

on the client side.

  1. 将不同文件或轨道的音视频流混合到一起 - 在不需要客户端有任何特殊支持的情况下,提供单个视频不同音频副本的能力。

  • Track selection for multi audio/video MP4 files

  • 多音视频轨道的MP4文件可以进行轨道选择

  • Playback rate change - 0.5x up to 2x (requires libavcodec and libavfilter)

  • 播放速度选择 - 0.5x 到 2x(需要libavcodec和libavfilter库)

  • Source file clipping (only from I-Frame to P-frame)

  • 源文件截取(仅从I帧到P帧)

  • Support for variable segment lengths - enabling the player to select the optimal bitrate fast,

without the overhead of short segments for the whole duration of the video

  • 支持可变的切片长度 - 可以使播放器更快选择最优的码率,而无需花费无用的开销在视频的整个持续时间内的小切片里。

  • Clipping of MP4 files for progressive download playback

  • 截取mp4文件用于渐进下载式播放

  • Thumbnail capture (requires libavcodec) and resize (requires libswscale)

  • 截取缩略图(需要livavcodec)和调整大小(需要libswscale)

  • Volume map (requires libavcodec) - returns a CSV containing the volume level in each interval

  • 音量映射(需要libavcodec) - 返回一个CSV包含每个间隔的音量水平

  • Decryption of CENC-encrypted MP4 files (it is possible to create such files with MP4Box)

  • 解密CENC加密的MP4文件(通过mp4box创建这样的文件)

  • DASH: common encryption (CENC) support

  • DASH: 支持CENC加密

  • MSS: PlayReady encryption support

  • MSS:支持PlayReady加密

  • HLS: Generation of I-frames playlist (EXT-X-I-FRAMES-ONLY)

  • HLS:EXT-X-I-FRAMES-ONLY标签

  • HLS: support for AES-128 / SAMPLE-AES encryption

  • HLS: 支持AES-128/SAMPLE-AES加密

限制

  • Track selection and playback rate change are not supported in progressive download

  • 渐进式下载的话不支持轨道选择和播放速率选择

  • I-frames playlist generation is not supported when encryption is enabled

  • 启用加密时,不支持EXT-X-I-FRAMES-ONLY

  • Tested on Linux only

  • 仅在Linux测试

编译

依赖

通常情况下,如果你有nginx编译所需的依赖,你就可以编译nginx-vod-module。

然而,一些这个模块可选的功能依赖一些额外的包。模块在configure时会检测是否有这些包 - 如果没有,这些功能就会被禁用。

可选功能:

  1. 缩略图截取和音量映射 - 依赖ffmpeg 3.0或更新版本

  1. 音频过滤(用于调整播放速度/或者增加音量?) - 依赖ffmpeg3.0或更新版本和libfdk_aac。

  1. 加密/解密(DRM/HLS AES) - 依赖openssl

  1. DFXP字幕 - 依赖libxml2

  1. UTF-16 编码的srt文件 - 依赖iconv

构建

静态编译模块:

./configure --add-module=/path/to/nginx-vod-module

make

make install

可选的建议设置:

  1. --with-file-aio - 启用异步IO的支持,强烈推荐,仅本地和映射模式有用

  1. --with-threads (nginx 1.7.11+) - 启用异步文件打开线程池(也需要在nginx配置文件里配置vod_open_file_thread_pool),仅本地和映射模式有用

  1. --with-cc-opt="-O3 -mpopcnt" - 启用额外的编译优化(相对于默认的-O,测试可见mp4解析时间和帧处理时间减少约8%)

默认设置:

  1. --with-debug - enable debug messages (also requires passing debug in the error_log directive in nginx.conf).

  1. --with-cc-opt="-O0" - disable compiler optimizations (for debugging with gdb)

C Macro Configurations:

  1. --with-cc-opt="-DNGX_VOD_MAX_TRACK_COUNT=256 -mavx2" - increase the maximum track count (preferably to multiples of 64). It's recommended to enable vector extensions (AVX2) as well.

URL格式

基础URL格式

基础的nginx-vod-module的URL格式构造:

http://///

Where:

  • domain - 服务器的域名

  • location - nginx配置文件中定义的location

  • fileuri - mp4文件路径:

  • 本地模式 - 文件的完整路径是根据配置文件中的root/alias决定的

  • 映射模式 - 文件的完整路径是根据JSON文件中的配置决定的

  • 远程模式 - MP4文件从upstream读取

  • 注意:在映射模式和远程模式中,upstream请求的url是 http:////?

(extraargs 是 vod_upstream_extra_args 定义的)

  • filename - 下面细说

多URL格式

多URl用于把多个视频URL编码进一个单独的URl里。一个多URL可以用于指定几个不同的MP4文件URL这样他们会被一起包含在DASH MPD。

多URL格式构造:

http:////,,,,.urlset/

上面的示例URL代表了三个URL:

  • http://///

  • http://///

  • http://///

后缀.urlset(可以使用vod_multi_uri_suffix修改)指示这个URL应该被认为是一个多URL格式的URL。

举例 - URL http://example.com/hls/videos/big_buck_bunny_,6,9,15,00k.mp4.urlset/master.m3u8 会返回一个manifest包含:

  • 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-v-a-a...

例如,.../tracks/v1-a1/... 将会选择第一个视频轨道和第一个音频轨道。

默认是包含所有轨道的。

  • shift - 可以用于应用时序漂移到一个或多个流。参数的格构造:v-a-s

例如,.../shift/v100/... 会应用一个100ms的前移到视频的时间戳。

文件名构造

文件名构造是:

[][][][].

Where:

  • basename + extension - the set of options is packager specific (the list below applies to the default settings):

  • dash - manifest.mpd

  • hds - manifest.f4m

  • hls master playlist - master.m3u8

  • hls media playlist - index.m3u8

  • mss - manifest

  • thumb - thumb-[].jpg (offset is the thumbnail video offset in milliseconds)

  • volume_map - volume_map.csv

  • seqparams - 可以用于通过id选择指定的视频次序(在映射模式的JSON里提供),例如 master-sseq1.m3u8。

  • fileparams - 当使用多URL格式时,可以用于通过index号来选择指定的视频。

例如,manifest-f1.mpd将会返回一个仅来自第一个视频URL的mpd。

  • trackparams - 可以用于选择指定的音视频轨道。

例如,manifest-a1.f4m将会返回一个只包含第一个音频流的序列的F4M。

默认情况下,包含每个文件的第一个音频和视频轨道。

The tracks selected on the file name are AND-ed with the tracks selected with the /tracks/ path parameter.

文件名上的轨道选择……

v0/a0 选择所有音视频轨道。

a/v 参数可以混合f/s(应该是指seqparams和fileparams),例如f1-v1-f2-a1 等于文件1的视频1加文件2的音频1,f1-f2-v1等于文件1的视频1加文件2的视频1。

  • langparams - 可以用于过滤音频轨道或字幕(根据他们的语言,ISO639-3码)。

例如,master-leng.m3u8将会仅返回英语音轨。

  • resizeparams - 可以用于改变返回的缩略图尺寸。

例如,thumb-1000-w150-h100.jpg会截取一个视频第一秒的缩略图,然后调整尺寸为150x100。如果其中一个尺寸参数缺失了,那么它的值会被根据视频帧的比例设置。

映射响应格式

当设置为映射模式工作时,nginx-vod-module发起一个http请求到设置的upstream服务器

in order to receive the layout of media streams it should generate.

以接收它应该生成的媒体流布局

响应需要是JSON格式的。

这部分包含一些简单的例子,伴随着一些支持的objects和fields的参考。

首先, 这有一些定义:

  1. Source Clip - 从一个单独的媒体文件提取的音频 和/或 视频帧(轨)的集合

  1. Generator - 一个可以生成音视频帧的组件。当前,唯一支持的generator是silence generator。

  1. Filter - 一个可以被应用到音视频帧的操作。支持以下过滤器:

  • rate (speed) change - 可被用于音频和视频

  • audio volume change

  • mix - 可以用于将数个音频轨道混合到一起,或者合并源A的音频和源B的视频到一起。

  1. Clip - 应用0或更多过滤器到一个source clips集合的结果

  1. Dynamic Clip - 一个无法提前确定内容的clip,例如广告内容

  1. Sequence - 一个顺序连播的clip集合

  1. Set - 数个序列放到一起成为一个自适应集合,每个序列必须包含同样数量的clip。

简单映射 Simple Mapping

下面的JSON映射请求URI到一个单独的MP4文件:

{
    "sequences": [
        {
            "clips": [
                {
                    "type": "source",
                    "path": "/path/to/video.mp4"
                }
            ]
        }
    ]
}
When using multi URLs, this is the only allowed JSON pattern. In other words, it is not
possible to combine more complex JSONs using multi URL.

当使用多URL格式时,这是唯一允许的JSON模版。换句话说,在使用多URL格式时,不可能混合更复杂的JSON内容。

自适应集合 Adaptive set

作为一个可选方式去使用多URL,一个自适应集合可以通过JSON定义:

{
    "sequences": [
        {
            "clips": [
                {
                    "type": "source",
                    "path": "/path/to/bitrate1.mp4"
                }
            ]
        },
        {
            "clips": [
                {
                    "type": "source",
                    "path": "/path/to/bitrate2.mp4"
                }
            ]
        }
    ]
}

播放列表 Playlist

下面这个JSON将会播放35秒video1,然后是22秒的video2:

{
    "durations": [ 35000, 22000 ],
    "sequences": [
        {
            "clips": [
                {
                    "type": "source",
                    "path": "/path/to/video1.mp4"
                },
                {
                    "type": "source",
                    "path": "/path/to/video2.mp4"
                }
            ]
        }
    ]
}

过滤器 Filters

下面这个JSON取video1,用1.5倍速播放,并且混合video2的音频轨道(并且音量是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"
                            }
                        }
                    ]
                }
            ]
        }
    ]
}

连续直播 Continuous live

下面这个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"
                }
            ]
        }
    ]
}

不连续直播 Non-continuous live

下面的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 (top level object in the mapping JSON)

必要字段:

  • sequences - 序列(sequence)数组

映射文件必须包含至少一个序列且最多不超过32个。

可选字段:

  • id - 字符串,用于标记(identities)这个集合(set)。id可以用变量$vod_set_id定义。

  • playlistType - 字符串,可以设置成 live、 vod 或 event (仅支持HLS播放列表),默认 vod。

  • durations - 整数数组,一个以毫秒为单位的整数数组,用来确定clip的持续时间。

如果映射文件每个序列包含超过一个clip这个字段是必须的。

如果定义了,这个数组必须包含至少一个元素且不超过128个元素。

  • discontinuity - 布尔值,指示每个序列里的不同clip是否包含不同的媒体参数(编码格式?)。

根据不同的传输协议,这个字段有不同的体现 - HLS时为true则会生成#EXT-X-DISCONTINUITY到m3u8文件里,

DASH时就会有多段MPD。默认值是true,设置为false仅当媒体文件是被转码到完全一致的参数的时候(例如用AVC,clip应该会包含完全一致的SPS/PPS。

  • segmentDuration - 整数,设置切片长度,单位毫秒。

如果定义了这个字段,其优先级比 vod_segment_duration 的值更高(也就是会覆盖掉Nginx配置文件的设置)。

  • consistentSequenceMediaInfo - 布尔值,当前只影响DASH协议。

当设置为true(默认)时,MPD会在每个period元素中指示同样的媒体参数。设置为false时,

对于长序列可能有严重的性能影响(因为nginx-vod-module不得不读取映射文件中包含的所有clip的媒体信息以生成MPD)

  • referenceClipIndex - 整数,设置用于提取视频metadata的clip的序号(从1开始),用于mainifest请求(编码、宽度高度等)

如果 consistentSequenceMediaInfo 设置为false,这个参数没有效果 - 因为所有的clip都会被解析。

如果这个参数没有设置,nginx-vod-module默认会使用最后一个clip。

  • notifications - notification对象数组(具体看后面),当一个切片被请求时,

所有落在切片的开始/结束时间之间的notification会被发出(原文fired)。

notification必须按照递增排序。

  • clipFrom - 整数,包含一个时间戳(毫秒还是时间戳?)指示返回的流从哪里开始播放。

设置这个参数等同于在URL里传/clipFrom/。

  • clipTo - 整数,包含一个时间戳(毫秒还是时间戳?)指示返回的流从到哪里结束。

设置这个参数等同于在URL里传/clipTo/。

  • cache - 布尔值,如果设置为false,映射文件响应不会被保存到缓存(vod_mapping_cache)。默认值是true。

  • closedCaptions - 隐藏式字幕对象(closed captions objects)数组(后面细说),包含任何嵌入式的CEA-608 / CEA-708 字幕的语言和id。

如果提供一个空数组,这个模块会输出 CLOSED-CAPTIONS=NONE 到每一个 EXT-X-STREAM-INF 标签。

如果JSON中没出现这个list,模块不会输出任何 CLOSED-CAPTIONS 字段到播放列表里。

直播相关字段:

  • firstClipTime - 整数,对于所有直播播放列表是必要的,除非指定了 clipTimes 。

包含播放列表中第一个clip的绝对时间,单位是毫秒(unixtime x 1000)

  • clipTimes - 整数数组,设置播放列表中每个clip的绝对时间,单位是毫秒(unixtime x 1000)。

这个字段仅当 discontinuity 设置为true时可用。时间戳可以包含不连贯,但不允许重叠(clipTimes[n + 1] >= clipTimes[n] + durations[n])

  • segmentBaseTime - 整数,连续直播流时这个字段是必要的,包含流的第一个切片的绝对时间,单位是毫秒(unixtime x 1000)。

播放期间这个值不可以修改。

对于不连续的直播流,这个字段是可选的:

if not set, sequential segment indexes will be used throughout the playlist.
  • 如果不设置,顺序切片索引会被使用贯穿整个播放列表。

这种情况下,upstream服务器生成映射JSON必须维护状态,

而且每当一个clip被从播放列表移除时更新 initialSegmentIndex 。

  • 如果设置了,clip之间的间隙必须不小于 vod_segment_duration 。

  • firstClipStartOffset - 整数,可选,单位毫秒。

This field contains the difference between first clip time, and the original start time of the first clip - the time it had when it was initially added (before the live window shifted)

这个字段包含第一个clip时间,和第一个clip的原始开始时间——当它当初被添加进来的时间(在直播窗口变换之前?) 之间的区别。

  • initialClipIndex - 整数,当为混合了包含不同的编码参数(SPS/PPS)的视频的不连续直播流时,是必要字段,包含播放列表中第一个clip的索引。

Whenever a clip is pushed out of the head of the playlist, this value must be incremented by one.

每当一个clip被移出播放列表的开头,这个值必须递增1

  • initialSegmentIndex - 整数,对于没有设置segmentBaseTime,播放列表里包含第一个切片的索引的直播流,这个字段是必须的。

每当一个clip被移出播放列表的开头,这个值必须加上这个clip里切片的数量。

  • presentationEndTime - 整数,可选,单位毫秒。

当有提供(这个参数和值),模块会对比当前时间和设定值,如果 presentationEndTime 时间已经过去,就标记直播演示(原文live presentation不知道为什么用这个词)的已经结束。

举个例子,HLS里这个参数控制m3u8里是否会包含 #EXT-X-ENDLIST 标签。

当这个参数没提供,模块不会标记直播结束。

  • expirationTime - 整数,可选,单位毫秒。

当有提供(这个参数和值),模块会对比当前时间和设定值,且如果 expirationTime 时间已经过,对于manifest请求,模块会返回404错误。

(切片请求会继续提供服务)

当 presentationEndTime 和 expirationTime 都已经过了, presentationEndTime 优先级更高,也就是上面 presentationEndTime 过期部分描述的效果。

  • liveWindowDuration - 整数,可选,提供了一个方法去覆盖Nginx配置文件中预设的 vod_live_window_duration 的值。

如果这个值超过了 vod_live_window_duration 的绝对值,那么它会被忽略。

  • timeOffset - 整数,设置一个偏移量,在处理直播请求时,会被应用到服务器时钟。

这个参数可以用于测试未来/过去事件。

序列 Sequence

必要字段:

  • clips - 剪辑对象(Clip objects)数组(必须)。这个数组的元素数量必须和set里设置的durations数组的元素数量一致。

如果durations数组没有指明,clips数组只能包含一个元素。

可选字段:

  • id - 字符串,用于标记这个序列。id可以用变量$vod_sequence_id定义。

  • language - 三个字母的语言代号(ISO-639-2),这个字段的优先级比任何媒体文件(MP4 mdhd atom)里的语言设置更高。

  • label - 字符串,用更易理解的方式标记这个序列。如果指定了语言(language),

一个默认的标签会自动生成。例如,如果语言是 ita ,那么默认label就会是 italiano 。

  • bitrate - 对象,可以用于对不同媒体类型设置码率,单位bps。

例如 {"v": 900000, "a": 64000} 。如果bitrate没有提供,模块会自动根据序列里最后一个clip进行评估。

  • avg_bitrate - 对象,可以用于对不同媒体类型设置平均码率,单位bps。

例子见 bitrate 。如果提供了这个字段,模块会在HLS里使用字段值添加到#EXT-X-STREAM-INF标签的AVERAGE-BANDWIDTH属性里。

剪辑 Clip (抽象 abstract)

必要字段:

  • type - 字符串,定义clip的类型。允许的值有:

  • source

  • rateFilter

  • mixFilter

  • gainFilter

  • silence

  • concat

  • dynamic

可选字段:

  • keyFrameDurations - 整数数组,包含clip里视频关键帧的持续时间,单位毫秒。

这个属性仅可以配置在每个序列的最顶层clip里,配置在嵌套clip里没效果。

提供关键帧持续时间另模块:

  1. 对齐切片到关键字

  1. 在manifest里报告正确的切片持续时间 - 提供一种替代方式去设置 vod_manifest_segment_durations_mode 为 accurate ,(因为)(由于性能原因)对于多clip媒体集合(set)是不支持这样的

  • firstKeyFrameOffset - 整数,clip里第一个视频关键帧的偏移量,单位毫秒。缺省值0。与 firstClipTime 有关联。

源剪辑 Source clip

必要字段:

  • type - 字符串,值固定为 source

  • path - 字符串,包含MP4文件的路径。可以写empty用于说明是空的字幕文件。

可选字段:

  • sourceType - 字符串?设置要用什么接口去读取mp4文件,可选值是 file 和 http 。

默认情况下如果设置了 vod_remote_upstream_location ,就会用用http,其他时候用file。

  • tracks - 字符串,定义应该使用哪个音视频轨道,默认是“v1-a1”,也就是第一个音/视频轨道。

  • clipFrom - 整数,定义一个从媒体文件开始的偏移量,单位毫秒,也就是指定从哪里开始加载媒体文件的帧。

  • encryptionKey - 字符串,base64编码的字符串包含密钥(128/192/256 bit)用于解密文件。

  • encryptionIv - 字符串,base64编码的字符串包含初始向量(128 bit)用于解密文件。

  • encryptionScheme - 字符串,确定加密文件的协议。当前,仅支持两个协议。

面向mp4文件的 cenc 和面向字幕文件的 aes-cbc 。

使用速率过滤器的剪辑 Rate filter clip

必要字段:

  • type - 字符串,值为 rateFilter

  • rate - 浮点数,用于定义加速倍率。例如2表示两倍速。

允许范围是0.5~2,小数点后两位。

  • source - 一个clip对象,这个对象会被应用这个速率过滤器。

使用增益过滤器的剪辑 Gain filter clip

必要字段:

  • type - 字符串,值为 gainFilter

  • gain - 浮点数,用于定义音量增益系数。例如2表示两倍音量。

必须是正数,可以有小数点后两位。

  • source - 一个clip对象,这个对象会被应用这个增益过滤器。

使用混合(混流)过滤器的剪辑 Mix filter clip

必要字段:

  • type - 字符串,值为 mixFilter

  • sources - clip对象数组。这个数组至少要有一个clip,最多32个。

拼接剪辑 Concat clip

必要字段:

  • type - 字符串,值为 concat

  • durations - 整数数组,单位毫秒,标示MP4的持续时间。

数组必须和paths数组的元素数量和顺序对应。

可选字段:

  • paths - 字符串数组,包含MP4文件的路径。 paths 和 clipIds 两个字段必须设置其中一个。

  • clipIds - 字符串数组,包含source clips的id。

id会被转换成路径,通过发起请求到 vod_source_clip_map_uri 设置的uri。

paths 和 clipIds 两个字段必须设置其中一个。

  • tracks - 字符串,指定要使用的音视频轨道,默认是“v1-a1”,也就是用第一个音频和视频轨道。

indicates the timestamp offset of the first frame in the concatenated stream relative to the clip start time
  • offset - 整数,单位毫秒,指定拼接流里第一帧的时间戳偏移量,与clip的开始时间有关。

  • basePath - 字符串,定义一个基础路径,会被添加到所有的paths前面。

  • notifications - notification对象数组(后面细说),当一个切片被请求时,

所有落在切片的开始/结束时间之间的notification会被发出(原文fired)。

notification必须按照递增排序。

动态剪辑 Dynamic clip

必要字段:

  • type - 字符串,值为 dynamic

a string that uniquely identifies the dynamic clip, used for mapping the clip to its content
  • id - 字符串,用于标记这个动态剪辑,必须是唯一的,用来映射clip到它的内容

通知 Notification

必要字段:

  • offset - 整数,单位毫秒。指示通知应该被发送的时间。

an integer in milliseconds that indicates the time in which the notification should be fired.

当通知包含在media集合里, offset 与 firstClipTime 有关(点播是0)。

当通知包含在拼接剪辑里, offset 与拼接剪辑的开始有关。

when the notification object is contained in the media set, offset is relative to firstClipTime

(0 for vod). when the notification object is contained in a concat clip, offset is relative to

the beginning of the concat clip.

  • id - 字符串,用于标记这个通知,这个id可以被 vod_notification_uri 通过变量名 $vod_notification_id 引用。

隐藏式字幕 Closed Captions

必要字段:

  • id - 字符串,用于标记这个字幕。id会成为 INSTREAM-ID 字段(应该是指HLS里的标签属性值),

必须包含以下值CC1, CC3, CC3, CC4, 或SERVICEn, 前面这里的n是指0到63。

  • label - 字符串,更易理解的名字,用来指示字幕的语言。

可选字段:

  • language - 字符串,三个字幕的语言代码(ISO-639-2)。用于指示这个字幕的语言。

安全

授权/认证 Authorization

基于CDN的分发 CDN-based delivery

由nginx-vod-module打包的媒体可以使用CDN令牌进行保护,工作方式如下:

  • 某些应用程序对用户进行身份验证,并决定是否允许用户观看特定视频。如果用户被允许,应用程序将为视频的manifest生成一个标记化的URL。

  • CDN验证令牌,如果发现有效,则将请求转发给源上的nginx-vod-module。

  • nginx服务器构建manifest响应,并为其中包含的切片URL生成令牌。模块https://github.com/kaltura/nginx-secure-token-module 可以用来完成这项任务,它目前支持Akamai令牌和CloudFront令牌。

  • CDN验证请求的每个切片上的令牌。

在此设置中,强烈建议通过验证CDN请求来阻止对源服务器的直接访问。

如果没有这种保护,以某种方式获得源地址的用户将能够绕过CDN令牌限制。

如果使用Akamai,则可以使用https://github.com/refractalize/nginx_mod_akamai_g2o完成。

对于其他CDN,可以将CDN配置为向源端发送一个秘密header,然后使用nginx if语句简单地处理header:

        if ($http_x_secret_origin_header != "secret value") {
            return 403;
        }

除了上述功能外,大多数CDN还支持其他访问控制设置,例如地理位置。

这些限制对orgin是完全透明的,应该能很好地发挥作用。

直接分发 Direct delivery

在直接从nginx-vod-module中获取媒体的部署中,可以使用诸如 allow 、 deny 或 access_by_lua (对于更复杂的场景)这样的nginx访问控制指令来保护媒体。

此外,通过让nginx服务器验证令牌,也可以构建一个基于令牌的解决方案(如前一节中详细介绍的),而无需CDN。

模块 https://github.com/kaltura/nginx-akamai-token-validate-module 可被用于验证Akamai令牌。

启用模块的location将返回403,除非请求包含有效的Akamai令牌。更多详情请参阅这个模块的自述文件。

URL加密 URL encryption

作为标记化的另一种选择,URL加密可以用来防止攻击者能够构建一个可播放的URL。

URL加密可以用https://github.com/kaltura/nginx-secure-token-module,并支持HLS和DASH(manifest格式设置为segmentlist)。

在安全性方面,CDN令牌相对于URL加密的主要优点是CDN标记通常会过期,而加密URL则不然(获得可播放URL的人将可以无限期地使用它)

媒体加密 Media encryption

Nginx-vod-module支持AES-128和SAMPLE-AES HLS加密方案。

媒体加密和DRM(下面详细介绍)之间的主要区别是用于将加密密钥传输到客户端的机制。

使用媒体加密时,客户端通过执行一个简单的GET请求到nginx-vod-module来获取密钥,而使用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 location,并且使用 vod_drm_request_uri 配置请求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代表Widevine

  • key - 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;
}

Common Encryption 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 with PlayReady & Widevine PSSH together

  • MSS PlayReady

  • HLS FairPlay

性能建议

  1. For medium/large scale deployments, don't have users play the videos directly from nginx-vod-module.

Since all the different streaming protocols supported by nginx vod are HTTP based, they can be cached by standard HTTP proxies / CDNs.

For medium scale add a layer of caching proxies between the vod module and the end users

(can use standard nginx servers with proxy_pass & proxy_cache).

For large scale deployments, it is recommended to use a CDN (such as Akamai, Level3 etc.).

一般来说,最好让nginx vod尽可能靠近mp4文件的存储位置,并让缓存代理尽可能靠近最终用户。

  1. 启用nginx-vod-module缓存:

  • vod_metadata_cache - 节省了为每个片切片重新读取视频元数据的需要。这个缓存应该稍大些,GB级别(in the order of GBs)。

  • vod_response_cache - 保存manifest请求的响应。在nginx vod之前使用二层缓存服务器时,可能不需要此缓存。

不需要为这个缓存分配一个大的缓冲区,128M对于大多数部署来说可能已经足够了。

  • vod_mapping_cache - 仅对于mapped模式,通常只需几MB即可。

  • nginx本身的 open_file_cache - 缓存打开的文件句柄。

通过启用性能计数器(vod_performance_counters)和为nginx vod(vod_status)设置状态页面,可以跟踪这些缓存的命中/未命中率。

  1. local & mapped模式下,启用aio - nginx必须在编译时启用aio支持,并且必须在nginx配置文件(aio on)中启用它。

您可以通过查看vod状态页上的性能计数器——read_file(aio off)vs. async_read_file(aio on)来验证它是否工作。

  1. local & mapped模式下,启用异步打开文件(asynchronous file open) - nginx必须在编译时启用threads支持, 且 vod_open_file_thread_pool 必须在Nginx配置文件中定义。

您可以通过查看vod状态页上的性能计数器来验证它是否工作 - open_file vs. async_open_file。

注意open_file在vod_open_file_thread_pool启用时可以是非零的,由于打开文件缓存 - 打开请求从缓存中处理的话将被计为synchronous open_file。

Note that open_file may be nonzero with vod_open_file_thread_pool enabled, due to the open file cache - open requests that are served from cache will be counted as synchronous open_file.
  1. 当使用支持DRM的DASH/MSS时,如果视频文件每帧有一个NALU,请将 vod_min_single_nalu_per_frame_segment 设置为非零。

  1. 通过更改以下参数,可以减少此模块生成的流的多路复用开销:

  • HDS - set vod_hds_generate_moof_atom to off

  • HLS - set vod_hls_mpegts_align_frames to off and vod_hls_mpegts_interleave_frames to on

  1. 对于manifest响应启用gzip压缩 -

gzip_types application/vnd.apple.mpegurl video/f4m application/dash+xml text/xml

  1. 应用常见的nginx性能最佳实践,如tcp_nodelay=on、client_header_timeout等。

Configuration directives - base

vod

  • syntax: vod segmenter

  • default: n/a

  • context: location

Enables the nginx-vod module on the enclosing location.

在location里启用nginx-vod-module。

segmenter 可用的值:

  1. none - serves the MP4 files as is / clipped

  1. dash - Dynamic Adaptive Streaming over HTTP packager

  1. hds - Adobe HTTP Dynamic Streaming packager

  1. hls - Apple HTTP Live Streaming packager

  1. mss - Microsoft Smooth Streaming packager

  1. thumb - 缩略图截取

  1. volume_map - 音频音量映射

vod_mode

  • syntax: vod_mode mode

  • default: local

  • context: http, server, location

设置文件访问模式:local、remote或mapped。(可以看上面功能feature部分了解更多)

vod_status

  • syntax: vod_status

  • default: n/a

  • context: location

Enables the nginx-vod status page on the enclosing location.

启用一个统计页。

支持以下查询参数:

  • ?reset=1 - 重置性能计数器和缓存状态

  • ?format=prom - 输出返回为Prometheus适配的数据格式

Configuration directives - segmentation

vod_segment_duration

  • syntax: vod_segment_duration duration

  • default: 10s

  • context: http, server, location

设置切片的长度,单位毫秒(注意是毫秒)。十分建议使其是GOP长度的倍数。

如果切片长度不是GOP长度的倍数,然后 vod_align_segments_to_key_frames 启用了,这会导致manifest里显示的切片长度和实际切片长度不一致。

这也可能会导致流中出现空切片。

vod_live_window_duration

  • syntax: vod_live_window_duration duration

  • default: 30000

  • context: http, server, location

对于直播manifest,设置一个总的长度,单位毫秒,确认要返回的切片。(估计就是长度/切片长度=manifest里的切片数量)

如果是正数,模块会返回一个范围,vod_live_window_duration 到当前服务器时间。

如果是负数,模块会返回一个范围,从映射json文件的结尾到 -vod_live_window_duration 。

如果设置为0,直播manifest会包含映射json文件时间帧中的所有切片。

If the value is positive, nginx vod returns a range of maximum vod_live_window_duration milliseconds, ending at the current server time.
If the value is negative, nginx vod returns a range of maximum -vod_live_window_duration milliseconds from the end of the mapping json.
If the value is set to zero, the live manifest will contain all the segments that are fully contained in the mapping json time frame.

vod_force_playlist_type_vod

  • syntax: vod_force_playlist_type_vod on/off

  • default: off

  • context: http, server, location

生成一个点播流,即使媒体集合已经设置了 playlistType=live 。

启用这个设置有以下影响:

  1. 帧的时间戳会变连续且从0开始。

  1. 切片索引从1开始。

  1. 在HLS里,m3u8会同时包含 #EXT-X-PLAYLIST-TYPE:VOD 和 #EXT-X-ENDLIST。

这对于从直播流中截取点播非常有用。

vod_force_continuous_timestamps

  • syntax: vod_force_continuous_timestamps on/off

  • default: off

  • context: http, server, location

即使媒体集合有间隙也生成连续的时间戳。(这个间隙可能产生自 clipTimes )

如果启用了ID3时间戳(vod_hls_mpegts_output_id3_timestamps),就会包含 clipTimes 里设置的原始时间戳。

vod_bootstrap_segment_durations

  • syntax: vod_bootstrap_segment_durations duration

  • default: none

  • context: http, server, location

添加一个切片时长,单位毫秒。这个设置用于令开头的一些切片比默认切片长度更短,从而使自适应码率选择可以进行的更早,在不增加开销的情况

Adds a bootstrap segment duration in milliseconds. This setting can be used to make the first few segments
shorter than the default segment duration, thus making the adaptive bitrate selection kick-in earlier without
the overhead of short segments throughout the video.

vod_align_segments_to_key_frames

  • syntax: vod_align_segments_to_key_frames on/off

  • default: off

  • context: http, server, location

当启用的时候,模块强制所有的切片的开头为关键帧。启用这个设置会造成实际的切片长度和manifest里显示的时长不一致的情况(除非 vod_manifest_segment_durations_mode 设置为accurate)。

vod_segment_count_policy

  • syntax: vod_segment_count_policy last_short/last_long/last_rounded

  • default: last_short

  • context: http, server, location

设置切片的计算策略,例如设置切片长度是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

  • syntax: vod_manifest_duration_policy min/max

  • default: max

  • context: http, server, location

设置针对于包含多个流的manifest的计算时长的策略:

  • max - 使用最长的流的时长(默认)

  • min - 使用最短的(非0长度)的流的时长

vod_manifest_segment_durations_mode

  • syntax: vod_manifest_segment_durations_mode estimate/accurate

  • default: estimate

  • context: http, server, location

设置manifest请求里的计算切片长度的模式:

  • estimate - 报告时长依据nginx.conf里配置的。例如,如果 vod_segment_duration 设置为10000,那么HLS manifest里包含 #EXTINF:10

  • accurate - 报告精确的切片长度,参考帧的持续时间。例如对于一个帧率29.97和10秒切片,他报告第一个切片为10.01。精确模式同样会参考关键帧对齐,如果 vod_align_segments_to_key_frames 设置为on的话。

Configures the calculation mode of segment durations within manifest requests:
estimate - reports the duration as configured in nginx.conf, e.g. if vod_segment_duration has the value 10000,
an HLS manifest will contain #EXTINF:10
accurate - reports the exact duration of the segment, taking into account the frame durations, e.g. for a
frame rate of 29.97 and 10 second segments it will report the first segment as 10.01. accurate mode also
takes into account the key frame alignment, in case vod_align_segments_to_key_frames is on

vod_media_set_override_json

  • syntax: vod_media_set_override_json json

  • default: {}

  • context: http, server, location

参数提供了一个方式去覆写一部分媒体集合JSON文件(仅mapped模式)。

例如, vod_media_set_override_json '{"clipTo":20000}' 剪切媒体集合为20秒。

参数值可以包含变量。

Configuration directives - upstream

vod_upstream_location

  • syntax: vod_upstream_location location

  • default: none

  • context: http, server, location

设置一个nginx的location用于读取mp4文件(remote模式)或映射请求URI(mapped模式)。

vod_remote_upstream_location

  • syntax: vod_remote_upstream_location location

  • default: none

  • context: http, server, location

设置一个nginx的location用于读取mp4文件(remote或mapped模式)。如果这个配置是在映射模式里配置,则模块通过HTTP读取MP4文件,映射json文件里的路径当成URI对待(默认是从本地读取)。

vod_max_upstream_headers_size

  • syntax: vod_max_upstream_headers_size size

  • default: 4k

  • context: http, server, location

设置分配的大小用于处理到upstream请求(到vod_xxx_upstream_location)的响应头。

vod_upstream_extra_args

  • syntax: vod_upstream_extra_args "arg1=value1&arg2=value2&..."

  • default: empty

  • context: http, server, location

设置会被添加到upstream请求(仅remote和mapped模式)里的额外的查询字符串参数。

参数值可以包含变量。

vod_media_set_map_uri

  • syntax: vod_media_set_map_uri uri

  • default: $vod_suburi

  • context: http, server, location

设置媒体集合映射请求的uri,参数值可以包含变量。

对于多url的情况,$vod_suburi 将会是当前子uri(每个子URL发出单独请求)

Sets the uri of media set mapping requests, the parameter value can contain variables.
In case of multi url, $vod_suburi will be the current sub uri (a separate request is issued per sub URL)

vod_path_response_prefix

  • syntax: vod_path_response_prefix prefix

  • default: {"sequences":[{"clips":[{"type":"source","path":"

  • context: http, server, location

设置URI映射响应里所需的前缀(仅mapped模式)

vod_path_response_postfix

  • syntax: vod_path_response_postfix postfix

  • default: "}]}]}

  • context: http, server, location

设置URI映射响应里所需的后缀(仅mapped模式)

vod_max_mapping_response_size

  • syntax: vod_max_mapping_response_size length

  • default: 1K

  • context: http, server, location

设置从upstream返回的地址的最大长度(仅mapped模式)

Configuration directives - fallback

vod_fallback_upstream_location

  • syntax: vod_fallback_upstream_location location

  • default: none

  • context: http, server, location

设置一个nginx的location用于在发生文件不存在错误时请求(仅local/mapped模式)。

vod_proxy_header_name

  • syntax: vod_proxy_header_name name

  • default: X-Kaltura-Proxy

  • context: http, server, location

设置HTTP头的名字,用于避免退回代理循环(仅local/mapped模式)。

vod_proxy_header_value

  • syntax: vod_proxy_header_value name

  • default: dumpApiRequest

  • context: http, server, location

设置HTTP头的值,用于避免退回代理循环(仅local/mapped模式)。

Configuration directives - performance

vod_metadata_cache

  • syntax: vod_metadata_cache zone_name zone_size [expiration]

  • default: off

  • context: http, server, location

设置用于视频metadata缓存的大小和共享内存对象名称。对于MP4文件,这个缓存存储moov。

vod_mapping_cache

  • syntax: vod_mapping_cache zone_name zone_size [expiration]

  • default: off

  • context: http, server, location

设置用于点播的映射文件缓存的大小和共享内存对象名称(仅mapped模式)。

vod_live_mapping_cache

  • syntax: vod_live_mapping_cache zone_name zone_size [expiration]

  • default: off

  • context: http, server, location

设置用于直播的映射文件缓存的大小和共享内存对象名称(仅mapped模式)。

vod_response_cache

  • syntax: vod_response_cache zone_name zone_size [expiration]

  • default: off

  • context: http, server, location

设置响应缓存的大小和共享内存对象名称。响应缓存包括manifest和其他非视频内容(例如DASH的init切片,hls的加密密钥)。视频切片不会被缓存。

vod_live_response_cache

  • syntax: vod_live_response_cache zone_name zone_size [expiration]

  • default: off

  • context: http, server, location

设置用于“时间变化的直播响应”(time changing live responses)的响应缓存的大小和共享内存对象名称。

这个缓存保存以下类型的直播响应:DASH MPD,HLS index M3U8,HDS bootstrap,MSS manifest。

vod_initial_read_size

  • syntax: vod_initial_read_size size

  • default: 4K

  • context: http, server, location

设置初始化读取MP4文件操作的大小

Sets the size of the initial read operation of the MP4 file.

vod_max_metadata_size

  • syntax: vod_max_metadata_size size

  • default: 128MB

  • context: http, server, location

设置最大支持的视频metadata大小(对于MP4 - moov atom大小)

vod_max_frames_size

  • syntax: vod_max_frames_size size

  • default: 16MB

  • context: http, server, location

设置一个切片里帧的总大小限制。

vod_max_frame_count

  • syntax: vod_max_frame_count count

  • default: 1048576

  • context: http, server, location

设置为服务非切片(例如,播放列表)请求而读取的帧总数的限制。

Sets the limit on the total count of the frames read to serve non segment (e.g. playlist) request.

vod_segment_max_frame_count

  • syntax: vod_segment_max_frame_count count

  • default: 65536

  • context: http, server, location

设置为服务切片请求而读取的帧总数的限制。

Sets the limit on the total count of the frames read to serve segment request.

vod_cache_buffer_size

  • syntax: vod_cache_buffer_size size

  • default: 256K

  • context: http, server, location

设置当读取mp4帧的时候使用的缓冲区大小。

vod_open_file_thread_pool

  • syntax: vod_open_file_thread_pool pool_name

  • default: off

  • context: http, server, location

启用通过线程池使用异步打开文件。

线程池必须通过 thread_pool 设置定义,如果没有指定则会用默认的线程池。

这个设置进在Nginx1.7.11或更新版本上支持且需要在编译时启用 --add-threads 。

注意:这个设置当前禁用使用nginx的open_file_cache。

vod_output_buffer_pool

  • syntax: vod_output_buffer_pool size count

  • default: off

  • context: http, server, location

预分配用于生成响应数据的缓冲区,节省对于每个请求的分配/释放缓冲区的需求。

vod_performance_counters

  • syntax: vod_performance_counters zone_name

  • default: off

  • context: http, server, location

配置性能计数器的共享内存名称

Configuration directives - url structure

vod_base_url

  • syntax: vod_base_url url

  • default: see below

  • context: http, server, location

设置应该在manifest响应中返回的基础url(协议+域名)。

参数值可以包含变量,如果参数值是空字符串,会使用相对URl。

如果参数值以/结尾,则假定他是一个完整URL - 模块仅追加文件名到它后面,而不是完整的URI。

如果不设置,基础url会被定义为:

  1. 如果请求不包含一个host头(HTTP/1.0)那么会返回相对URL。

  1. 其他情况,基础URL会是 $scheme://$http_host

这个设置当前仅影响HLS和DASH。MSS和HDS里,永远返回相对URL。

vod_segments_base_url

  • syntax: vod_segments_base_url url

  • default: see below

  • context: http, server, location

设置应该在视频切片传输时使用的基础url(协议+域名)。

参数值可以包含变量,如果参数值是空字符串,会使用相对URl。

如果没有设置,就使用 vod_base_url

这个设置当前仅影响HLS

vod_multi_uri_suffix

  • syntax: vod_multi_uri_suffix suffix

  • default: .urlset

  • context: 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

  • syntax: vod_clip_to_param_name name

  • default: clipTo

  • context: http, server, location

自定义clipTo参数名。

vod_clip_from_param_name

  • syntax: vod_clip_from_param_name name

  • default: clipFrom

  • context: http, server, location

自定义clipFrom参数名。

vod_tracks_param_name

  • syntax: vod_tracks_param_name name

  • default: tracks

  • context: http, server, location

自定义tracks参数名。

vod_time_shift_param_name

  • syntax: vod_time_shift_param_name name

  • default: shift

  • context: http, server, location

自定义shift参数名。

vod_speed_param_name

  • syntax: vod_speed_param_name name

  • default: speed

  • context: http, server, location

自定义speed参数名。

vod_lang_param_name

  • syntax: vod_lang_param_name name

  • default: lang

  • context: http, server, location

自定义lang参数名。

vod_force_sequence_index

  • syntax: vod_force_sequence_index on/off

  • default: off

  • context: http, server, location

定义是否当即使只有一个序列,也在切片uri中使用序列索引。

Configuration directives - response headers

vod_expires

  • syntax: vod_expires time

  • default: none

  • context: http, server, location

对于成功的请求,设置响应头里的“Expires”和“Cache-Control”的的值。

这个配置项类似于nginx本身的expires配置,不同之处在于它仅支持过期间隔场景(expiration interval scenario)。(不支持epoch, max, off, day time)

使用这个配置而不是nginx内建的 expires 的主要动机是为了让vod和动态直播内容有不同的过期时间。

如果这个配置项未指定,模块不会设置 "Expires" / "Cache-Control" 头。

这个设置影响所有类型的vod播放列表请求和直播的切片请求。

vod_expires_live

  • syntax: vod_expires_live time

  • default: none

  • context: http, server, location

和上面的 vod_expires 一样的,用于不依赖于时间的非切片的直播请求(例如HLS-master.m3u8,HDS-manifest.f4m)。

vod_expires_live_time_dependent

  • syntax: vod_expires_live_time_dependent time

  • default: none

  • context: http, server, location

和上面的 vod_expires 一样的,用于依赖于时间的直播请求(例如HLS-index.m3u8,HDS-bootstrap.abst,MSS-manifest,DASH-manifest.mpd)。

vod_last_modified

  • syntax: vod_last_modified time

  • default: none

  • context: http, server, location

设置响应头里Last-Modified的值,默认情况下模块返回的响应没有Last-Modified头。

有这个参数的原因是为了支持If-Modified-Since / If-Unmodified-Since。

由于nginx内建的ngx_http_not_modified_filter_module比其他任何header过滤器模块更早运行,它将看不到任何add_headers / more_set_headers设置的头。

这导致nginx永远回复,就好像内容改变了。(412 for If-Unmodified-Since / 200 for If-Modified-Since)

对于非切片直播请求(例如直播DASH MPD),Last-Modified会被设置为当前服务器时间。

vod_last_modified_types

  • syntax: vod_last_modified_types mime-type1 mime-type2 ...

  • default: none

  • context: http, server, location

设置哪些MIME类型要设置Last-Modified头。

设置为“*”则匹配所有MIME类型。

Configuration directives - ad stitching (mapped mode only)

vod_dynamic_mapping_cache

  • syntax: vod_dynamic_mapping_cache zone_name zone_size [expiration]

  • default: off

  • context: http, server, location

设置用于存储动态剪辑的映射文件的缓存的大小和共享内存对象名称。

Configures the size and shared memory object name of the cache that stores the mapping of dynamic clips.

vod_dynamic_clip_map_uri

  • syntax: vod_dynamic_clip_map_uri uri

  • default: none

  • context: http, server, location

设置要用于映射动态剪辑的uri。

参数值可以包含变量,具体来说 $vod_clip_id 包含应映射的剪辑id。

这个Uri的预期响应是一个包含拼接剪辑(concat clip)对象的JSON。

vod_source_clip_map_uri

  • syntax: vod_source_clip_map_uri uri

  • default: none

  • context: http, server, location

设置要用于映射通过concat的clipIds属性定义的源剪辑的uri。

参数值可以包含变量,具体来说 $vod_clip_id 包含应映射的剪辑id。

这个Uri的预期响应是一个包含源剪辑(source clip)对象的JSON。

Sets the uri that should be used to map source clips defined using the clipIds property of concat.

vod_redirect_segments_url

  • syntax: vod_redirect_segments_url url

  • default: none

  • context: http, server, location

设置一个请求切片时要重定向的url。

参数值可以包含变量,具体来说, $vod_dynamic_mapping 包含动态剪辑(dynamic clips)的一个序列化表示.

Sets a url to which requests for segments should be redirected.
The parameter value can contain variables, specifically, $vod_dynamic_mapping contains a serialized representation of the mapping of dynamic clips.

vod_apply_dynamic_mapping

  • syntax: vod_apply_dynamic_mapping mapping

  • default: none

  • context: http, server, location

使用之前通过 $vod_dynamic_mapping 生成的给定的表达式映射动态剪辑到拼接剪辑。

参数值可以包含变量。

Maps dynamic clips to concat clips using the given expression, previously generated by $vod_dynamic_mapping.

vod_notification_uri

  • syntax: vod_notification_uri uri

  • default: none

  • context: http, server, location

设置用于发起通知的uri。

参数值可以包含变量,具体来说, $vod_notification_id 包含要触发的通知的id。

从这个uri来的响应会被忽略。

Configuration directives - DRM / encryption

vod_secret_key

  • syntax: vod_secret_key string

  • default: empty

  • context: http, server, location

设置用于生成TS加密密钥和DASH/MSS加密IV的种子(seed)。

参数值可以包含变量,且通常具有“secret-$vod_filepath”结构。

请参阅下面这个模块添加的nginx变量列表。

vod_encryption_iv_seed

  • syntax: vod_encryption_iv_seed string

  • default: empty

  • context: http, server, location

设置用于生成加密IV的种子(seed),目前仅适用于带有AES-128加密的HLS/fMP4。

参数值可以包含变量。

vod_drm_enabled

  • syntax: vod_drm_enabled on/off

  • default: off

  • context: http, server, location

启用时,模块根据从drm upstream得到的响应加密媒体切片。

目前仅支持dash和mss(play ready)。

vod_drm_single_key

  • syntax: vod_drm_single_key on/off

  • default: off

  • context: http, server, location

启用时,模块只请求第一个序列的drm信息,并将其应用于所有序列。

禁用时,将分别请求每个序列的drm信息。

此外,在DASH中,启用此设置使模块将ContentProtection标记置于AdaptationSet下,否则,它被置于Representation之下。

vod_drm_clear_lead_segment_count

  • syntax: vod_drm_clear_lead_segment_count count

  • default: 1

  • context: http, server, location

设置流开头的clear(未加密)切片的数目。一个明确的领先(clear lead)优势使播放器可以开始播放,而不必等待license的响应。

vod_drm_max_info_length

  • syntax: vod_drm_max_info_length length

  • default: 4K

  • context: http, server, location

设置从upstream返回的drm信息的最长长度。

vod_drm_upstream_location

  • syntax: vod_drm_upstream_location location

  • default: none

  • context: http, server, location

设置用于获取文件DRM信息的nginx location。

vod_drm_info_cache

  • syntax: vod_drm_info_cache zone_name zone_size [expiration]

  • default: off

  • context: http, server, location

配置drm信息缓存的大小和共享内存对象名。

vod_drm_request_uri

  • syntax: vod_drm_request_uri uri

  • default: $vod_suburi

  • context: http, server, location

设置drm信息请求的uri,参数值可以包含变量。

在多URL的情况下, $vod_suburi 将是当前的子uri(每个子URL发出单独的drm信息请求)

vod_min_single_nalu_per_frame_segment

  • syntax: vod_min_single_nalu_per_frame_segment index

  • default: 0

  • context: http, server, location

设置应假定每帧具有单个h264 nalu的最小切片索引(基于1)。

如果值是0,则不对每帧的NAL单元数作任何假设。

此设置仅影响启用DRM的DASH和MSS配置。

Sets the minimum segment index (1-based) that should be assumed to have a single h264 nalu per frame.
If the value is 0, no assumption is being made on the number of nal units per frame.
This setting only affects DASH and MSS configurations that have DRM enabled.

在使用libx264对视频进行转码时,默认情况下,所有帧都只有一个nal单元,但第一个帧除外,它包含一个带有libx264版权信息的附加nalu。

将该参数设置为大于0的值可以显著提高性能,因为可以提前计算切片的布局,允许模块:

  • 生成时输出切片缓冲区(它不需要等待整个切片完成)

  • 避免对不需要切片数据的请求进行帧处理(例如HEAD、范围0-0等)。

When transcoding videos using libx264, by default, all frames have a single nal unit, except the first frame
that contains an additional nalu with the libx264 copyright information. Setting this parameter to a value
greater than 0 can provide a significant performance improvement, since the layout of the segment can be
calculated in advance, allowing the module to:
Output segment buffers as they are generated (it doesn't have to wait for the whole segment to complete)
Avoid frame processing for requests that do not need the segment data (e.g. HEAD, range 0-0, etc.)

Configuration directives - DASH

vod_dash_absolute_manifest_urls

  • syntax: vod_dash_absolute_manifest_urls on/off

  • default: on

  • context: http, server, location

如果启用,则对于MPD请求服务器返回绝对URL

vod_dash_manifest_file_name_prefix

  • syntax: vod_dash_manifest_file_name_prefix name

  • default: manifest

  • context: http, server, location

指定MPD文件的名字(mpd扩展名不用写)。

vod_dash_profiles

  • syntax: vod_dash_profiles profiles

  • default: urn:mpeg:dash:profile:isoff-main:2011

  • context: http, server, location

设置manifest响应中MPD标签里返回的profiles信息。

vod_dash_init_file_name_prefix

  • syntax: vod_dash_init_file_name_prefix name

  • default: init

  • context: http, server, location

MP4 init文件的名称(隐含了mp4扩展名)。

vod_dash_fragment_file_name_prefix

  • syntax: vod_dash_fragment_file_name_prefix name

  • default: frag

  • context: http, server, location

切片文件的名称(隐含了m4s扩展名)。

vod_dash_manifest_format

  • syntax: vod_dash_manifest_format format

  • default: segmenttimeline

  • context: http, server, location

设置MPD格式,可选项:

  • segmentlist - 使用SegmentList和SegmentURL标签,这个格式下,每个切片的URL都明确的在MPD里设置。

  • segmenttemplate - 使用SegmentTemplate,针对每个切片返回一个持续时间。

  • segmenttimeline - 使用SegmentTemplate和SegmentTimeline来明确设置切片的持续时间。

vod_dash_subtitle_format

  • syntax: vod_dash_subtitle_format format

  • default: webvtt

  • context: http, server, location

设置MPD中返回的字幕格式,可选项:

  • webvtt - WebVTT

  • smpte-tt - SMPTE Timed Text

vod_dash_init_mp4_pssh

  • syntax: vod_dash_init_mp4_pssh on/off

  • default: on

  • context: http, server, location

启用时,DRM pssh box会在DASH的init切片和manifest中返回。

禁用时,pssh box仅会在manifest中返回。

vod_dash_duplicate_bitrate_threshold

  • syntax: vod_dash_duplicate_bitrate_threshold threshold

  • default: 4096

  • context: http, server, location

去除相同码率的码率阈值,码率差异小于该值的会被认为是相同的。

vod_dash_use_base_url_tag

  • syntax: vod_dash_use_base_url_tag on/off

  • default: off

  • context: http, server, location

启用时,一个BaseURL标签会被用于指定切片和init切片的基础url。

否则,SegmentTemplate下的media/initialization属性会包含绝对URL。

Configuration directives - HDS

HDS没啥用,不翻译了

vod_hds_absolute_manifest_urls

  • syntax: vod_hds_absolute_manifest_urls on/off

  • default: on

  • context: http, server, location

When enabled the server returns the base URL in the F4M manifest

vod_hds_manifest_file_name_prefix

  • syntax: vod_hds_manifest_file_name_prefix name

  • default: manifest

  • context: http, server, location

The name of the HDS manifest file (an f4m extension is implied).

vod_hds_fragment_file_name_prefix

  • syntax: vod_hds_fragment_file_name_prefix name

  • default: frag

  • context: http, server, location

The prefix of fragment file names, the actual file name is frag-f-v-a-Seg1-Frag.

vod_hds_generate_moof_atom

  • syntax: vod_hds_generate_moof_atom on/off

  • default: on

  • context: http, server, location

When enabled the module generates a moof atom in the HDS fragments, when disabled only an mdat atom is generated.

Turning this parameter off reduces the packaging overhead, however the default is on since Adobe tools are generating this atom.

Configuration directives - HLS

vod_hls_encryption_method

  • syntax: vod_hls_encryption_method method

  • default: none

  • context: http, server, location

设置HLS切片的加密方法,允许的值:none(默认),aes-128,sample-aes,sample-aes-cenc。

vod_hls_force_unmuxed_segments

  • syntax: vod_hls_force_unmuxed_segments on/off

  • default: off

  • context: http, server, location

启用时,服务器返回的视频流使用的音频流是在分开的切片里(使用EXT-X-MEDIA)

vod_hls_container_format

  • syntax: vod_hls_container_format mpegts/fmp4/auto

  • default: auto

  • context: http, server, location

设置HLS切片的容器格式。

默认是对hevc用fmp4,其他用mpegts(苹果不支持HEVC用mpegts)。

vod_hls_absolute_master_urls

  • syntax: vod_hls_absolute_master_urls on/off

  • default: on

  • context: http, server, location

启用时,master播放列表请求中会返回绝对的播放列表URL。

vod_hls_absolute_index_urls

  • syntax: vod_hls_absolute_index_urls on/off

  • default: on

  • context: http, server, location

启用时,播放列表的请求会返回绝对切片URL。

vod_hls_absolute_iframe_urls

  • syntax: vod_hls_absolute_iframe_urls on/off

  • default: off

  • context: http, server, location

启用时,I帧播放列表的请求会返回绝对切片URL。

vod_hls_output_iframes_playlist

  • syntax: vod_hls_output_iframes_playlist on/off

  • default: on

  • context: http, server, location

禁用时,I帧播放列表不会在master播放列表里返回。

vod_hls_master_file_name_prefix

  • syntax: vod_hls_master_file_name_prefix name

  • default: master

  • context: http, server, location

HLS主播放列表文件名(隐含一个m3u8扩展名)。

vod_hls_index_file_name_prefix

  • syntax: vod_hls_index_file_name_prefix name

  • default: index

  • context: http, server, location

HLS播放列表文件名(隐含一个m3u8扩展名)。

vod_hls_iframes_file_name_prefix

  • syntax: vod_hls_iframes_file_name_prefix name

  • default: iframes

  • context: http, server, location

HLS I帧播放列表文件的名称(隐含一个m3u8扩展名)。

vod_hls_segment_file_name_prefix

  • syntax: vod_hls_segment_file_name_prefix name

  • default: seg

  • context: http, server, location

切片文件名前缀,实际文件名是 seg--v-a.ts。

vod_hls_init_file_name_prefix

  • syntax: vod_hls_init_file_name_prefix name

  • default: init

  • context: http, server, location

init切片文件名,仅当使用fmp4容器格式时才相关。

vod_hls_encryption_key_file_name

  • syntax: vod_hls_encryption_key_file_name name

  • default: encryption.key

  • context: http, server, location

加密密钥文件名,仅当加密方法不是设置为 none 时才相关。

vod_hls_encryption_key_uri

  • syntax: vod_hls_encryption_key_uri uri

  • default: a url pointing to encryption.key

  • context: http, server, location

设置EXT-X-KEY标签的URI属性的值,仅当加密方法不是设置为 none 时才相关。

参数值可以包含变量。

vod_hls_encryption_key_format

  • syntax: vod_hls_encryption_key_format format

  • default: none

  • context: http, server, location

设置EXT-X-KEY标签的KEYFORMAT属性的值,仅当加密方法不是设置为 none 时才相关。

vod_hls_encryption_key_format_versions

  • syntax: vod_hls_encryption_key_format_versions versions

  • default: none

  • context: http, server, location

设置EXT-X-KEY标签的KEYFORMATVERSIONS属性的值,仅当加密方法不是设置为 none 时才相关。

vod_hls_mpegts_interleave_frames

  • syntax: vod_hls_mpegts_interleave_frames on/off

  • default: off

  • context: http, server, location

启用时,HLS复用器交织不同流(音频/视频)的帧。

禁用时,在音频/视频之间的每次切换时复用器刷新MPEGTS数据包。

When enabled, the HLS muxer interleaves frames of different streams (audio / video).
When disabled, on every switch between audio / video the muxer flushes the MPEG TS packet.

vod_hls_mpegts_align_frames

  • syntax: vod_hls_mpegts_align_frames on/off

  • default: on

  • context: http, server, location

当启用时,每个视频/音频帧与MPEGTS数据包边界对齐,必要时添加填充。

vod_hls_mpegts_output_id3_timestamps

  • syntax: vod_hls_mpegts_output_id3_timestamps on/off

  • default: off

  • context: http, server, location

当启用时,每个TS切片将输出一个ID3 TEXT帧,包含带绝对时间戳的JSON。时间戳以纪元起始以毫秒计算(unixtime x 1000),JSON结构: {"timestamp":1459779115000}

vod_hls_mpegts_align_pts

  • syntax: vod_hls_mpegts_align_pts on/off

  • default: off

  • context: http, server, location

启用的话,模块将通过初始化帧的pts延迟后移dts时间戳。

这可以帮助在多个rendition之间对齐pts时间戳。

Configuration directives - MSS

vod_mss_manifest_file_name_prefix

  • syntax: vod_mss_manifest_file_name_prefix name

  • default: manifest

  • context: http, server, location

自定义manifest文件的名字(没有扩展名)。

vod_mss_duplicate_bitrate_threshold

  • syntax: vod_mss_duplicate_bitrate_threshold threshold

  • default: 4096

  • context: http, server, location

去除相同码率的码率阈值,码率差异小于该值的会被认为是相同的。

The bitrate threshold for removing identical bitrates, streams whose bitrate differences are less than this value will be considered identical.

Configuration directives - thumbnail capture

vod_thumb_file_name_prefix

  • syntax: vod_thumb_file_name_prefix name

  • default: thumb

  • context: http, server, location

缩略图文件前缀(隐含了jpg扩展名)。

vod_thumb_accurate_positioning

  • syntax: vod_thumb_accurate_positioning on/off

  • default: on

  • context: http, server, location

如果启用,模块抓取最接近偏移量的帧。

禁用,则使用最接近偏移量的关键帧。

设置这个参数为off可以更快的截取缩略图,因为模块总是对每个请求解码一个视频帧。

Setting this parameter to off can result in faster thumbnail capture, since the module always decodes a single video frame per request.

vod_gop_look_behind

  • syntax: vod_gop_look_behind millis

  • default: 10000

  • context: http, server, location

设置要加载的缩略图的偏移值前的间隔(毫秒)。

这个设置应该被设置为最大GOP大小,设置一个更小的值可能导致截图失败。

注意所有offset - vod_gop_look_behind 和 offset + vod_gop_look_ahead 之间的所有帧的metadata会被加载,然而只有包含 offset 的最小GOP帧会被读取和解码。

vod_gop_look_ahead

  • syntax: vod_gop_look_ahead millis

  • default: 1000

  • context: http, server, location

设置要加载的缩略图的偏移值后的间隔(毫秒)。

Sets the interval (in milliseconds) after the thumbnail offset that should be loaded.

Configuration directives - volume map

vod_volume_map_file_name_prefix

  • syntax: vod_volume_map_file_name_prefix name

  • default: volume_map

  • context: http, server, location

音量映射文件的名称(隐含了csv后缀)。

vod_volume_map_interval

  • syntax: vod_volume_map_interval millis

  • default: 1000

  • context: http, server, location

设置音量映射的间隔/分辨率(毫秒)

Sets the interval/resolution (in milliseconds) of the volume map.

Configuration directives - misc

vod_ignore_edit_list

  • syntax: vod_ignore_edit_list on/off

  • default: off

  • context: http, server, location

当启用时,模块忽略任何MP4文件里的elst。

vod_parse_hdlr_name

  • syntax: vod_parse_hdlr_name on/off

  • default: off

  • context: http, server, location

启用时,模块解析hdlr MP4 atom的name字段,并将其用作流标签。

vod_parse_udta_name

  • syntax: vod_parse_udta_name on/off

  • default: off

  • context: http, server, location

启用后,模块解析udta MP4atom的name atom子元素,并将其用作流标签。

Nginx变量 Nginx variables

这个模块添加了以下Nginx变量:

  • $vod_suburi - 当前子uri。例如,如果url是:

http:////,,,,.urlset/

当处理第一个uri时, $vod_suburi 将会拥有值 http://///

  • $vod_filepath - local/mapped 模式下,当前子uri的文件路径。remote 模式下,值和 $vod_suburi 一样。

  • $vod_set_id - 媒体集合的id。

  • $vod_sequence_id - 包含当前序列的id,如果在映射json文件里没有指定id,这个变量将和 $vod_suburi 一样。

  • $vod_clip_id - 当前剪辑的id,这个变量在这些阶段有一个值:

  1. Mapping of dynamic clips to concat clips

  1. Mapping of source clip to paths

  • $vod_notification_id - the id of the current notification, the value is non-empty only when referenced by vod_notification_uri

  • $vod_dynamic_mapping - a serialized representation of the mapping of dynamic clips to concat clips.

  • $vod_request_params - 请求参数的序列化表示,例如12-f2-v1-a1,变量包含:

  1. 切片索引(对于切片请求)

  1. 序列索引

  1. 音视频轨道的选择

  • $vod_status - 模块的内部错误代码,提供了比http状态更细粒度的错误分类。

定义了以下值:

BAD_REQUEST - 请求不合法,例如, clipFrom 比视频的长度还要长。

NO_STREAMS - 请求了不合法的切片索引。

EMPTY_MAPPING - 映射响应是空的

BAD_MAPPING - 映射json不合法,例如,缺失了 sequences 元素。

BAD_DATA - 视频文件已损坏。

EXPIRED - 当前服务器时间比 expirationTime 大。

ALLOC_FAILED - 模块分配内存失败

UNEXPECTED - 一个不应该发生的场景,很可能是模块中的bug

  • $vod_segment_duration - 对于切片请求,包含切片的持续时间,单位毫秒。

  • $vod_frames_bytes_read - 对于切片请求,处理媒体帧时读取的字节总数。

注意:可以接受变量的配置指令被显式标记为这样。

Note: Configuration directives that can accept variables are explicitly marked as such.

示例配置文件 Sample configurations

Local模式配置文件 Local configuration

    http {
        upstream fallback {
            server fallback.kaltura.com:80;
        }

        server {
            # vod settings
            vod_mode local;
            vod_fallback_upstream_location /fallback;
            vod_last_modified 'Sun, 19 Nov 2000 08:52:00 GMT';
            vod_last_modified_types *;

            # vod caches
            vod_metadata_cache metadata_cache 512m;
            vod_response_cache response_cache 128m;
            
            # gzip manifests
            gzip on;
            gzip_types application/vnd.apple.mpegurl;

            # file handle caching / aio
            open_file_cache          max=1000 inactive=5m;
            open_file_cache_valid    2m;
            open_file_cache_min_uses 1;
            open_file_cache_errors   on;
            aio on;
            
            location ^~ /fallback/ {
                internal;
                proxy_pass http://fallback/;
                proxy_set_header Host $http_host;
            }

            location /content/ {
                root /web/;
                vod hls;
                
                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;
            }
        }
    }

Mapped模式配置文件 Mapped configuration

    http {
        upstream kalapi {
            server www.kaltura.com:80;
        }

        upstream fallback {
            server fallback.kaltura.com:80;
        }

        server {
            # vod settings
            vod_mode mapped;
            vod_upstream_location /kalapi;
            vod_upstream_extra_args "pathOnly=1";
            vod_fallback_upstream_location /fallback;
            vod_last_modified 'Sun, 19 Nov 2000 08:52:00 GMT';
            vod_last_modified_types *;

            # vod caches
            vod_metadata_cache metadata_cache 512m;
            vod_response_cache response_cache 128m;
            vod_mapping_cache mapping_cache 5m;
            
            # gzip manifests
            gzip on;
            gzip_types application/vnd.apple.mpegurl;

            # file handle caching / aio
            open_file_cache          max=1000 inactive=5m;
            open_file_cache_valid    2m;
            open_file_cache_min_uses 1;
            open_file_cache_errors   on;
            aio on;
            
            location ^~ /fallback/ {
                internal;
                proxy_pass http://fallback/;
                proxy_set_header Host $http_host;
            }

            location ^~ /kalapi/ {
                internal;
                proxy_pass http://kalapi/;
                proxy_set_header Host $http_host;
            }

            location ~ ^/p/\d+/(sp/\d+/)?serveFlavor/ {
                # encrypted hls
                vod hls;
                vod_secret_key "mukkaukk$vod_filepath";
                vod_hls_encryption_method aes-128;
                
                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;
            }
        }
    }

Mapped + Remote 模式配置文件 Mapped + Remote configuration

    http {
        upstream jsonupstream {
            server jsonserver:80;
        }

        server {
            # vod settings
            vod_mode mapped;
            vod_upstream_location /json;
            vod_remote_upstream_location /proxy;
            vod_upstream_extra_args "pathOnly=1";
            vod_last_modified 'Sun, 19 Nov 2000 08:52:00 GMT';
            vod_last_modified_types *;

            # vod caches
            vod_metadata_cache metadata_cache 512m;
            vod_response_cache response_cache 128m;
            vod_mapping_cache mapping_cache 5m;

            # gzip manifests
            gzip on;
            gzip_types application/vnd.apple.mpegurl;

            # file handle caching / aio
            open_file_cache      max=1000 inactive=5m;
            open_file_cache_valid    2m;
            open_file_cache_min_uses 1;
            open_file_cache_errors   on;
            aio on;

            location ^~ /json/hls/ {
                internal;
                proxy_pass http://jsonupstream/;
                proxy_set_header Host $http_host;
            }

            location ~ /proxy/([^/]+)/(.*) {
                internal;
                proxy_pass $1://$2;
                resolver 8.8.8.8;
            }

            location ~ ^/hls/ {
                vod hls;

                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;
            }
        }
    }

Set it up so that http://jsonserver:80/test.json returns the following JSON:

    {
        "sequences": [{
            "clips": [{
                "type": "source",
                "path": "/http/commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4"
            }]
        }]
    }

And use this stream URL - http://nginx-vod-server/hls/test.json/master.m3u8

Remote模式的配置 Remote configuration

    http {
        upstream kalapi {
            server www.kaltura.com:80;
        }

        server {
            # vod settings
            vod_mode remote;
            vod_upstream_location /kalapi;
            vod_last_modified 'Sun, 19 Nov 2000 08:52:00 GMT';
            vod_last_modified_types *;

            # vod caches
            vod_metadata_cache metadata_cache 512m;
            vod_response_cache response_cache 128m;
            
            # gzip manifests
            gzip on;
            gzip_types application/vnd.apple.mpegurl;
            
            location ^~ /kalapi/ {
                internal;
                proxy_pass http://kalapi/;
                proxy_set_header Host $http_host;
            }

            location ~ ^/p/\d+/(sp/\d+/)?serveFlavor/ {
                vod hls;
                
                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;
            }
        }
    }

Copyright & License

All code in this project is released under the AGPLv3 license unless a different license for a particular library is specified in the applicable library path.

Copyright © Kaltura Inc. All rights reserved.

你可能感兴趣的:(nginx,工作中用到的,nginx,linux)