翻譯指南

本主題說明轉碼,此過程使您可以將視頻編碼為MP4,然後將其重新打包為HLS輸出。

概覽

使用Zencoder,您可以將視頻編碼為MP4,然後通過我們稱為“轉碼”(而非轉碼)的過程將其重新打包為HLS輸出。Transmuxing會將現有的MP4視頻重新打包為HTTP實時流(HLS)所必需的MPEG TS段,而無需重新編碼視頻文件。使用相關輸出,您可以在單個作業中創建H.264文件以及分段文件,從而以更低的成本產生更快的周轉時間。多路復用輸出的費用為編碼成本的1/4。生成的作業將創建6個輸出-2個以您帳戶的常規費率收費,3個以編碼成本的1/4傳輸的多路復用文件和1個免費播放列表。

為此,您將創建具有兩個主要輸出集(以及播放列表)的單個作業。第一組輸出將是具有一些特殊設置的常規H.264 / AAC MP4文件,以使它們可以用作HLS輸出的源文件。第二組輸出將使用那些MP4文件作為“源”輸入,將其內容轉換為HLS輸出。由於這些是從屬輸出,因此它們將等到其相應的源完成後再安排處理。

該過程的關鍵部分是使用source,是Zencoder API第2版中的新選項。Source告訴輸出使用作業上另一個輸出創建的文件代替輸入文件來進行處理。在這種情況下,Zencoder將根據輸入文件以請求的比特率創建H.264文件。這些輸出中的每一個完成時,然後將從輸出中創建分段版本。

視頻分辨率

下表顯示了一些常見的視頻分辨率。

分辨率類型 通用名稱 長寬比 像素大小
SD(標清) 480p 4:3 640 x 480
HD(高清晰度) 720p 16:9 1280
全高清 (FHD) 1080p 16:9 1920 x 1080
QHD(四倍高清) 1440p 16:9 2560 x 1440
2K視頻 1080p 1:1.77 2048 x 1080
4K 視頻或超高清 (UHD) 4K 或 2160p 1:1.9 3840 x 2160
8K 視頻或全超高清 8K 或 4320p 16∶9 7680 x 4320

在考慮輸出的視頻分辨率時,您應該考慮觀眾最有可能使用的設備。(如果你有某種分析,那將有助於確定這一點。)如果移動設備是目標,您可能需要考慮“垂直”視頻越來越受歡迎。要製作垂直視頻,您通常會交換寬度和高度值。

H.264輸出

我們將從創建2個H.264文件開始,分別針對高和低比特率。

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

這些輸出產生的文件可以在各種設備上播放。每個目標都有不同的比特率和分辨率,因此可以向用戶發送適當的文件。每個都還適合分段以進行HTTP實時流傳輸並用作自適應比特率流。

上面的請求中有幾個選項要注意:

  • forced_keyframe_rate到0.1。這將強制視頻每10秒具有一個關鍵幀。分段文件的長度為10秒,因此可以確保每個分段均以關鍵幀開頭。
  • decoder_bitrate_cap設置為文件目標比特率的1.5倍。decoder_buffer_size設置為文件目標比特率的3.5x到5x。這些設定有助於在整個檔案中保持一致的位元速率,因此分段區段的大小和位元速率不會太大變化。

現在已經創建了H.264文件,可以將其他輸出添加到請求中,以從源創建HTTP Live Streaming分段文件,而無需執行其他編碼。

分段輸出

上面的每個H.264視頻和音頻輸出都有labels在其API選項中。這些標籤可以與source選項,告訴Zencoder使用帶有給定標籤的輸出而不是輸入文件使用由輸出創建的視頻。由於H.264文件已經對HLS進行了良好的設置,因此不需要其他編碼。

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

這些輸出生成的文件是分段輸出,針對不同的帶寬,再加上一個播放列表文件,供播放設備了解可用的流。

每個分段的輸出包括source,並指定前面列出的輸出之一。它們還包括copy_audiocopy_video選項,告訴Zencoder使用源文件中的音頻和視頻流並將它們重新打包到新容器中,而不是對其進行轉碼。最後,輸出還指定了一個type分段和format ts,再加上url擴展名為.m3u8,以便Zencoder知道創建分段的HLS文件。

最後,還會生成一個引用每個分段輸出的播放列表。請注意,播放列表中引用的第一個文件是低比特率視頻;播放視頻的設備通常會首先加載播放列表中列出的第一個流,然後根據需要切換到其他流。這意味著播放的前10秒將使用此流,在此之後,設備將具有足夠的信息來選擇要播放的適當的流。

注意事項

  • HLS播放列表的生成當前不使用作業中其他輸出的信息,而只是一種輕鬆生成正確格式的自適應比特率播放列表並將其與其他文件一起上傳的方式。
  • 雖然 iOS 設備將播放創建的自適應位元速率播放列表,但由於處理相對 URL 時發生錯誤,VLC 將不會。它將查找與播放列表文件相同的目錄中的段文件,而不是清單文件的目錄。

完整要求

現在,我們已經遍歷了每個主要的輸出部分,讓我們將其組合到單個API請求中。

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