概要
Zencoder を使用すると、動画を MP4 にエンコードし、HLS 出力として再パッケージすることもできます。このプロセスでは、トランスコーディングではなく「トランスマルチング」と呼びます。Transmuxing では、HTTP ライブストリーミング (HLS) に必要な MPEG TS セグメントに、既存の MP4 動画を再パッケージします。ビデオファイルを再エンコードする必要はありません。依存出力を使用すると、H.264 ファイルとセグメント化されたファイルすべてを単一のジョブで作成でき、低コストで迅速なターンアラウンドを実現します。変換された出力は、エンコードコストの 1/4 で課金されます。結果として得られるジョブは、アカウントの通常のレートで2個、エンコーディングコストの1/4でトランスマクスされたファイルを3つ、無料のプレイリストという6つの出力を作成します。
このためには、2 つの主要な出力セット (およびプレイリスト) を持つ 1 つのジョブを作成します。最初の出力セットは通常のH.264/AAC MP4ファイルで、HLS出力のソースファイルとして動作できるようにするための特別な設定がいくつかあります。2 番目の出力セットでは、これらの MP4 ファイルを「ソース」入力として使用し、コンテンツを HLS 出力に変換します。これらは依存出力であるため、対応するソースが終了するまで待機してから処理するようにスケジュールされます。
このプロセスの重要な部分はsource
、Zencoder API の V2 の新しいオプションを使用することです。Source は、ジョブ上の別の出力によって作成されたファイルを、入力ファイルではなく、処理のために使用するように出力に指示します。この場合、Zencoder は、要求されたビットレートで入力ファイルに基づいて H.264 ファイルを作成します。これらの出力が終了すると、セグメント化されたバージョンが出力から作成されます。
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 から 5 倍に設定されます。これらの設定は、ファイル全体で一貫したビットレートを維持し、セグメントセグメントのサイズとビットレートがあまり変化しないようにします。
H.264 ファイルが作成されたので、追加のエンコーディングを行う必要なく、ソースから HTTP ライブストリーミングセグメントファイルを作成するための追加の出力をリクエストに追加できます。
セグメント化された出力
上記の H.264 ビデオとオーディオ出力には、labels
それぞれの API オプションがあります。これらのラベルは、入力ファイルではなく、指定されたラベルで出力によって作成されたビデオを使用するようにZencoder source
に指示するオプションと組み合わせて使用できます。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
、が含まれており、前述の出力の 1 つを指定します。また、copy_audio
およびも含まれます。copy_video
オプション。Zencoder にソースファイルのオーディオストリームとビデオストリームを使用し、それらをトランスコードするのではなく、新しいコンテナに再パッケージ化するように指示します。最後に、type
出力はセグメント化されたのと a も指定します。format
ts の、拡張子.m3u8 の a url
を加えたので、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"
}
]
}