HLS 串流與播放清單

HTTP 即時串流可讓您根據使用者的可用頻寬,輕鬆地將視訊或音訊串流調整至使用者,並隨著傳輸速度的變更而在播放中間切換串流。拉出所有部分可能會令人困惑,所以我們將告訴你如何為不同頻寬建立幾個簡單的分段檔案,並提供播放清單給 iOS 裝置上的使用者,讓他們可以播放。

分段文件

我們將從製作幾個分段文件開始,每個分段文件都針對給定的帶寬。Zencoder使用這些輸出創建清單文件和分段的視頻文件,這允許播放器在播放視頻時分別下載每個文件。

{
    "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"
}

m3u8以上輸出創建的文件是分段文件。請求此輸出以及下面描述的其他輸出,將創建針對不同帶寬的多個分段文件。

此輸出的類型為“分段”,格式為“ ts”,默認為視頻編解碼器“ h264”。每個分段的輸出將創建一個M3U8格式的清單文件作為其主要輸出,這些分段的名稱將類似於輸出的文件名。分割的文件將與清單一起上傳,並在擴展名之前以“ -00001”後綴命名。這些輸出可直接用於標準流,只需從客戶端引用.m3u8文件,並確保可以從清單清單的相同位置訪問段文件。播放列表也可以引用多個.m3u8文件,以支持自適應流。

播放清單

您可以自己創建自適應比特率播放列表,也可以讓Zencoder將其作為工作的一部分。要讓我們創建播放列表,只需將另一種輸出類型為“播放列表”的作業添加到您的工作中,並指定一個或多個帶有路徑(相對於播放列表文件的位置)和流源的流。相應輸出的標籤。也可以指定帶寬,分辨率和編解碼器,但默認情況下是從源推斷出的。流信息將被格式化為播放列表,並像其他任何輸出一樣上傳。

該播放列表文件引用了上面創建的分段輸出,指定了應播放每個輸出的帶寬。使用支持HLS的設備加載此文件將允許在可用帶寬變化時調整流。

用戶打開文件時將使用流中的第一個條目,並將其用作測試以確定哪個流最合適的一部分。其他條目的順序無關緊要。

HLS輸出(帶有視頻)具有max_hls_protocol_version現在,如果大於等於4,則將生成I幀播放列表,也稱為“關鍵幀清單”。默認情況下,文件名與主清單文件相同,但附加“ -iframe-index”。例如,對於文件名為“ master.m3u8”的清單,關鍵幀清單將被命名為“ master-iframe-index.m3u8”。可以使用以下方法覆蓋keyframe_manifest_filename。如果HLS播放列表輸出指定了具有關鍵幀清單的“源”流,則該關鍵幀清單將作為EXT-XI-FRAMES-ONLY流自動包含在播放列表中。

{
    "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"
}

整個圖片

播放清單可指定並參照不同位元率的多個輸出。這些設定符合我們 iOS 編碼指南中提供的準則。

{
    "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"
    }
    ]
}

注意事項

  • 播放清單產生目前不會使用來自作業中其他輸出的資訊,但只是一種輕鬆產生格式正確的適應位元速率播放清單,並將其與其他檔案一起上傳。
  • 雖然 iOS 設備將播放創建的自適應位元速率播放列表,但由於處理相對 URL 時發生錯誤,VLC 將不會。它將查找與播放列表文件相同的目錄中的段文件,而不是清單文件的目錄。
  • 解碼器 _bitrate_cap 設定為檔案的目標位元速率的 1.5 倍。解碼器 _buffer_size 設定為檔案的目標位元速率的 3.5 倍至 5 倍。這些設定有助於在整個檔案中保持一致的位元速率,因此分段區段的大小和位元速率不會太大變化。
  • 如果分段輸出被上傳到臨時存儲,它將被上傳為 ZIP 歸檔