vod: NGINX-basierter VOD-Paketierer
Installation
Sie können dieses Modul in jeder RHEL-basierten Distribution installieren, einschließlich, aber nicht beschränkt auf:
- RedHat Enterprise Linux 7, 8, 9 und 10
- CentOS 7, 8, 9
- AlmaLinux 8, 9
- Rocky Linux 8, 9
- Amazon Linux 2 und 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
Aktivieren Sie das Modul, indem Sie Folgendes an den Anfang von /etc/nginx/nginx.conf hinzufügen:
load_module modules/ngx_http_vod_module.so;
Dieses Dokument beschreibt nginx-module-vod v1.33, veröffentlicht am 01. Januar 2024.
nginx-vod-module 
Schließen Sie sich der Liste der Organisationen an, die dieses Video-Paketierungsprojekt verwenden.
Für Live-Video-Streaming verwenden Sie bitte Media-Framework.
Funktionen
-
On-the-fly Neupaketierung von MP4-Dateien in DASH, HDS, HLS, MSS
-
Arbeitsmodi:
- Lokal - lokal zugängliche Dateien bereitstellen (lokale Festplatte/NFS gemountet)
- Remote - Dateien bereitstellen, die über HTTP mit Range-Anfragen zugänglich sind
-
Gemappt - Dateien gemäß einer Spezifikation bereitstellen, die im JSON-Format kodiert ist. Das JSON kann von einem Remote-Server abgerufen oder aus einer lokalen Datei gelesen werden
-
Unterstützung für adaptive Bitraten
-
Unterstützung für Playlists (Abspielen mehrerer verschiedener Mediendateien nacheinander) - nur im gemappten Modus
-
Unterstützung für simuliertes Live-Streaming (Erzeugung eines Live-Streams aus MP4-Dateien) - nur im gemappten Modus
-
Fallback-Unterstützung für Dateien, die in lokalen/gemappten Modi nicht gefunden wurden (nützlich in Multi-Datacenter-Umgebungen)
-
Video-Codecs: 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)
-
Unterstützung für Untertitel -
Eingabe: 1. WebVTT 2. SRT 3. DFXP/TTML 4. CAP (Cheetah)
Ausgabe: 1. DASH - entweder ein einzelnes WebVTT oder SMPTE-TT-Segmente (konfigurierbar) 2. HLS - segmentiertes WebVTT (m3u8) 3. MSS - in TTML konvertiert und in fragmentierten MP4 verpackt (keine Unterstützung für Styling)
-
Nur Audio-/Nur Video-Dateien
-
Alternative Audio-Versionen - Unterstützung für beide:
- Erstellung eines Manifests mit unterschiedlichen Audio-Versionen, die eine Auswahl auf der Client-Seite ermöglichen
-
Muxing von Audio- und Video-Streams aus separaten Dateien/Tracks - ermöglicht es, verschiedene Audio-Versionen eines einzelnen Videos bereitzustellen, ohne dass spezielle Unterstützung auf der Client-Seite erforderlich ist.
-
Track-Auswahl für Multi-Audio/Video MP4-Dateien
-
Änderung der Wiedergabegeschwindigkeit - 0,5x bis 2x (benötigt libavcodec und libavfilter)
-
Zuschneiden von Quelldateien (nur von I-Frame zu P-Frame)
-
Unterstützung für variable Segmentlängen - ermöglicht es dem Player, die optimale Bitrate schnell auszuwählen, ohne die Überlastung durch kurze Segmente für die gesamte Dauer des Videos
-
Zuschneiden von MP4-Dateien für das Abspielen von progressiven Downloads
-
Thumbnail-Erfassung (benötigt libavcodec) und Größenänderung (benötigt libswscale)
-
Lautstärkekarte (benötigt libavcodec) - gibt eine CSV zurück, die den Lautstärkepegel in jedem Intervall enthält
-
Entschlüsselung von CENC-verschlüsselten MP4-Dateien (es ist möglich, solche Dateien mit MP4Box zu erstellen)
-
DASH: Unterstützung für gemeinsame Verschlüsselung (CENC)
-
MSS: Unterstützung für PlayReady-Verschlüsselung
-
HLS: Erstellung einer I-Frames-Playlist (EXT-X-I-FRAMES-ONLY)
-
HLS: Unterstützung für AES-128 / SAMPLE-AES-Verschlüsselung
Einschränkungen
-
Track-Auswahl und Änderung der Wiedergabegeschwindigkeit werden im progressiven Download nicht unterstützt
-
Die Generierung von I-Frames-Playlists wird nicht unterstützt, wenn die Verschlüsselung aktiviert ist
-
Nur unter Linux getestet
rpm -ihv http://installrepo.kaltura.org/releases/kaltura-release.noarch.rpm
yum install kaltura-nginx
#### Debian/Ubuntu deb-Paket
*Ubuntu HINWEIS: Bevor Sie versuchen, kaltura-nginx zu installieren, müssen Sie auch sicherstellen, dass das Multiverse-Repo aktiviert ist.*
Für Debian Wheezy [7], Debian Jessie [8], Ubuntu 14.04 und 14.10 fügen Sie dieses Repo hinzu:
```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
Für Ubuntu 16.04, 16.10 fügen Sie dieses Repo hinzu:
## 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
Für Ubuntu 20.04 fügen Sie dieses Repo hinzu:
## 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
Dann installieren Sie das kaltura-nginx-Paket:
## apt-get update
## apt-get install kaltura-nginx
Wenn Sie die folgenden Funktionen nutzen möchten: - Thumbnail-Erfassung - Änderung der Wiedergabegeschwindigkeit - 0,5x bis 2x
Müssen Sie auch das kaltura-ffmpeg (>= 3.1) Paket installieren.
URL-Struktur
Grundlegende URL-Struktur
Die grundlegende Struktur einer nginx-vod-module-URL ist:
http://<domain>/<location>/<fileuri>/<filename>
Wo:
* domain - die Domain des nginx-vod-module-Servers
* location - der im nginx.conf angegebenen Standort
* fileuri - eine URI zur mp4-Datei:
* lokaler Modus - der vollständige Dateipfad wird gemäß den root-/alias-Direktiven in nginx.conf bestimmt
* gemappter Modus - der vollständige Dateipfad wird gemäß dem JSON bestimmt, das vom Upstream/der lokalen Datei empfangen wird
* Remote-Modus - die mp4-Datei wird in Teilen vom Upstream gelesen
* Hinweis: In gemappten und Remote-Modi ist die URL der Upstream-Anfrage http://<upstream>/<location>/<fileuri>?<extraargs>
(extraargs wird durch den Parameter vod_upstream_extra_args bestimmt)
* filename - im Folgenden erläutert
Multi-URL-Struktur
Multi-URLs werden verwendet, um mehrere URLs in einer einzigen URL zu kodieren. Eine Multi-URL kann verwendet werden, um die URLs mehrerer verschiedener MP4-Dateien anzugeben, die beispielsweise zusammen in einem DASH MPD enthalten sein sollten.
Die Struktur einer Multi-URL ist:
http://<domain>/<location>/<prefix>,<middle1>,<middle2>,<middle3>,<postfix>.urlset/<filename>
Die obige Beispiel-URL stellt 3 URLs dar:
* http://<domain>/<location>/<prefix><middle1><postfix>/<filename>
* http://<domain>/<location>/<prefix><middle2><postfix>/<filename>
* http://<domain>/<location>/<prefix><middle3><postfix>/<filename>
Das Suffix .urlset (kann mit vod_multi_uri_suffix geändert werden) zeigt an, dass die URL als Multi-URL behandelt werden sollte.
Zum Beispiel - die URL http://example.com/hls/videos/big_buck_bunny_,6,9,15,00k.mp4.urlset/master.m3u8 gibt ein Manifest zurück, das Folgendes enthält:
* 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-Pfadparameter
Die folgenden Parameter werden im URL-Pfad unterstützt:
* clipFrom - ein Offset in Millisekunden seit Beginn des Videos, wo der generierte Stream starten soll.
Zum Beispiel, .../clipFrom/10000/... erzeugt einen Stream, der 10 Sekunden in das Video startet.
* clipTo - ein Offset in Millisekunden seit Beginn des Videos, wo der generierte Stream enden soll.
Zum Beispiel, .../clipTo/60000/... erzeugt einen Stream, der auf 60 Sekunden gekürzt ist.
* tracks - kann verwendet werden, um spezifische Audio-/Video-Tracks auszuwählen. Die Struktur des Parameters ist: v<id1>-v<id2>-a<id1>-a<id2>...
Für Beispiel, .../tracks/v1-a1/... wählt den ersten Video-Track und den ersten Audio-Track aus.
Der Standard ist, alle Tracks einzuschließen.
* shift - kann verwendet werden, um einen zeitlichen Versatz auf einen oder mehrere Streams anzuwenden. Die Struktur des Parameters ist: v<vshift>-a<ashift>-s<sshift>
Für Beispiel, .../shift/v100/... wendet einen Vorversatz von 100ms auf die Video-Zeitstempel an.
Dateinamenstruktur
Die Struktur des Dateinamens ist:
<basename>[<seqparams>][<fileparams>][<trackparams>][<langparams>].<extension>
Wo:
* basename + extension - die Optionen sind paketabhängig (die folgende Liste gilt für die Standardeinstellungen):
* dash - manifest.mpd
* hds - manifest.f4m
* hls Master-Playlist - master.m3u8
* hls Medien-Playlist - index.m3u8
* mss - manifest
* thumb - thumb-<offset>[<resizeparams>].jpg (offset ist der Thumbnail-Video-Offset in Millisekunden)
* volume_map - volume_map.csv
* seqparams - kann verwendet werden, um spezifische Sequenzen nach ID auszuwählen (im Mapping-JSON bereitgestellt), z.B. master-sseq1.m3u8.
* fileparams - kann verwendet werden, um spezifische Sequenzen nach Index auszuwählen, wenn Multi-URLs verwendet werden.
Für Beispiel, manifest-f1.mpd gibt nur ein MPD von der ersten URL zurück.
* trackparams - kann verwendet werden, um spezifische Audio-/Video-Tracks auszuwählen.
Für Beispiel, manifest-a1.f4m gibt ein F4M zurück, das nur den ersten Audio-Stream jeder Sequenz enthält.
Der Standard ist, die ersten Audio- und Video-Tracks jeder Datei einzuschließen.
Die im Dateinamen ausgewählten Tracks werden mit den mit dem /tracks/-Pfadparameter ausgewählten Tracks verknüpft.
v0/a0 wählt alle Video-/Audio-Tracks entsprechend aus.
Die a/v-Parameter können mit f/s kombiniert werden, z.B. f1-v1-f2-a1 = video1 von file1 + audio1 von file2, f1-f2-v1 = video1 von file1 + video1 von file2.
* langparams - kann verwendet werden, um Audio-Tracks/Untertitel nach ihrer Sprache (ISO639-3-Code) zu filtern.
Für Beispiel, master-leng.m3u8 gibt nur englische Audio-Tracks zurück.
* resizeparams - kann verwendet werden, um das zurückgegebene Thumbnail-Bild zu ändern. Zum Beispiel, thumb-1000-w150-h100.jpg erfasst ein Thumbnail
1 Sekunde in das Video und ändert die Größe auf 150x100. Wenn eine der Dimensionen weggelassen wird, wird ihr Wert so gesetzt, dass das
resultierende Bild das Seitenverhältnis des Video-Frames beibehält.
Mapping-Antwortformat
Wenn konfiguriert, um im gemappten Modus zu arbeiten, sendet nginx-vod-module eine HTTP-Anfrage an einen konfigurierten Upstream-Server, um das Layout der Medienstreams zu erhalten, die es generieren soll. Die Antwort muss im JSON-Format vorliegen.
Dieser Abschnitt enthält einige einfache Beispiele, gefolgt von einer Referenz der unterstützten Objekte und Felder. Aber zuerst einige Definitionen:
Source Clip- eine Menge von Audio- und/oder Video-Frames (Tracks), die aus einer einzelnen Mediendatei extrahiert wurdenGenerator- eine Komponente, die Audio-/Video-Frames generieren kann. Derzeit ist der einzige unterstützte Generator der Stille-Generator.Filter- eine Manipulation, die auf Audio-/Video-Frames angewendet werden kann. Die folgenden Filter werden unterstützt:- Änderung der Rate (Geschwindigkeit) - gilt sowohl für Audio als auch für Video
- Änderung der Audio-Lautstärke
- Mix - kann verwendet werden, um mehrere Audio-Tracks zusammenzuführen oder den Audio-Stream von Quelle A mit dem Video von Quelle B zu mischen
Clip- das Ergebnis der Anwendung von null oder mehr Filtern auf eine Menge von Quell-ClipsDynamic Clip- ein Clip, dessen Inhalt im Voraus nicht bekannt ist, z.B. gezielte WerbeinhalteSequence- eine Menge von Clips, die nacheinander abgespielt werden sollen.Set- mehrere Sequenzen, die zusammen als ein adaptives Set abgespielt werden, jede Sequenz muss die gleiche Anzahl von Clips haben.
Einfaches Mapping
Das folgende JSON mappt die Anfrage-URI auf eine einzelne MP4-Datei:
{
"sequences": [
{
"clips": [
{
"type": "source",
"path": "/path/to/video.mp4"
}
]
}
]
}
Bei der Verwendung von Multi-URLs ist dies das einzige erlaubte JSON-Muster. Mit anderen Worten, es ist nicht möglich, komplexere JSONs mit Multi-URL zu kombinieren.
Adaptives Set
Als Alternative zur Verwendung von Multi-URL kann ein adaptives Set über JSON definiert werden:
{
"sequences": [
{
"clips": [
{
"type": "source",
"path": "/path/to/bitrate1.mp4"
}
]
},
{
"clips": [
{
"type": "source",
"path": "/path/to/bitrate2.mp4"
}
]
}
]
}
Playlist
Das folgende JSON spielt 35 Sekunden von video1 gefolgt von 22 Sekunden von video2:
{
"durations": [ 35000, 22000 ],
"sequences": [
{
"clips": [
{
"type": "source",
"path": "/path/to/video1.mp4"
},
{
"type": "source",
"path": "/path/to/video2.mp4"
}
]
}
]
}
Filter
Das folgende JSON nimmt video1, spielt es mit x1.5 ab und mischt den Audio-Stream des Ergebnisses mit dem Audio von video2, nachdem es auf 50% Lautstärke reduziert wurde:
{
"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"
}
}
]
}
]
}
]
}
Kontinuierliches Live
Das folgende JSON ist ein Beispiel für einen kontinuierlichen Live-Stream (= ein Live-Stream, in dem alle Videos genau die gleichen Kodierungsparameter haben). In der Praxis muss dieses JSON von einem Skript generiert werden, da es zeitabhängig ist. (siehe test/playlist.php für eine Beispielimplementierung)
{
"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"
}
]
}
]
}
Nicht-kontinuierliches Live
Das folgende JSON ist ein Beispiel für einen nicht-kontinuierlichen Live-Stream (= ein Live-Stream, in dem die Videos unterschiedliche Kodierungsparameter haben). In der Praxis muss dieses JSON von einem Skript generiert werden, da es zeitabhängig ist (siehe test/playlist.php für eine Beispielimplementierung)
{
"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"
}
]
}
]
}
Mapping-Referenz
Set (Top-Level-Objekt im Mapping-JSON)
Obligatorische Felder:
* sequences - Array von Sequenzobjekten.
Das Mapping muss mindestens eine Sequenz und bis zu 32 Sequenzen enthalten.
Optionale Felder:
* id - eine Zeichenfolge, die das Set identifiziert. Die ID kann durch $vod_set_id abgerufen werden.
* playlistType - Zeichenfolge, kann auf live, vod oder event gesetzt werden (nur für HLS-Playlists unterstützt), Standard ist vod.
* durations - ein Array von Ganzzahlen, das die Clip-Dauern in Millisekunden darstellt.
Dieses Feld ist obligatorisch, wenn das Mapping mehr als einen Clip pro Sequenz enthält.
Wenn angegeben, muss dieses Array mindestens ein Element und bis zu 128 Elemente enthalten.
* discontinuity - boolesch, gibt an, ob die verschiedenen Clips in jeder Sequenz unterschiedliche Medienparameter haben. Dieses Feld hat unterschiedliche Manifestationen je nach
Lieferprotokoll - ein Wert von true erzeugt #EXT-X-DISCONTINUITY in HLS,
und ein Multi-Perioden-MPD in DASH. Der Standardwert ist true, setzen Sie ihn nur auf false, wenn die Mediendateien mit genau denselben Parametern (z.B. in AVC) transcodiert wurden,
die Clips sollten genau dasselbe SPS/PPS haben.
* segmentDuration - Ganzzahl, setzt die Segmentdauer in Millisekunden. Dieses Feld,
wenn angegeben, hat Vorrang vor dem in vod_segment_duration festgelegten Wert.
* consistentSequenceMediaInfo - boolesch, betrifft derzeit nur DASH. Wenn auf true (Standard) gesetzt,
wird das MPD in jedem Perioden-Element die gleichen Medienparameter melden. Auf false setzen
kann schwerwiegende Leistungsprobleme bei langen Sequenzen haben (nginx-vod-module muss
die Medieninformationen aller im Mapping enthaltenen Clips lesen, um das MPD zu generieren)
* referenceClipIndex - Ganzzahl, setzt den (1-basierten) Index des Clips, der verwendet werden soll,
um die Videometadaten für Manifestanfragen abzurufen (Codec, Breite, Höhe usw.)
Wenn consistentSequenceMediaInfo auf false gesetzt ist, hat dieser Parameter keine Auswirkungen -
alle Clips werden geparst. Wenn dieser Parameter nicht angegeben ist, verwendet nginx-vod-module standardmäßig den letzten Clip.
* notifications - Array von Benachrichtigungsobjekten (siehe unten), wenn ein Segment angefordert wird,
werden alle Benachrichtigungen, die zwischen den Start-/Endzeiten des Segments liegen, ausgelöst.
die Benachrichtigungen müssen in aufsteigender Offset-Reihenfolge angeordnet sein.
* clipFrom - Ganzzahl, enthält einen Zeitstempel, der angibt, wo der zurückgegebene Stream starten soll.
Das Setzen dieses Parameters ist gleichbedeutend mit dem Übergeben von /clipFrom/ in der URL.
* clipTo - Ganzzahl, enthält einen Zeitstempel, der angibt, wo der zurückgegebene Stream enden soll.
Das Setzen dieses Parameters ist gleichbedeutend mit dem Übergeben von /clipTo/ in der URL.
* cache - boolesch, wenn auf false gesetzt, wird die Mapping-Antwort nicht im Cache gespeichert (vod_mapping_cache).
Der Standardwert ist true.
* closedCaptions - Array von Objekten für geschlossene Untertitel (siehe unten), die Sprachen und IDs enthalten
aller eingebetteten CEA-608 / CEA-708-Untertitel. Wenn ein leeres Array bereitgestellt wird, gibt das Modul aus
CLOSED-CAPTIONS=NONE bei jedem EXT-X-STREAM-INF-Tag aus. Wenn die Liste nicht im JSON erscheint, wird das
Modul keine CLOSED-CAPTIONS-Felder in der Playlist ausgeben.
Live-Felder:
* firstClipTime - Ganzzahl, obligatorisch für alle Live-Playlists, es sei denn, clipTimes ist angegeben.
Enthält die absolute Zeit des ersten Clips in der Playlist, in Millisekunden seit der Epoche (unixtime x 1000)
* clipTimes - Array von Ganzzahlen, setzt die absolute Zeit aller Clips in der Playlist,
in Millisekunden seit der Epoche (unixtime x 1000). Dieses Feld kann nur verwendet werden, wenn
discontinuity auf true gesetzt ist. Die Zeitstempel können Lücken enthalten, dürfen jedoch nicht überlappen
(clipTimes[n + 1] >= clipTimes[n] + durations[n])
* segmentBaseTime - Ganzzahl, obligatorisch für kontinuierliche Live-Streams, enthält die absolute
Zeit des ersten Segments des Streams, in Millisekunden seit der Epoche (unixtime x 1000).
Dieser Wert darf sich während der Wiedergabe nicht ändern.
Für nicht kontinuierliche Live-Streams ist dieses Feld optional:
* wenn nicht gesetzt, werden sequentielle Segmentindizes während der gesamten Playlist verwendet.
In diesem Fall muss der Upstream-Server, der das Mapping-JSON generiert, den Status beibehalten,
und initialSegmentIndex jedes Mal aktualisieren, wenn ein Clip aus der Playlist entfernt wird.
* wenn gesetzt, dürfen die zeitlichen Lücken zwischen Clips nicht kleiner sein als vod_segment_duration.
* firstClipStartOffset - Ganzzahl, optional, gemessen in Millisekunden. Dieses Feld enthält die
Differenz zwischen der ersten Clip-Zeit und der ursprünglichen Startzeit des ersten Clips -
die Zeit, die er hatte, als er ursprünglich hinzugefügt wurde (bevor das Live-Fenster verschoben wurde)
* initialClipIndex - Ganzzahl, obligatorisch für nicht kontinuierliche Live-Streams, die Videos mit
unterschiedlichen Kodierungsparametern (SPS/PPS) mischen, enthält den Index des ersten Clips in der Playlist.
Jedes Mal, wenn ein Clip aus dem Kopf der Playlist geschoben wird, muss dieser Wert um eins erhöht werden.
* initialSegmentIndex - Ganzzahl, obligatorisch für Live-Streams, die segmentBaseTime nicht setzen,
enthält den Index des ersten Segments in der Playlist. Jedes Mal, wenn ein Clip aus dem Kopf der Playlist geschoben wird, muss dieser Wert um die Anzahl der Segmente im Clip erhöht werden.
* presentationEndTime - Ganzzahl, optional, gemessen in Millisekunden seit der Epoche.
wenn bereitgestellt, vergleicht das Modul die aktuelle Zeit mit dem bereitgestellten Wert,
und signalisiert das Ende der Live-Präsentation, wenn presentationEndTime überschritten wurde.
In HLS beispielsweise steuert dieser Parameter, ob ein #EXT-X-ENDLIST-Tag in der Medien-Playlist enthalten sein soll.
Wenn der Parameter nicht bereitgestellt wird, signalisiert das Modul nicht das Ende der Live-Präsentation.
* expirationTime - Ganzzahl, optional, gemessen in Millisekunden seit der Epoche.
wenn bereitgestellt, vergleicht das Modul die aktuelle Zeit mit dem bereitgestellten Wert,
und wenn expirationTime überschritten wurde, gibt das Modul einen 404-Fehler für Manifestanfragen zurück
(Segmentanfragen werden weiterhin bedient).
wenn sowohl presentationEndTime als auch expirationTime überschritten wurden, hat presentationEndTime Vorrang,
d.h. Manifestanfragen werden bedient und das Ende der Präsentation signalisiert.
* liveWindowDuration - Ganzzahl, optional, bietet eine Möglichkeit, vod_live_window_duration
in der Konfiguration zu überschreiben. Wenn der Wert den absoluten Wert überschreitet, der in
vod_live_window_duration angegeben ist, wird er ignoriert.
* timeOffset - Ganzzahl, setzt einen Offset, der auf die Serveruhr angewendet werden soll, wenn Live-Anfragen bedient werden. Dieser Parameter kann verwendet werden, um zukünftige/vergangene Ereignisse zu testen.
Sequenz
Obligatorische Felder:
* clips - Array von Clip-Objekten (obligatorisch). Die Anzahl der Elemente muss mit der Anzahl übereinstimmen
der im Set angegebenen Dauer-Arrays. Wenn das Dauer-Array nicht angegeben ist,
muss das Clips-Array ein einzelnes Element enthalten.
Optionale Felder:
* id - eine Zeichenfolge, die die Sequenz identifiziert. Die ID kann durch $vod_sequence_id abgerufen werden.
* language - ein 3-Buchstaben (ISO-639-2) Sprachcode, dieses Feld hat Vorrang vor jeder Sprache
, die in der Mediendatei (MP4 mdhd-Atom) angegeben ist
* label - eine freundliche Zeichenfolge, die die Sequenz identifiziert. Wenn eine Sprache angegeben ist,
wird ein Standardlabel automatisch davon abgeleitet - z.B. wenn die Sprache ita ist,
wird standardmäßig italiano als Label verwendet.
* bitrate - ein Objekt, das verwendet werden kann, um die Bitrate für die verschiedenen Medientypen festzulegen,
in Bits pro Sekunde. Zum Beispiel, {"v": 900000, "a": 64000}. Wenn die Bitrate nicht angegeben ist,
wird nginx-vod-module sie basierend auf dem letzten Clip in der Sequenz schätzen.
* avg_bitrate - ein Objekt, das verwendet werden kann, um die durchschnittliche Bitrate für die verschiedenen Medientypen festzulegen,
in Bits pro Sekunde. Siehe bitrate oben für ein Beispielobjekt. Wenn angegeben, verwendet das Modul den Wert, um
den AVERAGE-BANDWIDTH-Attribut von #EXT-X-STREAM-INF in HLS zu befüllen.
Clip (abstrakt)
Obligatorische Felder:
* type - eine Zeichenfolge, die den Typ des Clips definiert. Zulässige Werte sind:
* source
* rateFilter
* mixFilter
* gainFilter
* silence
* concat
* dynamic
Optionale Felder:
* keyFrameDurations - Array von Ganzzahlen, die die Dauer in Millisekunden der Video-Keyframes
im Clip enthalten. Dieses Attribut kann nur auf den obersten Clips jeder Sequenz bereitgestellt werden,
das Bereitstellen dieses Attributs auf verschachtelten Clips hat keine Auswirkungen.
Das Bereitstellen der Keyframe-Dauern ermöglicht es dem Modul sowohl:
1. die Segmente an Keyframes auszurichten
2. die korrekten Segmentdauern im Manifest zu melden - bietet eine Alternative zum Setzen
vod_manifest_segment_durations_mode auf accurate, was für Multi-Clip
Medien-Sets (aus Leistungsgründen) nicht unterstützt wird.
* firstKeyFrameOffset - Ganzzahl, Offset des ersten Video-Keyframes im Clip,
messen in Millisekunden relativ zu firstClipTime. Standardmäßig 0, wenn nicht bereitgestellt.
Quellclip
Obligatorische Felder:
* type - eine Zeichenfolge mit dem Wert source
* path - eine Zeichenfolge, die den Pfad zur MP4-Datei enthält. Die Zeichenfolge "empty" kann verwendet werden, um
eine leere Untertiteldatei darzustellen (nützlich, falls nur einige Videos in einer Playlist Untertitel haben)
Optionale Felder:
* id - eine Zeichenfolge, die den Quellclip identifiziert
* sourceType - legt die Schnittstelle fest, die zum Lesen der MP4-Datei verwendet werden soll, zulässige Werte sind:
file und http. Standardmäßig verwendet das Modul http, wenn vod_remote_upstream_location gesetzt ist,
und file andernfalls.
* tracks - eine Zeichenfolge, die die Tracks angibt, die verwendet werden sollen, der Standard ist "v1-a1",
das bedeutet den ersten Video-Track und den ersten Audio-Track
* clipFrom - eine Ganzzahl, die einen Offset in Millisekunden angibt, vom Beginn der
Mediendatei, von dem aus Frames geladen werden sollen
* encryptionKey - eine base64-codierte Zeichenfolge, die den Schlüssel (128/192/256 Bit) enthält, der verwendet werden soll,
um die Datei zu entschlüsseln.
* encryptionIv - eine base64-codierte Zeichenfolge, die den IV (128 Bit) enthält, der verwendet werden soll,
um die Datei zu entschlüsseln.
* encryptionScheme - das Verschlüsselungsschema, das verwendet wurde, um die Datei zu verschlüsseln. Derzeit
sind nur zwei Schemen unterstützt - cenc für MP4-Dateien, aes-cbc für Untertiteldateien.
Rate-Filter-Clip
Obligatorische Felder:
* type - eine Zeichenfolge mit dem Wert rateFilter
* rate - eine Fließkommazahl, die den Beschleunigungsfaktor angibt, z.B. ein Wert von 2 bedeutet doppelte Geschwindigkeit.
Zulässige Werte liegen im Bereich von 0,5 bis 2 mit bis zu zwei Dezimalstellen
* source - ein Clip-Objekt, auf dem die Ratenfilterung durchgeführt werden soll
Gain-Filter-Clip
Obligatorische Felder:
* type - eine Zeichenfolge mit dem Wert gainFilter
* gain - eine Fließkommazahl, die den Verstärkungsfaktor angibt, z.B. ein Wert von 2 bedeutet doppelt so laut.
Der Gain muss positiv sein und bis zu zwei Dezimalstellen haben
* source - ein Clip-Objekt, auf dem die Gain-Filterung durchgeführt werden soll
Mix-Filter-Clip
Obligatorische Felder:
* type - eine Zeichenfolge mit dem Wert mixFilter
* sources - ein Array von Clip-Objekten zum Mischen. Dieses Array muss mindestens einen Clip und
bis zu 32 Clips enthalten.
Concat-Clip
Obligatorische Felder:
* type - eine Zeichenfolge mit dem Wert concat
* durations - ein Array von Ganzzahlen, die MP4-Dauern in Millisekunden darstellen,
dieses Array muss in Anzahl und Reihenfolge mit dem paths-Array übereinstimmen.
Optionale Felder:
* paths - ein Array von Zeichenfolgen, die die Pfade der MP4-Dateien enthalten. Entweder paths oder clipIds muss angegeben werden.
* clipIds - ein Array von Zeichenfolgen, die die IDs der Quellclips enthalten.
Die IDs werden in Pfade übersetzt, indem eine Anfrage an die URI gesendet wird, die in vod_source_clip_map_uri angegeben ist.
Either paths or clipIds must be specified.
* tracks - eine Zeichenfolge, die die Tracks angibt, die verwendet werden sollen, der Standard ist "v1-a1",
das bedeutet den ersten Video-Track und den ersten Audio-Track
* offset - eine Ganzzahl in Millisekunden, die den Zeitstempel-Offset des
ersten Frames im zusammengefügten Stream relativ zur Clip-Startzeit angibt
* basePath - eine Zeichenfolge, die als Präfix zu allen Pfaden hinzugefügt werden soll
* notifications - Array von Benachrichtigungsobjekten (siehe unten), wenn ein Segment angefordert wird,
werden alle Benachrichtigungen, die zwischen den Start-/Endzeiten des Segments liegen, ausgelöst.
die Benachrichtigungen müssen in aufsteigender Offset-Reihenfolge angeordnet sein.
Dynamischer Clip
Obligatorische Felder:
* type - eine Zeichenfolge mit dem Wert dynamic
* id - eine Zeichenfolge, die den dynamischen Clip eindeutig identifiziert, die zum Mapping des Clips auf seinen Inhalt verwendet wird
Benachrichtigung
Obligatorische Felder:
* offset - eine Ganzzahl in Millisekunden, die die Zeit angibt, zu der die Benachrichtigung ausgelöst werden soll.
wenn das Benachrichtigungsobjekt im Medien-Set enthalten ist, ist offset relativ zu firstClipTime
(0 für vod). wenn das Benachrichtigungsobjekt in einem concat-Clip enthalten ist, ist offset relativ zu
der Anfangszeit des concat-Clips.
* id - eine Zeichenfolge, die die Benachrichtigung identifiziert, diese ID kann durch vod_notification_uri
unter Verwendung der Variablen $vod_notification_id referenziert werden
Geschlossene Untertitel
Obligatorische Felder:
* id - eine Zeichenfolge, die die eingebetteten Untertitel identifiziert. Dies wird das INSTREAM-ID-Feld und muss
einen der folgenden Werte haben: CC1, CC3, CC3, CC4 oder SERVICEn, wobei n zwischen 1 und 63 liegt.
* label - eine freundliche Zeichenfolge, die die Sprache des geschlossenen Untertitel-Tracks angibt.
Optionale Felder:
* language - ein 3-Buchstaben (ISO-639-2) Sprachcode, der die Sprache des geschlossenen Untertitel-Tracks angibt.
Sicherheit
URL-Verschlüsselung
Als Alternative zur Tokenisierung kann die URL-Verschlüsselung verwendet werden, um zu verhindern, dass ein Angreifer in der Lage ist, eine abspielbare URL zu erstellen. Die URL-Verschlüsselung kann implementiert werden mit https://github.com/kaltura/nginx-secure-token-module und wird für HLS und DASH (mit Manifestformat auf segmentlist gesetzt) unterstützt.
In Bezug auf die Sicherheit ist der Hauptvorteil von CDN-Token gegenüber der URL-Verschlüsselung, dass CDN-Token normalerweise ablaufen, während verschlüsselte URLs dies nicht tun (jemand, der eine abspielbare URL erhält, kann sie unbegrenzt verwenden)
Medienverschlüsselung
Nginx-vod-module unterstützt AES-128 und SAMPLE-AES HLS-Verschlüsselungsschemata. Der Hauptunterschied zwischen Medienverschlüsselung und DRM (im Folgenden detailliert) ist der Mechanismus, der verwendet wird, um den Verschlüsselungsschlüssel an den Client zu übertragen. Bei der Medienverschlüsselung wird der Schlüssel vom Client durch eine einfache GET-Anfrage an nginx-vod-module abgerufen, während bei DRM der Schlüssel innerhalb einer anbieter-spezifischen Lizenzantwort zurückgegeben wird.
Die Medienverschlüsselung reduziert das Problem der Sicherung der Medien auf die Notwendigkeit, den Verschlüsselungsschlüssel zu sichern. Die URLs der Mediensegmente (die den Großteil des Traffics ausmachen) können vollständig ungeschützt sein, und leicht von beliebigen Proxys zwischen dem Client und den Servern zwischengespeichert werden (im Gegensatz zur Tokenisierung). Die Anfrage nach dem Verschlüsselungsschlüssel kann dann mit einer der oben genannten Methoden geschützt werden (CDN-Token, nginx-Zugriffsregeln usw.).
Darüber hinaus ist es möglich, nginx-vod-module so zu konfigurieren, dass der Verschlüsselungsschlüssel über HTTPS
zurückgegeben wird, während die Segmente über HTTP geliefert werden. Der Weg, dies zu konfigurieren, besteht darin, vod_segments_base_url
auf http://nginx-vod-host und vod_base_url auf https://nginx-vod-host zu setzen.
DRM
Nginx-vod-module hat die Fähigkeit, On-the-fly-Verschlüsselung für MPEG DASH (CENC), MSS Play Ready und FairPlay HLS durchzuführen. Wie im Fall der Medienverschlüsselung wird die Verschlüsselung beim Bereitstellen eines Video-/Audio-Segments an den Client durchgeführt, daher wird empfohlen, den Inhalt nicht direkt von nginx-vod-module an Endbenutzer bereitzustellen. Eine skalierbarere Architektur wäre es, Proxy-Server oder ein CDN zu verwenden, um die verschlüsselten Segmente zwischenzuspeichern.
Um die Verschlüsselung durchzuführen, benötigt nginx-vod-module mehrere Parameter, einschließlich key & key_id, diese Parameter
werden von einem externen Server über HTTP GET-Anfragen abgerufen.
Der Parameter vod_drm_upstream_location gibt einen nginx-Standort an, der verwendet wird, um auf den DRM-Server zuzugreifen,
und die Anfrage-URI wird mit vod_drm_request_uri konfiguriert (dieser Parameter kann nginx-Variablen enthalten).
Die Antwort des DRM-Servers ist ein JSON mit folgendem Format:
[{
"pssh": [{
"data": "CAESEGMyZjg2MTczN2NjNGYzODIaB2thbHR1cmEiCjBfbmptaWlwbXAqBVNEX0hE",
"uuid": "edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"
}],
"key": "GzoNU9Dfwc//Iq3/zbzMUw==",
"key_id": "YzJmODYxNzM3Y2M0ZjM4Mg=="
}]
pssh.data- base64-codierte Binärdaten, das Format dieser Daten ist drm-anbieterspezifischpssh.uuid- die UUID des drm-Systems, in diesem Fall steht edef8ba9-79d6-4ace-a3c8-27dcd51d21ed für Widevinekey- base64-codierter Verschlüsselungsschlüssel (128 Bit)key_id- base64-codierte Schlüssel-ID (128 Bit)iv- optional base64-codierter Initialisierungsvektor (128 Bit). Der IV wird derzeit nur in HLS (FairPlay) verwendet, in den anderen Protokollen wird ein IV automatisch von nginx-vod-module generiert.
Beispielkonfigurationen
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;
}
Gemeinsame Verschlüsselung 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;
}
Überprüfte Konfigurationen
Folgendes ist eine Liste von Konfigurationen, die getestet und als funktionierend befunden wurden: * DASH/CENC mit PlayReady & Widevine PSSH zusammen * MSS PlayReady * HLS FairPlay
Leistungsempfehlungen
-
Für mittelgroße/große Bereitstellungen sollten Benutzer die Videos nicht direkt von nginx-vod-module abspielen. Da alle verschiedenen Streaming-Protokolle, die von nginx vod unterstützt werden, HTTP-basiert sind, können sie von Standard-HTTP-Proxys / CDNs zwischengespeichert werden. Für mittelgroße Bereitstellungen fügen Sie eine Schicht von Caching-Proxys zwischen dem vod-Modul und den Endbenutzern hinzu (kann Standard-nginx-Server mit proxy_pass & proxy_cache verwenden). Für große Bereitstellungen wird empfohlen, ein CDN (wie Akamai, Level3 usw.) zu verwenden.
Im Allgemeinen ist es am besten, nginx vod so nah wie möglich an dem Ort zu haben, an dem die MP4-Dateien gespeichert sind, und die Caching-Proxys so nah wie möglich an den Endbenutzern. 2. Aktivieren Sie die Caches von nginx-vod-module: *
vod_metadata_cache- spart die Notwendigkeit, die Video-Metadaten für jedes Segment erneut zu lesen. Dieser Cache sollte ziemlich groß sein, in der Größenordnung von GBs. *vod_response_cache- speichert die Antworten von Manifestanfragen. Dieser Cache ist möglicherweise nicht erforderlich, wenn eine zweite Schicht von Caching-Servern vor nginx vod verwendet wird. Es ist nicht notwendig, einen großen Puffer für diesen Cache zuzuweisen, 128M ist wahrscheinlich mehr als genug für die meisten Bereitstellungen. *vod_mapping_cache- nur für den gemappten Modus, wenige MB sind normalerweise ausreichend. * nginxs open_file_cache - speichert geöffnete Dateihandles.Die Hit/Miss-Verhältnisse dieser Caches können verfolgt werden, indem Leistungszähler (
vod_performance_counters) aktiviert werden und eine Statusseite für nginx vod (vod_status) eingerichtet wird. 3. In lokalen und gemappten Modi aio aktivieren. - nginx muss mit aio-Unterstützung kompiliert werden, und es muss in der nginx.conf aktiviert werden (aio on). Sie können überprüfen, ob es funktioniert, indem Sie die Leistungszähler auf der vod-Statusseite überprüfen - read_file (aio aus) vs. async_read_file (aio an) 4. In lokalen und gemappten Modi asynchrones Öffnen von Dateien aktivieren - nginx muss mit Thread-Unterstützung kompiliert werden, undvod_open_file_thread_poolmuss in nginx.conf angegeben werden. Sie können überprüfen, ob es funktioniert, indem Sie die Leistungszähler auf der vod-Statusseite überprüfen - open_file vs. async_open_file. Beachten Sie, dass open_file möglicherweise nicht null ist, wenn vod_open_file_thread_pool aktiviert ist, aufgrund des offenen Dateicaches - offene Anfragen, die aus dem Cache bedient werden, werden als synchrone open_file gezählt. 5. Wenn Sie DRM-aktivierte DASH/MSS verwenden, und die Videodateien ein einzelnes NALU pro Frame haben, setzen Sievod_min_single_nalu_per_frame_segmentauf einen Wert größer als null. 6. Die Muxing-Überlastung der von diesem Modul generierten Streams kann durch Ändern der folgenden Parameter reduziert werden: * HDS - setzen Sievod_hds_generate_moof_atomauf aus * HLS - setzen Sievod_hls_mpegts_align_framesauf aus undvod_hls_mpegts_interleave_framesauf an 7. Aktivieren Sie die gzip-Kompression für Manifest-Antworten -gzip_types application/vnd.apple.mpegurl video/f4m application/dash+xml text/xml8. Wenden Sie allgemeine nginx-Leistungsbest Practices an, wie tcp_nodelay=on, client_header_timeout usw.
Konfigurationsdirektiven - Basis
vod
- syntax:
vod segmenter - default:
n/a - context:
location
Aktiviert das nginx-vod-Modul am umschließenden Standort.
Die zulässigen Werte für segmenter sind:
none- dient die MP4-Dateien unverändert / zugeschnittendash- Dynamisches adaptives Streaming über HTTP-Paketiererhds- Adobe HTTP Dynamic Streaming-Paketiererhls- Apple HTTP Live Streaming-Paketierermss- Microsoft Smooth Streaming-Paketiererthumb- Thumbnail-Erfassungvolume_map- Audio-Lautstärkekarte
vod_mode
- syntax:
vod_mode mode - default:
local - context:
http,server,location
Setzt den Dateizugriffsmodus - lokal, remote oder gemappt (siehe den obigen Abschnitt zu den Funktionen für weitere Details)
vod_status
- syntax:
vod_status - default:
n/a - context:
location
Aktiviert die nginx-vod-Statusseite am umschließenden Standort.
Die folgenden Abfrageparameter werden unterstützt:
* ?reset=1 - setzt die Leistungszähler und Cache-Statistiken zurück.
* ?format=prom - gibt die Ausgabe im Format zurück, das mit Prometheus kompatibel ist (das Standardformat ist XML).
Konfigurationsdirektiven - Segmentierung
vod_segment_duration
- syntax:
vod_segment_duration duration - default:
10s - context:
http,server,location
Setzt die Segmentdauer in Millisekunden. Es wird dringend empfohlen, eine Segmentdauer zu verwenden, die ein Vielfaches der GOP-Dauer ist.
Wenn die Segmentdauer kein Vielfaches der GOP-Dauer ist und vod_align_segments_to_key_frames aktiviert ist, kann es erhebliche
Unterschiede zwischen der im Manifest gemeldeten Segmentdauer und der tatsächlichen Segmentdauer geben. Dies kann auch dazu führen, dass
leere Segmente innerhalb des Streams erscheinen.
vod_live_window_duration
- syntax:
vod_live_window_duration duration - default:
30000 - context:
http,server,location
Setzt die Gesamtdauer in Millisekunden der Segmente, die in einem Live-Manifest zurückgegeben werden sollen.
Wenn der Wert positiv ist, gibt nginx vod einen Bereich von maximal vod_live_window_duration Millisekunden zurück, der zur aktuellen Serverzeit endet.
Wenn der Wert negativ ist, gibt nginx vod einen Bereich von maximal -vod_live_window_duration Millisekunden vom Ende des Mapping-JSON zurück.
Wenn der Wert auf null gesetzt ist, enthält das Live-Manifest alle Segmente, die vollständig im Zeitrahmen des Mapping-JSON enthalten sind.
vod_force_playlist_type_vod
- syntax:
vod_force_playlist_type_vod on/off - default:
off - context:
http,server,location
Generiert einen VOD-Stream, selbst wenn das Medien-Set playlistType=live hat.
Das Aktivieren dieser Einstellung hat folgende Auswirkungen:
1. Die Zeitstempel der Frames sind kontinuierlich und beginnen bei null
2. Die Segmentindizes beginnen bei eins
3. Im Falle von HLS wird das zurückgegebene Manifest sowohl #EXT-X-PLAYLIST-TYPE:VOD als auch #EXT-X-ENDLIST enthalten
Dies kann nützlich sein, um VOD-Abschnitte aus einem Live-Stream herauszuschneiden.
vod_force_continuous_timestamps
- syntax:
vod_force_continuous_timestamps on/off - default:
off - context:
http,server,location
Generiert kontinuierliche Zeitstempel, selbst wenn das Medien-Set Lücken hat (Lücken können durch die Verwendung von clipTimes erstellt werden)
Wenn ID3-Zeitstempel aktiviert sind (vod_hls_mpegts_output_id3_timestamps), enthalten sie die ursprünglichen Zeitstempel, die in clipTimes festgelegt wurden.
vod_bootstrap_segment_durations
- syntax:
vod_bootstrap_segment_durations duration - default:
none - context:
http,server,location
Fügt eine Bootstrap-Segmentdauer in Millisekunden hinzu. Diese Einstellung kann verwendet werden, um die ersten Segmente kürzer als die Standardsegmentdauer zu machen, wodurch die adaptive Bitratenauswahl früher ohne die Überlastung kurzer Segmente während des gesamten Videos aktiviert wird.
vod_align_segments_to_key_frames
- syntax:
vod_align_segments_to_key_frames on/off - default:
off - context:
http,server,location
Wenn aktiviert, zwingt das Modul alle Segmente, mit einem Keyframe zu beginnen. Das Aktivieren dieser Einstellung kann zu Unterschieden
zwischen den tatsächlichen Segmentdauern und den im Manifest gemeldeten Dauern führen (es sei denn, vod_manifest_segment_durations_mode ist auf genau eingestellt).
vod_segment_count_policy
- syntax:
vod_segment_count_policy last_short/last_long/last_rounded - default:
last_short - context:
http,server,location
Konfiguriert die Richtlinie zur Berechnung der Segmentanzahl, für segment_duration = 10 Sekunden: * last_short - eine Datei von 33 Sekunden wird partitioniert als - 10, 10, 10, 3 * last_long - eine Datei von 33 Sekunden wird partitioniert als - 10, 10, 13 * last_rounded - eine Datei von 33 Sekunden wird partitioniert als - 10, 10, 13, eine Datei von 38 Sekunden wird partitioniert als 10, 10, 10, 8
vod_manifest_duration_policy
- syntax:
vod_manifest_duration_policy min/max - default:
max - context:
http,server,location
Konfiguriert die Richtlinie zur Berechnung der Dauer eines Manifests, das mehrere Streams enthält: * max - verwendet die maximale Stream-Dauer (Standard) * min - verwendet die minimale nicht-null Stream-Dauer
vod_manifest_segment_durations_mode
- syntax:
vod_manifest_segment_durations_mode estimate/accurate - default:
estimate - context:
http,server,location
Konfiguriert den Berechnungsmodus der Segmentdauern innerhalb von Manifestanfragen:
* estimate - berichtet die Dauer wie in nginx.conf konfiguriert, z.B. wenn vod_segment_duration den Wert 10000 hat,
enthält ein HLS-Manifest #EXTINF:10
* accurate - berichtet die genaue Dauer des Segments, wobei die Frame-Dauern berücksichtigt werden, z.B. für eine
Frame-Rate von 29.97 und 10-sekündigen Segmenten wird das erste Segment als 10.01 berichtet. Der genaue Modus berücksichtigt auch
die Keyframe-Ausrichtung, falls vod_align_segments_to_key_frames aktiviert ist.
vod_media_set_override_json
- syntax:
vod_media_set_override_json json - default:
{} - context:
http,server,location
Dieser Parameter bietet eine Möglichkeit, Teile des Medien-Set-JSON zu überschreiben (nur im gemappten Modus).
Zum Beispiel, vod_media_set_override_json '{"clipTo":20000}' schneidet das Medien-Set auf 20 Sekunden zu.
Der Parameterwert kann Variablen enthalten.
Konfigurationsdirektiven - Upstream
vod_upstream_location
- syntax:
vod_upstream_location location - default:
none - context:
http,server,location
Setzt einen nginx-Standort, der verwendet wird, um die MP4-Datei (Remote-Modus) zu lesen oder die Anfrage-URI (gemappter Modus) zu mappen.
vod_remote_upstream_location
- syntax:
vod_remote_upstream_location location - default:
none - context:
http,server,location
Setzt einen nginx-Standort, der verwendet wird, um die MP4-Datei im Remote- oder gemappten Modus zu lesen. Wenn diese Direktive im gemappten Modus gesetzt ist, liest das Modul die MP4-Dateien über HTTP und behandelt die Pfade im Mapping-JSON als URIs (das Standardverhalten besteht darin, von lokalen Dateien zu lesen)
vod_max_upstream_headers_size
- syntax:
vod_max_upstream_headers_size size - default:
4k - context:
http,server,location
Setzt die Größe, die für die Speicherung der Antwort-Header bei der Ausgabe von Upstream-Anfragen (an vod_xxx_upstream_location) zugewiesen wird.
vod_upstream_extra_args
- syntax:
vod_upstream_extra_args "arg1=value1&arg2=value2&..." - default:
empty - context:
http,server,location
Zusätzliche Abfragezeichenfolgenargumente, die der Upstream-Anfrage hinzugefügt werden sollen (nur Remote/gemappte Modi). Der Parameterwert kann Variablen enthalten.
vod_media_set_map_uri
- syntax:
vod_media_set_map_uri uri - default:
$vod_suburi - context:
http,server,location
Setzt die URI der Medien-Set-Mapping-Anfragen, der Parameterwert kann Variablen enthalten.
Im Falle von Multi-URL wird $vod_suburi die aktuelle Sub-URI sein (eine separate Anfrage wird pro Sub-URL ausgegeben)
vod_path_response_prefix
- syntax:
vod_path_response_prefix prefix - default:
{"sequences":[{"clips":[{"type":"source","path":" - context:
http,server,location
Setzt das Präfix, das in URI-Mapping-Antworten erwartet wird (nur im gemappten Modus).
vod_path_response_postfix
- syntax:
vod_path_response_postfix postfix - default:
"}]}]} - context:
http,server,location
Setzt das Postfix, das in URI-Mapping-Antworten erwartet wird (nur im gemappten Modus).
vod_max_mapping_response_size
- syntax:
vod_max_mapping_response_size length - default:
1K - context:
http,server,location
Setzt die maximale Länge eines Pfades, der von Upstream zurückgegeben wird (nur im gemappten Modus).
Konfigurationsdirektiven - Fallback
vod_fallback_upstream_location
- syntax:
vod_fallback_upstream_location location - default:
none - context:
http,server,location
Setzt einen nginx-Standort, an den die Anfrage weitergeleitet wird, nachdem ein Fehler "Datei nicht gefunden" aufgetreten ist (nur lokale/gemappte Modi).
vod_proxy_header_name
- syntax:
vod_proxy_header_name name - default:
X-Kaltura-Proxy - context:
http,server,location
Setzt den Namen eines HTTP-Headers, der verwendet wird, um Fallback-Proxy-Schleifen zu verhindern (nur lokale/gemappte Modi).
vod_proxy_header_value
- syntax:
vod_proxy_header_value name - default:
dumpApiRequest - context:
http,server,location
Setzt den Wert eines HTTP-Headers, der verwendet wird, um Fallback-Proxy-Schleifen zu verhindern (nur lokale/gemappte Modi).
Konfigurationsdirektiven - Leistung
vod_metadata_cache
- syntax:
vod_metadata_cache zone_name zone_size [expiration] - default:
off - context:
http,server,location
Konfiguriert die Größe und den Namen des gemeinsam genutzten Speicherobjekts des Video-Metadaten-Caches. Für MP4-Dateien hält dieser Cache das moov-Atom.
vod_mapping_cache
- syntax:
vod_mapping_cache zone_name zone_size [expiration] - default:
off - context:
http,server,location
Konfiguriert die Größe und den Namen des gemeinsam genutzten Speicherobjekts des Mapping-Caches für vod (nur im gemappten Modus).
vod_live_mapping_cache
- syntax:
vod_live_mapping_cache zone_name zone_size [expiration] - default:
off - context:
http,server,location
Konfiguriert die Größe und den Namen des gemeinsam genutzten Speicherobjekts des Mapping-Caches für Live (nur im gemappten Modus).
vod_response_cache
- syntax:
vod_response_cache zone_name zone_size [expiration] - default:
off - context:
http,server,location
Konfiguriert die Größe und den Namen des gemeinsam genutzten Speicherobjekts des Antwort-Caches. Der Antwort-Cache hält Manifeste und andere nicht-video Inhalte (wie DASH-Init-Segment, HLS-Verschlüsselungsschlüssel usw.). Video-Segmente werden nicht zwischengespeichert.
vod_live_response_cache
- syntax:
vod_live_response_cache zone_name zone_size [expiration] - default:
off - context:
http,server,location
Konfiguriert die Größe und den Namen des gemeinsam genutzten Speicherobjekts des Antwort-Caches für zeitveränderliche Live-Antworten. Dieser Cache hält die folgenden Arten von Antworten für Live: 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
Setzt die Größe der anfänglichen Leseoperation der MP4-Datei.
vod_max_metadata_size
- syntax:
vod_max_metadata_size size - default:
128MB - context:
http,server,location
Setzt die maximal unterstützte Größe der Video-Metadaten (für MP4 - Größe des moov-Atoms)
vod_max_frames_size
- syntax:
vod_max_frames_size size - default:
16MB - context:
http,server,location
Setzt die Grenze für die Gesamtgröße der Frames eines einzelnen Segments
vod_max_frame_count
- syntax:
vod_max_frame_count count - default:
1048576 - context:
http,server,location
Setzt die Grenze für die Gesamtanzahl der Frames, die gelesen werden, um eine Nicht-Segmentanfrage (z.B. Playlist) zu bedienen.
vod_segment_max_frame_count
- syntax:
vod_segment_max_frame_count count - default:
65536 - context:
http,server,location
Setzt die Grenze für die Gesamtanzahl der Frames, die gelesen werden, um eine Segmentanfrage zu bedienen.
vod_cache_buffer_size
- syntax:
vod_cache_buffer_size size - default:
256K - context:
http,server,location
Setzt die Größe der Cache-Puffer, die beim Lesen von MP4-Frames verwendet werden.
vod_open_file_thread_pool
- syntax:
vod_open_file_thread_pool pool_name - default:
off - context:
http,server,location
Aktiviert die Verwendung des asynchronen Dateiöffnens über einen Thread-Pool. Der Thread-Pool muss mit einer thread_pool-Direktive definiert werden, wenn kein Poolname angegeben ist, wird der Standardpool verwendet. Diese Direktive wird nur auf nginx 1.7.11 oder neuer unterstützt, wenn mit --add-threads kompiliert wird. Hinweis: Diese Direktive deaktiviert derzeit die Verwendung des open_file_cache von nginx durch das nginx-vod-module
vod_output_buffer_pool
- syntax:
vod_output_buffer_pool size count - default:
off - context:
http,server,location
Vorkonfiguriert Puffer für die Generierung von Antwortdaten, wodurch die Notwendigkeit entfällt, die Puffer bei jeder Anfrage zuzuweisen/freizugeben.
vod_performance_counters
- syntax:
vod_performance_counters zone_name - default:
off - context:
http,server,location
Konfiguriert den Namen des gemeinsam genutzten Speicherobjekts der Leistungszähler
Konfigurationsdirektiven - URL-Struktur
vod_base_url
- syntax:
vod_base_url url - default:
siehe unten - context:
http,server,location
Setzt die Basis-URL (Schema + Domain), die in Manifest-Antworten zurückgegeben werden soll.
Der Parameterwert kann Variablen enthalten, wenn der Parameter auf eine leere Zeichenfolge evaluiert, werden relative URLs verwendet.
Wenn der Parameter auf eine Zeichenfolge endet, die mit / endet, wird davon ausgegangen, dass es sich um eine vollständige URL handelt - das Modul hängt nur den
Dateinamen daran an, anstatt eine vollständige URI zu erstellen.
Wenn nicht gesetzt, wird die Basis-URL wie folgt bestimmt:
1. Wenn die Anfrage keinen Host-Header enthielt (HTTP/1.0), werden relative URLs zurückgegeben
2. Andernfalls wird die Basis-URL $scheme://$http_host sein
Die Einstellung betrifft derzeit nur HLS und DASH. In MSS und HDS werden immer relative URLs zurückgegeben.
vod_segments_base_url
- syntax:
vod_segments_base_url url - default:
siehe unten - context:
http,server,location
Setzt die Basis-URL (Schema + Domain), die für die Bereitstellung von Video-Segmenten verwendet werden soll. Der Parameterwert kann Variablen enthalten, wenn der Parameter auf eine leere Zeichenfolge evaluiert, werden relative URLs verwendet. Wenn nicht gesetzt, wird vod_base_url verwendet. Die Einstellung betrifft derzeit nur HLS.
vod_multi_uri_suffix
- syntax:
vod_multi_uri_suffix suffix - default:
.urlset - context:
http,server,location
Ein URL-Suffix, das verwendet wird, um Multi-URLs zu identifizieren. Eine Multi-URL ist eine Möglichkeit, mehrere verschiedene URLs zu kodieren, die zusammen als ein adaptives Streaming-Set unter einer einzigen URL abgespielt werden sollen. Wenn das Standard-Suffix verwendet wird, kann eine HLS-Set-URL wie folgt aussehen: 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
Der Name des Parameters für die Clip-Anfrage.
vod_clip_from_param_name
- syntax:
vod_clip_from_param_name name - default:
clipFrom - context:
http,server,location
Der Name des Parameters für die Clip-von-Anfrage.
vod_tracks_param_name
- syntax:
vod_tracks_param_name name - default:
tracks - context:
http,server,location
Der Name des Parameters für die Tracks-Anfrage.
vod_time_shift_param_name
- syntax:
vod_time_shift_param_name name - default:
shift - context:
http,server,location
Der Name des Parameters für die Verschiebungsanfrage.
vod_speed_param_name
- syntax:
vod_speed_param_name name - default:
speed - context:
http,server,location
Der Name des Parameters für die Geschwindigkeitsanfrage.
vod_lang_param_name
- syntax:
vod_lang_param_name name - default:
lang - context:
http,server,location
Der Name des Parameters für die Sprachabfrage.
vod_force_sequence_index
- syntax:
vod_force_sequence_index on/off - default:
off - context:
http,server,location
Verwenden Sie den Sequenzindex in Segment-URIs, auch wenn nur eine Sequenz vorhanden ist.
Konfigurationsdirektiven - Antwort-Header
vod_expires
- syntax:
vod_expires time - default:
none - context:
http,server,location
Setzt den Wert der "Expires"- und "Cache-Control"-Antwort-Header für erfolgreiche Anfragen.
Diese Direktive ähnelt der integrierten expires-Direktive von nginx, außer dass sie nur das Szenario des Ablaufintervalls unterstützt
(Epoche, max, aus, Tageszeit werden nicht unterstützt)
Die Hauptmotivation für die Verwendung dieser Direktive anstelle der integrierten expires besteht darin, unterschiedliche Ablauffristen für VOD- und dynamische Live-Inhalte zu haben.
Wenn diese Direktive nicht angegeben ist, setzt nginx-vod-module die "Expires"- / "Cache-Control"-Header nicht.
Diese Einstellung betrifft alle Arten von Anfragen in VOD-Playlists und Segmentanfragen in Live-Playlists.
vod_expires_live
- syntax:
vod_expires_live time - default:
none - context:
http,server,location
Gleich wie vod_expires (oben) für Live-Anfragen, die nicht zeitabhängig sind und keine Segmente sind (z.B. HLS - master.m3u8, HDS - manifest.f4m).
vod_expires_live_time_dependent
- syntax:
vod_expires_live_time_dependent time - default:
none - context:
http,server,location
Gleich wie vod_expires (oben) für Live-Anfragen, die zeitabhängig sind (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
Setzt den Wert des Last-Modified-Headers, der in der Antwort zurückgegeben wird, standardmäßig gibt das Modul keinen Last-Modified-Header zurück. Der Grund für das Vorhandensein dieses Parameters hier ist, um If-Modified-Since / If-Unmodified-Since zu unterstützen. Da das integrierte ngx_http_not_modified_filter_module von nginx vor jedem anderen Header-Filter-Modul ausgeführt wird, sieht es keine von add_headers / more_set_headers gesetzten Header. Dies führt dazu, dass nginx immer antwortet, als ob sich der Inhalt geändert hätte (412 für If-Unmodified-Since / 200 für If-Modified-Since) Für Live-Anfragen, die keine Segmente sind (z.B. Live DASH MPD), wird Last-Modified auf die aktuelle Serverzeit gesetzt.
vod_last_modified_types
- syntax:
vod_last_modified_types mime-type1 mime-type2 ... - default:
none - context:
http,server,location
Setzt die MIME-Typen, für die der Last-Modified-Header gesetzt werden soll. Der spezielle Wert "*" entspricht jedem MIME-Typ.
Konfigurationsdirektiven - Ad-Stitching (nur im gemappten Modus)
vod_dynamic_mapping_cache
- syntax:
vod_dynamic_mapping_cache zone_name zone_size [expiration] - default:
off - context:
http,server,location
Konfiguriert die Größe und den Namen des gemeinsam genutzten Speicherobjekts des Caches, der die Zuordnung dynamischer Clips speichert.
vod_dynamic_clip_map_uri
- syntax: `vod_dynamic_clip_map