HLS-Streaming und Playlists

Mit HTTP Live Streaming können Sie Ihren Video- oder Audio-Stream basierend auf der verfügbaren Bandbreite einfach an einen Benutzer anpassen und während der Wiedergabe zwischen Streams wechseln, wenn sich die Übertragungsgeschwindigkeit ändert. Deshalb zeigen wir Ihnen, wie Sie ein paar einfache segmentierte Dateien für verschiedene Bandbreiten und eine Wiedergabeliste erstellen, die Sie den Nutzern auf iOS-Geräten zur Verfügung stellen, damit sie sie abspielen können.

Segmentierte Dateien

Zunächst erstellen wir mehrere segmentierte Dateien, die jeweils auf eine bestimmte Bandbreite ausgerichtet sind. Mit diesen Ausgaben erstellt Zencoder eine Manifestdatei und segmentierte Videodateien, mit denen der Player jede Datei während der Wiedergabe des Videos einzeln herunterladen kann.

{
    "audio_bitrate": 56,
    "audio_sample_rate": 22050,
    "base_url": "s3://my-bucket/",
    "decoder_bitrate_cap": 900,
    "decoder_buffer_size": 2400,
    "filename": "file-640k.m3u8",
    "max_frame_rate": 30,
    "public": 1,
    "type": "segmented",
    "video_bitrate": 600,
    "width": 400,
    "format": "ts"
}

Das m3u8 Die durch die obige Ausgabe erstellte Datei ist eine segmentierte Datei. Wenn Sie diese Ausgabe sowie die anderen unten beschriebenen anfordern, werden mehrere segmentierte Dateien erstellt, die auf unterschiedliche Bandbreiten ausgerichtet sind.

Diese Ausgabe hat den Typ "segmentiert", das Format "ts" und standardmäßig den Videocodec "h264". Für jede segmentierte Ausgabe wird eine Manifestdatei im M3U8-Format als Hauptausgabe erstellt, und die Segmente werden wie der Dateiname der Ausgabe benannt. Die segmentierten Dateien werden neben dem Manifest hochgeladen und vor der Erweiterung mit den Suffixen "-00001" benannt. Diese Ausgaben können unverändert für Standard-Streaming verwendet werden, indem einfach auf die .m3u8-Datei vom Client verwiesen wird und sichergestellt wird, dass die Segmentdateien am selben Speicherort wie das Manifest verfügbar sind. Mehrere .m3u8-Dateien können auch von einer Wiedergabeliste referenziert werden, um adaptives Streaming zu unterstützen.

Die Wiedergabeliste

Sie können selbst Wiedergabelisten mit adaptiver Bitrate erstellen oder Zencoder dies als Teil eines Jobs ausführen lassen. Damit wir die Wiedergabeliste erstellen, fügen Sie Ihrem Job einfach eine weitere Ausgabe mit einer Art "Wiedergabeliste" hinzu und geben Sie einen oder mehrere Streams mit einem Pfad (der relativ zum Speicherort der Wiedergabelistendatei ist) und der Quelle des Streams an Beschriftung der entsprechenden Ausgabe. Bandbreite, Auflösung und Codec können ebenfalls angegeben werden, diese werden jedoch standardmäßig aus der Quelle abgeleitet. Die Stream-Informationen werden in eine Wiedergabeliste formatiert und wie jede andere Ausgabe hochgeladen.

Diese Wiedergabelistendatei verweist auf die oben erstellten segmentierten Ausgaben und gibt die Bandbreite an, mit der die einzelnen Wiedergaben abgespielt werden sollen. Durch Laden dieser Datei mit einem Gerät, das HLS unterstützt, kann der Stream angepasst werden, wenn sich die verfügbare Bandbreite ändert.

Der erste Eintrag in den Streams wird verwendet, wenn ein Benutzer die Datei öffnet, und wird als Teil eines Tests verwendet, um festzustellen, welcher Stream am besten geeignet ist. Die Reihenfolge der anderen Einträge ist irrelevant.

HLS-Ausgänge (mit Video), die haben max_hls_protocol_version ab 4 wird nun eine I-Frame-Wiedergabeliste generiert, die auch als "Keyframe-Manifest" bezeichnet wird. Standardmäßig ist der Dateiname derselbe wie die Hauptmanifestdatei, jedoch mit angehängtem "-iframe-index". Für ein Manifest mit dem Dateinamen "master.m3u8" würde das Keyframe-Manifest beispielsweise "master-iframe-index.m3u8" heißen. Dies kann mit überschrieben werden keyframe_manifest_filename. Wenn eine HLS-Wiedergabelistenausgabe einen "Quell" -Stream mit einem Keyframe-Manifest angibt, wird dieses Keyframe-Manifest automatisch als EXT-XI-FRAMES-ONLY-Stream in die Wiedergabeliste aufgenommen.

{
    "base_url": "s3://my-bucket/",
    "filename": "playlist.m3u8",
    "public": 1,
    "streams": [
    {
        "bandwidth": 440,
        "path": "file-440k.m3u8"
    },
    {
        "bandwidth": 640,
        "path": "file-640k.m3u8"
    },
    {
        "bandwidth": 240,
        "path": "file-240k.m3u8"
    },
    {
        "bandwidth": 150,
        "path": "file-150k.m3u8"
    },
    {
        "bandwidth": 64,
        "path": "file-64k.m3u8"
    }
    ],
    "type": "playlist"
}

Das ganze Bild

In der Wiedergabeliste können mehrere Ausgänge mit unterschiedlichen Bitraten angegeben und referenziert werden. Diese Einstellungen entsprechen den Richtlinien in unserem iOS-Codierungsanleitung.

{
    "input": "s3://zencodertesting/test.mov",
    "output": [
    {
        "label": "hls-64",
        "audio_bitrate": 56,
        "audio_sample_rate": 22050,
        "base_url": "s3://my-bucket/",
        "filename": "file-64k.m3u8",
        "format": "aac",
        "public": 1,
        "type": "segmented"
    },
    {
        "label": "hls-240",
        "audio_bitrate": 56,
        "audio_sample_rate": 22050,
        "base_url": "s3://my-bucket/",
        "decoder_bitrate_cap": 300,
        "decoder_buffer_size": 800,
        "filename": "file-240k.m3u8",
        "max_frame_rate": 15,
        "public": 1,
        "type": "segmented",
        "video_bitrate": 200,
        "width": 400,
        "format": "ts"
    },
    {
        "label": "hls-440",
        "audio_bitrate": 56,
        "audio_sample_rate": 22050,
        "base_url": "s3://my-bucket/",
        "decoder_bitrate_cap": 600,
        "decoder_buffer_size": 1600,
        "filename": "file-440k.m3u8",
        "public": 1,
        "type": "segmented",
        "video_bitrate": 400,
        "width": 400,
        "format": "ts"
    },
    {
        "label": "hls-640",
        "audio_bitrate": 56,
        "audio_sample_rate": 22050,
        "base_url": "s3://my-bucket/",
        "decoder_bitrate_cap": 900,
        "decoder_buffer_size": 2400,
        "filename": "file-640k.m3u8",
        "public": 1,
        "type": "segmented",
        "video_bitrate": 600,
        "width": 480,
        "format": "ts"
    },
    {
        "label": "hls-1040",
        "audio_bitrate": 56,
        "audio_sample_rate": 22050,
        "base_url": "s3://my-bucket/",
        "decoder_bitrate_cap": 1500,
        "decoder_buffer_size": 4000,
        "filename": "file-1040k.m3u8",
        "public": 1,
        "type": "segmented",
        "video_bitrate": 1000,
        "width": 640,
        "format": "ts"
    },
    {
        "label": "hls-1540",
        "audio_bitrate": 56,
        "audio_sample_rate": 22050,
        "base_url": "s3://my-bucket/",
        "decoder_bitrate_cap": 2250,
        "decoder_buffer_size": 6000,
        "filename": "file-1540k.m3u8",
        "public": 1,
        "type": "segmented",
        "video_bitrate": 1500,
        "width": 960,
        "format": "ts"
    },
    {
        "label": "hls-2040",
        "audio_bitrate": 56,
        "audio_sample_rate": 22050,
        "base_url": "s3://my-bucket/",
        "decoder_bitrate_cap": 3000,
        "decoder_buffer_size": 8000,
        "filename": "file-2040k.m3u8",
        "public": 1,
        "type": "segmented",
        "video_bitrate": 2000,
        "width": 1024,
        "format": "ts"
    },
    {
        "base_url": "s3://my-bucket/",
        "filename": "playlist.m3u8",
        "public": 1,
        "streams": [
        {
            "source": "hls-2040",
            "path": "file-2040k.m3u8"
        },
        {
            "source": "hls-1540",
            "path": "file-1540k.m3u8"
        },
        {
            "source": "hls-1040",
            "path": "file-1040k.m3u8"
        },
        {
            "source": "hls-640",
            "path": "file-640k.m3u8"
        },
        {
            "source": "hls-440",
            "path": "file-440k.m3u8"
        },
        {
            "source": "hls-240",
            "path": "file-240k.m3u8"
        },
        {
            "source": "hls-64",
            "path": "file-64k.m3u8"
        }
        ],
        "type": "playlist"
    }
    ]
}

ANMERKUNGEN

  • Die 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.
  • 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.
  • Wenn eine segmentierte Ausgabe in einen temporären Speicher hochgeladen wird, wird sie als hochgeladen ZIP-Archiv.