서문
DASH는 특정 비디오 형식, 코덱 또는 데이터에 구애받지 않는 패키징 형식 (예 : Zip)이 아니기 때문에 다음과 같은 새로운 옵션을 도입했습니다. streaming_delivery_format
미디어 파일이 특정 표준에 따라 구조화 / 포맷되어야 함을 지정합니다. "대시"를streaming_delivery_format
DASH와의 호환성을 위해 몇 가지 기본 옵션을 수정하고 출력 미디어 파일을 DASH 요구 사항과 일치하는 디렉토리 구조에 넣습니다. 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은 0에서 시작하여 각 세그먼트에 대해 증가 함).
DASH 출력은streaming_delivery_profile
"on_demand"로 설정하면 세그먼트가 아닌 조각난 미디어 파일이 사용됩니다.
mpd
매니페스트 파일은 출력의 루트 수준에 있습니다.- 오디오 및 비디오 미디어는 각각 매니페스트와 동일한 디렉토리에있는 단일 파일입니다.
- 미디어 파일의 이름은 매니페스트와 비슷하지만 "
-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
과content_key
DRM 공급 업체에서 검색하거나 미리 생성하여 DRM 공급 업체로 보내야합니다. 이러한 키가 있으면 단일 변환에 대한 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 인코딩에서 이러한 헤더는 재생 목록 출력에만 추가하면되지만 각 렌 디션에도 추가 할 수 있으므로 렌 디션을 개별적으로 재생할 수 있습니다. 이는 하나 이상의 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/" }
]
}
}
]
}
트랜스먹싱
물론 여러 형식의 비디오를 생성하는 것은 비용이 많이 들고 낭비가 될 수 있습니다. 따라서 Zencoder는copy_video
과copy_audio
옵션. 비디오가 인코딩되지 않고 트랜스 먹싱 된 출력은 일반 재생 시간의 1/4로 청구됩니다. 따라서 동일한 비디오 (예 : MP4, HLS 및 DASH)의 여러 형식을 만들 계획이라면 먼저 각 비트 레이트의 MP4 버전을 인코딩 한 다음 해당 출력을 트랜스 먹싱하여 HLS 및 DASH 버전을 생성 할 수 있습니다. (비디오가 더 이상 단일 스트림이 아니기 때문에 분할 된 형식에서 트랜스 먹싱을 지원하지 않습니다.)
MP4가 후속 세그먼트 스트리밍 형식의 제약 조건에 따라 준비되었는지 확인하려면prepare_for_segmenting
MP4 출력 옵션. 이렇게하면 나중에 세그먼트 형식으로의 트랜스 먹싱과 호환되도록 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
, 예를 들어decoder_bitrate_cap
500 (초당 킬로 비트)이고decoder_buffer_size
1000 (킬로 비트)이면 버퍼가 2 초 분량의 비디오를 저장할 수 있습니다. 또한video_bitrate
보다 약간 낮은decoder_bitrate_cap
, 인코더가 더 많은 데이터를 사용하여 복잡한 장면을 인코딩하고 단순한 장면에서는 더 적은 데이터를 사용할 수 있습니다. 적절한 출발점은 파일 형식에 대한 오버헤드의 최대 10% 를 가정하고, 보다video_bitrate
10% 낮게 설정하고decoder_bitrate_cap
, 약 1.5 초의 비디오를 버퍼링하는 것입니다.
고객이 1000Kbps 연결을 사용할 수 있다고 가정합니다.
- 형식 오버헤드에 대해 10% 를 뺀 후 사용할 수 있는 1000* 0.90 = 900Kbps입니다.
- 900-128 = 772Kbps 비디오
decoder_bitrate_cap
오디오에 대해 128Kbps를 뺀 후. - 772 * 1.5 = 1158Kb
decoder_buffer_size
(1.5 초 분량의 비디오). - 772 * 0.90 = 695Kbps 대상 비디오 비트 전송률 (
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/" }
]
}
}
]
}