Transmuxing-Anleitung

In diesem Thema wird Transmuxing erklärt, ein Verfahren, mit dem Sie Ihre Videos in MP4 kodieren und dann als HLS-Ausgabe neu verpacken können.

Überblick

Mit Zencoder können Sie Ihre Videos in MP4 codieren und diese dann auch als HLS-Ausgänge neu verpacken. Dies wird als "Transmuxing" (anstatt Transcodieren) bezeichnet. Durch Transmuxing werden vorhandene MP4-Videos in die für HTTP Live Streaming (HLS) erforderlichen MPEG TS-Segmente neu gepackt, ohne dass die Videodateien neu codiert werden müssen. Mithilfe abhängiger Ausgaben können Sie Ihre H.264-Dateien sowie die segmentierten Dateien in einem einzigen Job erstellen und so eine schnellere Abwicklung zu geringeren Kosten erzielen. Transmux-Ausgänge werden mit 1/4 der Codierungskosten berechnet. Der resultierende Job erstellt 6 Ausgaben - 2 werden zum regulären Tarif Ihres Kontos berechnet, 3 transmuxierte Dateien zu 1/4 der Codierungskosten und 1 kostenlose Wiedergabeliste.

Dazu erstellen Sie einen einzelnen Job mit zwei Hauptausgabesätzen (plus den Wiedergabelisten). Der erste Satz von Ausgängen sind normale H.264/AAC-MP4-Dateien mit einigen speziellen Einstellungen, damit sie als Quelldateien für HLS-Ausgaben arbeiten können. Der zweite Satz von Ausgängen verwendet diese MP4-Dateien als "Quell" -Eingänge und überträgt ihren Inhalt auf HLS-Ausgänge. Da es sich um abhängige Ausgaben handelt, warten sie, bis die entsprechende Quelle fertig ist, bevor sie für die Verarbeitung geplant werden.

Der Hauptteil des Prozesses ist die Verwendung source einer neuen Option in V2 der Zencoder-API. Die Quelle weist eine Ausgabe an, anstelle der Eingabedatei die Datei zu verwenden, die von einer anderen Ausgabe im Job für die Verarbeitung erstellt wurde. In dieser Situation erstellt Zencoder H.264-Dateien basierend auf der Eingabedatei mit den angeforderten Bitraten. Wenn jede dieser Ausgaben beendet ist, wird aus der Ausgabe eine segmentierte Version erstellt.

Video-Auflösungen

Die folgende Tabelle zeigt einige gängige Videoauflösungen.

Auflösung Typ Allgemeiner Name Seitenverhältnis Pixel Größe
SD (Standardauflösung) 480p 4:3 640 x 480
HD (High Definition) 720p 16:9 1280 x 720
Full HD (FHD) 1080p 16:9 1920 x 1080
QHD (Quad HD) 1440p 16:9 2560 x 1440
2K-Video 1080p 1:1.77 2048 x 1080
4K-Video oder Ultra HD (UHD) 4K oder 2160p 1:1.9 3840 x 2160
8K-Video oder Full Ultra HD 8K oder 4320p 16∶9 7680 x 4320

Bei der Auswahl der Videoauflösungen für Ihre Ausgaben sollten Sie berücksichtigen, welche Geräte Ihre Zuschauer höchstwahrscheinlich verwenden werden. (Wenn Sie über eine Art von Analysesystem verfügen, ist dies bei der Ermittlung hilfreich) Wenn mobile Geräte das Ziel sind, sollten Sie bedenken, dass "vertikale" Videos immer beliebter werden. Um ein vertikales Video zu erzeugen, müssen Sie normalerweise die Werte für Breite und Höhe vertauschen.

Die H.264-Ausgänge

Wir beginnen mit der Erstellung von 2 H.264-Dateien, die auf hohe und niedrige Bitraten abzielen.

{
    "label": "low",
    "format": "mp4",
    "video_bitrate": 200,
    "decoder_bitrate_cap": 300,
    "decoder_buffer_size": 1200,
    "audio_sample_rate": 44100,
    "height": "288",
    "url": "s3://example-bucket/low.mp4",
    "h264_reference_frames": 1,
    "forced_keyframe_rate": "0.1",
    "audio_bitrate": 56,
    "decimate": 2
},
{
    "label": "high",
    "format": "mp4",
    "video_bitrate": 1000,
    "decoder_bitrate_cap": 1500,
    "decoder_buffer_size": 6000,
    "audio_sample_rate": 44100,
    "height": "432",
    "url": "s3://example-bucket/high.mp4",
    "h264_reference_frames": "auto",
    "h264_profile": "main",
    "forced_keyframe_rate": "0.1",
    "audio_bitrate": 56
}

Die aus diesen Ausgaben resultierenden Dateien können auf einer Vielzahl von Geräten abgespielt werden. Jedes zielt auf eine andere Bitrate und Auflösung ab, sodass Benutzern die entsprechende Datei gesendet werden kann. Jedes eignet sich auch zur Segmentierung für HTTP Live Streaming und als adaptiver Bitraten-Stream.

Einige Optionen in der obigen Anfrage zu beachten:

  • forced_keyframe_rate auf 0,1. Dadurch wird das Video alle 10 Sekunden mit einem Keyframe versehen. Die segmentierten Dateien sind 10 Sekunden lang, wodurch sichergestellt wird, dass dort jedes Segment mit einem Keyframe beginnt.
  • decoder_bitrate_cap ist auf das 1,5-fache der Zielbitrate der Datei eingestellt. decoder_buffer_size ist auf das 3,5-fache bis 5-fache der Zielbitrate der Datei eingestellt. Diese Einstellungen tragen dazu bei, eine konsistente Bitrate in der gesamten Datei beizubehalten, sodass die segmentierten Segmente in Größe und Bitrate nicht zu stark variieren.

Nachdem die H.264-Dateien erstellt wurden, können der Anforderung zum Erstellen segmentierter HTTP Live Streaming-Dateien aus der Quelle zusätzliche Ausgaben hinzugefügt werden, ohne dass eine zusätzliche Codierung erforderlich ist.

Segmentierte Ausgaben

Jedes der oben genannten H.264-Video- und Audioausgänge verfügt über labels in ihren API-Optionen. Diese Etiketten können in Verbindung mit dem verwendet werden source Option, um Zencoder anzuweisen, das von der Ausgabe erstellte Video mit der angegebenen Bezeichnung anstelle der Eingabedatei zu verwenden. Da die H.264-Dateien bereits gute Einstellungen für HLS haben, ist keine zusätzliche Codierung erforderlich.

{
    "source": "low",
    "format": "ts",
    "copy_audio": "true",
    "copy_video": "true",
    "url": "s3://example-bucket/hls-low/hls-low.m3u8",
    "label": "hls-low",
    "type": "segmented"
}
{
    "source": "high",
    "format": "ts",
    "copy_audio": "true",
    "copy_video": "true",
    "url": "s3://example-bucket/hls-high/hls-high.m3u8",
    "label": "hls-high",
    "type": "segmented"
}
{
    "streams": [
    {
        "path": "hls-low/hls-low.m3u8",
        "bandwidth": 256
    },
    {
        "path": "hls-high/hls-high.m3u8",
        "bandwidth": 1056
    }
    ],
    "type": "playlist",
    "url": "s3://example-bucket/playlist.m3u8"
}

Die aus diesen Ausgaben resultierenden Dateien sind segmentierte Ausgaben, die auf unterschiedliche Bandbreiten abzielen, sowie eine Wiedergabelistendatei, damit das Wiedergabegerät die verfügbaren Streams kennt.

Jede segmentierte Ausgabe enthält die source und gibt einen der zuvor aufgeführten Ausgänge an. Dazu gehört auch die copy_audio und copy_video Optionen, die Zencoder anweisen, die Audio- und Videostreams aus der Quelldatei zu verwenden und sie in den neuen Container neu zu packen, anstatt sie zu transkodieren. Schließlich geben die Ausgänge auch ein type segmentiertes und ein format von ts, plus a url mit einer Erweiterung von .m3u8, damit Zencoder weiß, segmentierte HLS-Dateien zu erstellen.

Schließlich wird auch eine Wiedergabeliste generiert, die auf jede der segmentierten Ausgaben verweist. Beachten Sie, dass die erste Datei, auf die in der Wiedergabeliste verwiesen wird, das Video mit niedriger Bitrate ist. Das Gerät, das das Video abspielt, lädt im Allgemeinen den ersten in der Wiedergabeliste aufgelisteten Stream und wechselt bei Bedarf zu anderen Streams. Dies bedeutet, dass in den ersten 10 Sekunden der Wiedergabe dieser Stream verwendet wird. Danach verfügt das Gerät über genügend Informationen, um den geeigneten Stream für die Wiedergabe auszuwählen.

ANMERKUNGEN

  • Die HLS-Wiedergabelistengenerierung verwendet derzeit keine Informationen aus den anderen Ausgaben im Job, sondern ist lediglich eine Möglichkeit, auf einfache Weise eine korrekt formatierte Wiedergabeliste mit adaptiver Bitrate zu erstellen und zusammen mit den anderen Dateien hochladen zu lassen.
  • Während iOS-Geräte die erstellte adaptive Bitraten-Wiedergabeliste wiedergeben, wird VLC dies aufgrund von Fehlern bei der Verarbeitung relativer URLs nicht tun. Es wird nach den Segmentdateien im selben Verzeichnis wie die Wiedergabelistendatei und nicht im Verzeichnis der Manifestdatei gesucht.

Vollständige Anfrage

Nachdem wir alle wichtigen Ausgabeabschnitte durchgesehen haben, lassen Sie uns sie zu einer einzigen API-Anforderung zusammenfassen.

{
    "input": "s3://zencodertesting/test.mov",
    "outputs": [
    {
        "label": "low",
        "format": "mp4",
        "video_bitrate": 200,
        "decoder_bitrate_cap": 300,
        "decoder_buffer_size": 1200,
        "audio_sample_rate": 44100,
        "height": "288",
        "url": "s3://example-bucket/low.mp4",
        "h264_reference_frames": 1,
        "forced_keyframe_rate": "0.1",
        "audio_bitrate": 56,
        "decimate": 2
    },
    {
        "label": "high",
        "format": "mp4",
        "video_bitrate": 1000,
        "decoder_bitrate_cap": 1500,
        "decoder_buffer_size": 6000,
        "audio_sample_rate": 44100,
        "height": "432",
        "url": "s3://example-bucket/high.mp4",
        "h264_reference_frames": "auto",
        "h264_profile": "main",
        "forced_keyframe_rate": "0.1",
        "audio_bitrate": 56
    },
    {
        "source": "low",
        "format": "ts",
        "copy_audio": "true",
        "copy_video": "true",
        "url": "s3://example-bucket/hls-low/hls-low.m3u8",
        "label": "hls-low",
        "type": "segmented"
    }
    {
        "source": "high",
        "format": "ts",
        "copy_audio": "true",
        "copy_video": "true",
        "url": "s3://example-bucket/hls-high/hls-high.m3u8",
        "label": "hls-high",
        "type": "segmented"
    }
    {
        "streams": [
        {
            "path": "hls-low/hls-low.m3u8",
            "bandwidth": 256
        },
        {
            "path": "hls-high/hls-high.m3u8",
            "bandwidth": 1056
        }
        ],
        "type": "playlist",
        "url": "s3://example-bucket/playlist.m3u8"
    }
    ]
}