はじめに
DASH は、特定のビデオフォーマット、コーデック、またはデータに依存しないパッケージ形式(Zip など)ではないため、streaming_delivery_format
メディアを指定するための新しいオプションが導入されました。ファイルは、特定の規格に従って構造化/フォーマットする必要があります。に「ダッシュ」を選択すると、DASH との互換性のためのいくつかのデフォルトオプションが変更され、出力メディアファイルは DASH 要件に準拠したディレクトリ構造に配置されます。streaming_delivery_format
DASH メディア出力も「セグメント化」type
に設定して、メディアが DASH ストリーミング用に準備されるようにする必要があります。
{
"input": "http://s3.amazonaws.com/zencodertesting/test.mov",
"outputs": [
{
"streaming_delivery_format": "dash",
"video_bitrate": 700,
"type": "segmented",
"url": "s3://mybucket/dash-examples/sbr/rendition.mpd"
}
]
}
「ダッシュ」streaming_delivery_format
に設定された出力の詳細:
fixed_keyframe_interval
が true に設定されます。segment_seconds
デフォルトは 2 です。- デフォルトのフォーマットは
m4f
(mpd
マニフェストファイルで) になります。
セグメント化された DASH 出力のファイル構造:
mpd
マニフェストファイルは出力のルートレベルにあります。- オーディオメディアとビデオメディアには、それぞれ独自のサブディレクトリ (「
audio/und
」と「video/1
」) があります。 - これらの各ディレクトリには、初期化データを持つ
init.mp4
"" があります。 - メディアデータは "
seg-N.m4f
" という名前のファイルに格納されます (N はゼロから始まり、セグメントごとに増加します)。
「on_demand」streaming_delivery_profile
に設定されたダッシュ出力では、セグメントではなく断片化されたメディアファイルが使用されます。
mpd
マニフェストファイルは出力のルートレベルにあります。- オーディオメディアとビデオメディアは、マニフェストと同じディレクトリ内の 1 つのファイルになります。
- メディアファイルの名前は、マニフェストと同様ですが、必要に応じて「
-audio
」または「-video
」という接尾辞が追加されます。
サポートされている DASH 構成:
- サポートされている形式:
m4f
およびwebm
- サポートされているビデオコーデック:
h264
hevc
、vp8
、、vp9
- サポートされているオーディオコーデック:
aac
ac3
、eac3
、、vorbis
- 現在、"
webm
" 形式の出力は「on_demand」のみをサポートしていますstreaming_delivery_profile
- 現在、"
webm
" 形式の出力は DRM をサポートしていません。
複数のビットレート
Zencoder で生成された DASH 出力は、独自に再生するために必要な構造を備えますが、このようなストリーミング配信オプションの恩恵を真に享受するには、異なるビットレート (レンディション) で複数のバージョンを生成し、レンディションをリストする「プレイリスト」タイプの出力とともに、プレイヤーがは、現在のネットワーク状況に応じて、必要に応じてビットレートを切り替えられます。プレイリストの出力は従属出力です。つまり、ラベルによって他の出力を参照し、それらの出力からのデータを使用してプレイリストの最終的なレンディションを生成します。再生リストの出力でストリームパスを設定し、レンディションファイルの場所への相対パスになるように注意する必要があります。
{
"input": "http://s3.amazonaws.com/zencodertesting/test.mov",
"outputs": [
{
"label": "dash-1200",
"streaming_delivery_format": "dash",
"video_bitrate": 1200,
"type": "segmented",
"url": "s3://mybucket/dash-examples/mbr/1200k/rendition.mpd"
},
{
"label": "dash-700",
"streaming_delivery_format": "dash",
"video_bitrate": 700,
"type": "segmented",
"url": "s3://mybucket/dash-examples/mbr/700k/rendition.mpd"
},
{
"label": "dash-400",
"streaming_delivery_format": "dash",
"video_bitrate": 400,
"type": "segmented",
"url": "s3://mybucket/dash-examples/mbr/400k/rendition.mpd"
},
{
"streaming_delivery_format": "dash",
"type": "playlist",
"url": "s3://mybucket/dash-examples/mbr/manifest.mpd",
"streams": [
{ "source": "dash-1200", "path": "1200k" },
{ "source": "dash-700", "path": "700k" },
{ "source": "dash-400", "path": "400k" }
]
}
]
}
暗号化
Zencoder は、Marlin または Playready ライセンスサーバーとの統合に必要なヘッダーを使用して、CENC 暗号化の DASH 出力の生成もサポートしています。出力ごとに、以下を含む drm オプションのハッシュを指定するだけです。method
key_id
、およびcontent_key
。key_id
およびは、DRM ベンダーから取得するか、事前に生成して DRM content_key
ベンダーに送信する必要があります。これらのキーを取得すると、単一レンディションの Zencoder API 構造は次のようになります。
{
"input": "http://s3.amazonaws.com/zencodertesting/test.mov",
"outputs": [
{
"streaming_delivery_format": "dash",
"video_bitrate": 700,
"type": "segmented",
"url": "s3://mybucket/dash-examples/sbr/rendition.mpd",
"drm": {
"method": "cenc",
"key_id": "d57d416ccd454d5a08d05bff0742ee76",
"content_key": "f15cae8f4e48a023056e1960ff2228b0"
}
}
]
}
コンテンツはで暗号化されcontent_key
、.mpd
マニフェストファイルにはkey_id
そのヘッダーに。ただし、この出力が確実に再生可能になるためには、の取得方法を指定するヘッダーも必要ですcontent_key
。マルチビットレート DASH エンコードでは、これらのヘッダーはプレイリスト出力に追加するだけで済みますが、各レンディションに追加することもできます。そのため、レンディションは個別に再生できます。これを行うには、1 つ以上の DRM スキーマを追加します。
"input": "http://s3.amazonaws.com/zencodertesting/test.mov",
"outputs": [
{
"streaming_delivery_format": "dash",
"video_bitrate": 700,
"type": "segmented",
"url": "s3://mybucket/dash-examples/sbr/rendition.mpd",
"drm": {
"method": "cenc",
"key_id": "d57d416ccd454d5a08d05bff0742ee76",
"content_key": "f15cae8f4e48a023056e1960ff2228b0",
"schemas": [
{ "type": "marlin" },
{ "type": "playready", "license_acquisition_url": "https://playready.example.com/license_server/" }
]
}
}
]
}
次に、これをまとめて、マルチビットレート、DRM 暗号化の DASH ジョブを作成できます。
{
"input": "http://s3.amazonaws.com/zencodertesting/test.mov",
"outputs": [
{
"label": "dash-1200",
"streaming_delivery_format": "dash",
"video_bitrate": 1200,
"type": "segmented",
"url": "s3://mybucket/dash-examples/mbr/1200k/rendition.mpd",
"drm": {
"method": "cenc",
"key_id": "d57d416ccd454d5a08d05bff0742ee76",
"content_key": "f15cae8f4e48a023056e1960ff2228b0"
}
},
{
"label": "dash-700",
"streaming_delivery_format": "dash",
"video_bitrate": 700,
"type": "segmented",
"url": "s3://mybucket/dash-examples/mbr/700k/rendition.mpd",
"drm": {
"method": "cenc",
"key_id": "d57d416ccd454d5a08d05bff0742ee76",
"content_key": "f15cae8f4e48a023056e1960ff2228b0"
}
},
{
"label": "dash-400",
"streaming_delivery_format": "dash",
"video_bitrate": 400,
"type": "segmented",
"url": "s3://mybucket/dash-examples/mbr/400k/rendition.mpd",
"drm": {
"method": "cenc",
"key_id": "d57d416ccd454d5a08d05bff0742ee76",
"content_key": "f15cae8f4e48a023056e1960ff2228b0"
}
},
{
"streaming_delivery_format": "dash",
"type": "playlist",
"url": "s3://mybucket/dash-examples/mbr/manifest.mpd",
"streams": [
{ "source": "dash-1200", "path": "1200k" },
{ "source": "dash-700", "path": "700k" },
{ "source": "dash-400", "path": "400k" }
],
"drm": {
"method": "cenc",
"key_id": "d57d416ccd454d5a08d05bff0742ee76",
"content_key": "f15cae8f4e48a023056e1960ff2228b0",
"schemas": [
{ "type": "marlin" },
{ "type": "playready", "license_acquisition_url": "https://playready.example.com/license_server/" }
]
}
}
]
}
transmuxing
もちろん、ビデオの複数のフォーマットを生成することは高価で無駄になる可能性があります。したがって、Zencoder は、copy_video
およびを使用して、同じエンコードされたストリームを異なる形式 (transmuxing と呼ばれる) に再パッケージ化をサポートしています。copy_audio
オプション。ビデオがエンコードされずに変換される出力は、通常の時間の 1/4 で充電されます。したがって、同じビデオの複数の形式(MP4、HLS、DASH など)を作成する場合は、まず各ビットレートの MP4 バージョンをエンコードしてから、それらの出力を変換して HLS と DASH バージョンを作成できます。(ビデオはもはや単一のストリームではないため、セグメント化された形式からのトランスミューシングはサポートしていません)。
MP4 が、後続のセグメント化されたストリーミング形式の制約に従って準備されるようにするには、MP4 prepare_for_segmenting
出力のオプションも使用します。これにより、MP4 のビデオストリームをエンコードするときのキーフレームとキャプションのデフォルト値が制御され、後でセグメント化された形式への変換と互換性が保証されます。
MP4 をトランスマルチアウトプット用のソースとして使用すると、プレイリスト出力と同様に動作します。別の出力のラベルに一致するソースオプションを指定しますが、今回はストリームハッシュではなく、メインレベルの出力オプションの一部です。
{
"input": "http://s3.amazonaws.com/zencodertesting/test.mov",
"outputs": [
{
"label": "mp4-700k",
"prepare_for_segmenting": ["hls", "dash"],
"video_bitrate": 700,
"url": "s3://mybucket/transmux-examples/sbr/video.mp4"
},
{
"source": "mp4-700k",
"copy_video": true,
"copy_audio": true,
"type": "segmented",
"url": "s3://mybucket/transmux-examples/sbr/hls/video.m3u8"
},
{
"source": "mp4-700k",
"copy_video": true,
"copy_audio": true,
"streaming_delivery_format": "dash",
"type": "segmented",
"url": "s3://mybucket/transmux-examples/sbr/dash/video.mpd"
}
]
}
配信の最適化
DASH はストリーミング配信を目的としているので、各レンディションのビットレートのピークを制御して、プレーヤーがバッファを再バッファしたり、低ビットレートのエンコードに不必要に切り替えられないようにすることをお勧めします。デコーダ/プレーヤーが処理できる内容に応じてエンコードされたストリームの変動を制御するオプションは
一般的な推奨事項は、decoder_bitrate_cap
ビデオストリームで使用可能な最大ビットレートを設定することです。ファイル形式のオーバーヘッドだけでなく、オーディオも考慮する必要があることに注意してください。decoder_buffer_size
は、技術的にはデコードデバイスで使用可能なビデオバッファメモリと一致するように想定されていますが、多くの場合、事前にバッファされるコンテンツの量を制御するためによく使用されます。これはの倍数として動作するためdecoder_bitrate_cap
、たとえば 500(キロビット/秒)decoder_bitrate_cap
だった場合、decoder_buffer_size
1000 (キロビット) だった場合、バッファは 2 秒分のビデオを保存できます。また、video_bitrate
より少し低く設定することをお勧めします。これによりdecoder_bitrate_cap
、エンコーダが使用できます。より多くのデータを使用して複雑なシーンをエンコードし、単純なシーンではより少ないデータをエンコードします。適切な出発点は、ファイル形式に対して最大 10% のオーバーヘッドを想定し、video_bitrate
10% をよりも低く設定しdecoder_bitrate_cap
、約1を許可することです。5.5 秒のビデオをバッファリングします。
お客様が1000 Kbps接続を使用できると仮定します。
- 1000 * 0.90 = 900 Kbps で、フォーマットのオーバーヘッドを 10% 引いた後に利用できます。
- 900-128 = オーディオの 128 Kbps
decoder_bitrate_cap
を引いた後の 772 Kbps のビデオ。 - 772 * 1.5 = 1158 Kb
decoder_buffer_size
(1.5秒分のビデオの場合)。 - 772 * 0.90 = 695 Kbps のターゲットビデオビットレート (より 10% 低い
decoder_bitrate_cap
)。
だから、より正確なストリーミングエンコードの例のために:
{
"input": "http://s3.amazonaws.com/zencodertesting/test.mov",
"outputs": [
{
"label": "mp4-1000k",
"prepare_for_segmenting": ["hls", "dash"],
"audio_bitrate": 128,
"decoder_bitrate_cap": 772,
"decoder_buffer_size": 1158,
"video_bitrate": 695,
"url": "s3://mybucket/transmux-examples/sbr/video.mp4"
},
{
"source": "mp4-1000k",
"copy_video": true,
"copy_audio": true,
"type": "segmented",
"url": "s3://mybucket/transmux-examples/sbr/hls/video.m3u8"
},
{
"source": "mp4-1000k",
"copy_video": true,
"copy_audio": true,
"streaming_delivery_format": "dash",
"type": "segmented",
"url": "s3://mybucket/transmux-examples/sbr/dash/video.mpd"
}
]
}
それをすべてまとめる
{
"input": "http://s3.amazonaws.com/zencodertesting/test.mov",
"outputs": [
{
"label": "mp4-1500k",
"prepare_for_segmenting": ["hls", "dash"],
"audio_bitrate": 128,
"decoder_bitrate_cap": 1222,
"decoder_buffer_size": 1833,
"video_bitrate": 1100,
"size": "1280x720",
"url": "s3://mybucket/full-examples/mp4/1500.mp4"
},
{
"label": "mp4-1000k",
"prepare_for_segmenting": ["hls", "dash"],
"audio_bitrate": 128,
"decoder_bitrate_cap": 772,
"decoder_buffer_size": 1158,
"video_bitrate": 695,
"size": "960x540",
"url": "s3://mybucket/full-examples/mp4/1000.mp4"
},
{
"label": "mp4-500k",
"prepare_for_segmenting": ["hls", "dash"],
"audio_bitrate": 128,
"decoder_bitrate_cap": 322,
"decoder_buffer_size": 483,
"video_bitrate": 290,
"size": "640x360",
"url": "s3://mybucket/full-examples/mp4/500.mp4"
},
{
"label": "hls-1500k",
"source": "mp4-1500k",
"copy_video": true,
"copy_audio": true,
"type": "segmented",
"url": "s3://mybucket/full-examples/hls/1500.m3u8"
},
{
"label": "hls-1000k",
"source": "mp4-1000k",
"copy_video": true,
"copy_audio": true,
"type": "segmented",
"url": "s3://mybucket/full-examples/hls/1000.m3u8"
},
{
"label": "hls-500k",
"source": "mp4-500k",
"copy_video": true,
"copy_audio": true,
"type": "segmented",
"url": "s3://mybucket/full-examples/hls/500.m3u8"
},
{
"type": "playlist",
"url": "s3://mybucket/full-examples/hls/multi_bitrate_playlist.m3u8",
"streams": [
{ "path": "1000.m3u8", "source": "hls-1000k" },
{ "path": "1500.m3u8", "source": "hls-1500k" },
{ "path": "500.m3u8", "source": "hls-500k" }
]
},
{
"label": "dash-1500k",
"source": "mp4-1500k",
"copy_video": true,
"copy_audio": true,
"streaming_delivery_format": "dash",
"type": "segmented",
"url": "s3://mybucket/full-examples/dash/1500k/rendition.mpd",
"drm": {
"method": "cenc",
"key_id": "d57d416ccd454d5a08d05bff0742ee76",
"content_key": "f15cae8f4e48a023056e1960ff2228b0"
}
},
{
"label": "dash-1000k",
"source": "mp4-1000k",
"copy_video": true,
"copy_audio": true,
"streaming_delivery_format": "dash",
"type": "segmented",
"url": "s3://mybucket/full-examples/dash/1000k/rendition.mpd",
"drm": {
"method": "cenc",
"key_id": "d57d416ccd454d5a08d05bff0742ee76",
"content_key": "f15cae8f4e48a023056e1960ff2228b0"
}
},
{
"label": "dash-500k",
"source": "mp4-500k",
"copy_video": true,
"copy_audio": true,
"streaming_delivery_format": "dash",
"type": "segmented",
"url": "s3://mybucket/full-examples/dash/500k/rendition.mpd",
"drm": {
"method": "cenc",
"key_id": "d57d416ccd454d5a08d05bff0742ee76",
"content_key": "f15cae8f4e48a023056e1960ff2228b0"
}
},
{
"streaming_delivery_format": "dash",
"type": "playlist",
"url": "s3://mybucket/full-examples/dash/manifest.mpd",
"streams": [
{ "source": "dash-1500k", "path": "1500k" },
{ "source": "dash-1000k", "path": "1000k" },
{ "source": "dash-500k", "path": "500k" }
],
"drm": {
"method": "cenc",
"key_id": "d57d416ccd454d5a08d05bff0742ee76",
"content_key": "f15cae8f4e48a023056e1960ff2228b0",
"schemas": [
{ "type": "marlin" },
{ "type": "playready", "license_acquisition_url": "https://playready.example.com/license_server/" }
]
}
}
]
}