개요
Zencoder를 사용하면 비디오를 MP4로 인코딩 한 다음 "트랜스 코딩"이라고하는 프로세스를 통해 HLS 출력으로 다시 패키징 할 수 있습니다. Transmuxing은 비디오 파일을 다시 인코딩하지 않고도 기존 MP4 비디오를 HLS (HTTP Live Streaming)에 필요한 MPEG TS 세그먼트로 다시 패키징합니다. 종속 출력을 사용하면 H.264 파일과 세그먼트 화 된 파일을 모두 단일 작업으로 생성하여 더 낮은 비용으로 더 빠른 처리 시간을 생성 할 수 있습니다. 트랜스 먹싱 된 출력은 인코딩 비용의 1/4로 청구됩니다. 결과 작업은 6 개의 출력을 생성합니다. 2 개는 계정의 일반 요율로 청구되고 3 개는 인코딩 비용의 1/4로 변환되고 1 개의 재생 목록은 무료입니다.
이를 위해 두 개의 주요 출력 세트 (및 재생 목록)가있는 단일 작업을 생성합니다. 첫 번째 출력 세트는 HLS 출력용 소스 파일로 작동 할 수 있도록 몇 가지 특수 설정이있는 일반 H.264 / AAC MP4 파일입니다. 두 번째 출력 세트는 해당 MP4 파일을 "소스"입력으로 사용하여 콘텐츠를 HLS 출력으로 변환합니다. 이들은 종속 출력이기 때문에 처리 일정을 잡기 전에 해당 소스가 완료 될 때까지 기다립니다.
프로세스의 핵심 부분은source
, Zencoder API V2의 새로운 옵션입니다. 소스는 입력 파일 대신 처리를 위해 작업의 다른 출력에서 생성 된 파일을 사용하도록 출력에 지시합니다. 이 상황에서 Zencoder는 요청 된 비트 전송률로 입력 파일을 기반으로 H.264 파일을 생성합니다. 각 출력이 완료되면 출력에서 세그먼트 화 된 버전이 생성됩니다.
비디오 해상도
아래 표는 몇 가지 일반적인 비디오 해상도를 보여줍니다.
해상도 유형 | 일반 이름 | 종횡비 | 픽셀 크기 |
---|---|---|---|
SD(표준 화질) | 480p | 4:3 | 640 x 480 |
HD(고화질) | 720p | 16:9 | 1280 x 720 |
풀HD(FHD) | 1080p | 16:9 | 1920년 x 80 |
QHD(쿼드 HD) | 1440p | 16:9 | 2560x1440 |
2K 비디오 | 1080p | 1:1.77 | 2048x1080 |
4K 비디오 또는 Ultra HD(UHD) | 4K 또는 2160p | 1:1.9 | 3840x2160 |
8K 비디오 또는 Full Ultra HD | 8K 또는 4320p | 16∶9 | 7680x4320 |
출력에 대한 비디오 해상도를 고려할 때 시청자가 가장 많이 사용할 장치를 고려해야 합니다. (어떤 종류의 분석이 있다면 이것을 결정하는 데 도움이 될 것입니다.) 모바일 장치가 대상인 경우 "세로" 비디오가 점점 인기를 얻고 있음을 고려할 수 있습니다. 수직 비디오를 생성하려면 일반적으로 너비와 높이 값을 교환합니다.
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 라이브 스트리밍 세그먼트 파일을 생성하기위한 추가 출력을 요청에 추가 할 수 있습니다.
분할 된 출력
위의 각 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_audio
과copy_video
옵션은 Zencoder에게 소스 파일의 오디오 및 비디오 스트림을 사용하고 트랜스 코딩하는 대신 새 컨테이너에 다시 패키징하도록 지시합니다. 마지막으로 출력은type
세그먼트 및format
ts의 플러스 a url
확장자가 .m3u8이므로 Zencoder는 분할 된 HLS 파일을 생성 할 수 있습니다.
마지막으로 세그먼트 화 된 각 출력을 참조하는 재생 목록도 생성됩니다. 재생 목록에서 참조 된 첫 번째 파일은 낮은 비트 전송률 비디오입니다. 동영상을 재생하는 기기는 일반적으로 처음에 재생 목록에 나열된 첫 번째 스트림을로드하고 필요에 따라 다른 스트림으로 전환합니다. 이는 재생의 처음 10 초가이 스트림을 사용한다는 것을 의미하며, 그 후 장치는 재생할 적절한 스트림을 선택하기에 충분한 정보를 갖게됩니다.
참고 사항
- HLS 재생 목록 생성은 현재 작업에있는 다른 출력의 정보를 사용하지 않지만 올바른 형식의 적응 형 비트 레이트 재생 목록을 쉽게 생성하고 다른 파일과 함께 업로드하는 방법입니다.
- iOS 장치에서 생성 된 적응 비트 전송률 재생 목록을 재생하지만 VLC는 상대 URL 처리 오류로 인해 발생하지 않습니다. 매니페스트 파일의 디렉토리가 아닌 재생 목록 파일과 동일한 디렉토리에서 세그먼트 파일을 찾습니다.
전체 요청
이제 각 주요 출력 섹션을 살펴 보았으므로이를 단일 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"
}
]
}