이 페이지에서는 라이브 스트림의 웹 동영상 텍스트 트랙 형식 (WebVTT)으로 자막을 구성하는 방법을 설명합니다. 자막은 입력 스트림의 cea608 또는 cea708 자막에서 생성됩니다.
자막은 HLS 및 DASH 라이브 스트림에서 지원됩니다.
시작하기 전에
이 페이지에서는 HLS 라이브 스트림 빠른 시작 또는 MPEG-DASH 라이브 스트림 빠른 시작의 시작하기 전에 섹션의 단계를 완료했다고 가정하고 진행합니다.
입력 엔드포인트 만들기
기본 입력 엔드포인트를 만들려면 projects.locations.inputs.create 메서드를 사용합니다.
요청 데이터를 사용하기 전에 다음을 바꿉니다.
PROJECT_NUMBER: Google Cloud 프로젝트 번호입니다. IAM 설정 페이지의 프로젝트 번호 필드에 있습니다.LOCATION: 입력 엔드포인트를 만들 위치. 지원되는 리전 중 하나를 사용합니다.위치 표시us-central1us-east1us-east4us-west1us-west2northamerica-northeast1southamerica-east1asia-east1asia-east2asia-south1asia-northeast1asia-southeast1australia-southeast1europe-north1europe-west1europe-west2europe-west3europe-west4
INPUT_ID: 입력 스트림을 전송할 새 입력 엔드포인트에 대한 사용자 정의 식별자입니다. 이 값은 1~63자(영문 기준)여야 하고[a-z0-9]로 시작하고 끝나야 하며 문자 사이에 대시(-)를 포함할 수 있습니다. 예를 들면my-input입니다.
JSON 요청 본문:
{
"type": "RTMP_PUSH"
}
요청을 보내려면 다음 옵션 중 하나를 펼칩니다.
다음과 비슷한 JSON 응답이 표시됩니다.
{
"name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID",
"metadata": {
"@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
"createTime": CREATE_TIME,
"target": "projects/PROJECT_NUMBER/locations/LOCATION/inputs/INPUT_ID",
"verb": "create",
"requestedCancellation": false,
"apiVersion": "v1"
},
"done": false
}
반환된 OPERATION_ID를 복사하여 다음 섹션에 사용합니다.
결과 확인
projects.locations.operations.get 메서드를 사용하여 입력 엔드포인트가 생성되었는지 확인합니다. 응답에 "done: false"가 포함되어 있으면 응답에 "done: true"가 포함될 때까지 명령어를 반복합니다. 리전에서 첫 번째 입력 엔드포인트를 만드는 데 최대 10분까지 걸릴 수 있습니다.
요청 데이터를 사용하기 전에 다음을 바꿉니다.
PROJECT_NUMBER: Google Cloud 프로젝트 번호입니다. IAM 설정 페이지의 프로젝트 번호 필드에 있습니다.LOCATION: 입력 엔드포인트가 있는 위치. 지원되는 리전 중 하나를 사용합니다.위치 표시us-central1us-east1us-east4us-west1us-west2northamerica-northeast1southamerica-east1asia-east1asia-east2asia-south1asia-northeast1asia-southeast1australia-southeast1europe-north1europe-west1europe-west2europe-west3europe-west4
OPERATION_ID: 작업의 식별자
요청을 보내려면 다음 옵션 중 하나를 펼칩니다.
다음과 비슷한 JSON 응답이 표시됩니다.
{
"name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID",
"metadata": {
"@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
"createTime": CREATE_TIME,
"endTime": END_TIME,
"target": "projects/PROJECT_NUMBER/locations/LOCATION/inputs/INPUT_ID",
"verb": "create",
"requestedCancellation": false,
"apiVersion": "v1"
},
"done": true,
"response": {
"@type": "type.googleapis.com/google.cloud.video.livestream.v1.Input",
"name": "projects/PROJECT_NUMBER/locations/LOCATION/inputs/INPUT_ID",
"createTime": CREATE_TIME,
"updateTime": UPDATE_TIME,
"type": "RTMP_PUSH",
"uri": INPUT_STREAM_URI, # For example, "rtmp://1.2.3.4/live/b8ebdd94-c8d9-4d88-a16e-b963c43a953b",
"tier": "HD"
}
}
uri 필드를 찾고 나중에 입력 스트림 보내기 섹션에서 사용할 반환된 INPUT_STREAM_URI를 복사합니다.
채널 만들기
채널을 만들려면 projects.locations.channels.create 메서드를 사용합니다.
채널 구성에서 다음 사항에 유의하세요.
하나의
ElementaryStream인TextStream이 자막에 사용됩니다.{ "key": "webvtt-english", "textStream": { "codec": "webvtt", "display_name": "English", "language_code": "en-US", "mapping": [ { "input_cea_channel": "CC1" } ] } }TextStreamcodec필드가webvtt로 설정됩니다.TextStreammapping필드는 입력 스트림을 텍스트 트랙에 매핑합니다. 이 예에서input_cea_channel는 영어 자막의 입력 채널CC1에 매핑됩니다.기본 스트림은 키
vtt-english이 있는MuxStream을 만드는 데 사용됩니다.{ "key": "vtt_english", "container": "vtt", "elementaryStreams": [ "webvtt-english" ], "segmentSettings": { "segmentDuration": "2s" } }그런 다음 이 mux 스트림은 HLS 및 DASH 매니페스트 모두에서 참조됩니다.
{ "fileName": "main.m3u8", "type": "HLS", "muxStreams": [ "mux_video_ts", "vtt_english" ], "maxSegmentCount": 5 }
요청 데이터를 사용하기 전에 다음을 바꿉니다.
PROJECT_NUMBER: Google Cloud 프로젝트 번호입니다. IAM 설정 페이지의 프로젝트 번호 필드에 있습니다.LOCATION: 채널을 만들 위치. 지원되는 리전 중 하나를 사용합니다.위치 표시us-central1us-east1us-east4us-west1us-west2northamerica-northeast1southamerica-east1asia-east1asia-east2asia-south1asia-northeast1asia-southeast1australia-southeast1europe-north1europe-west1europe-west2europe-west3europe-west4
CHANNEL_ID: 만들려는 채널의 사용자 정의 식별자입니다. 이 값은 1~63자(영문 기준)여야 하고[a-z0-9]로 시작하고 끝나야 하며 문자 사이에 대시(-)를 포함할 수 있습니다.INPUT_ID: 입력 엔드포인트의 사용자 정의 식별자입니다.BUCKET_NAME: 실시간 스트림 매니페스트 및 세그먼트 파일을 보관하기 위해 만든 Cloud Storage 버킷의 이름입니다.
JSON 요청 본문:
{
"inputAttachments": [
{
"key": "my-input",
"input": "projects/PROJECT_NUMBER/locations/LOCATION/inputs/INPUT_ID"
}
],
"output": {
"uri": "gs://BUCKET_NAME"
},
"elementaryStreams": [
{
"key": "es_video",
"videoStream": {
"h264": {
"profile": "high",
"widthPixels": 1280,
"heightPixels": 720,
"bitrateBps": 3000000,
"frameRate": 30
}
}
},
{
"key": "es_audio",
"audioStream": {
"codec": "aac",
"channelCount": 2,
"bitrateBps": 160000
}
},
{
"key": "webvtt-english",
"textStream": {
"codec": "webvtt",
"display_name": "English",
"language_code": "en-US",
"mapping": [
{
"input_cea_channel": "CC1"
}
]
}
}
],
"muxStreams": [
{
"key": "mux_video_fmp4",
"container": "fmp4",
"elementaryStreams": [
"es_video"
],
"segmentSettings": {
"segmentDuration": "2s"
}
},
{
"key": "mux_audio_fmp4",
"container": "fmp4",
"elementaryStreams": [
"es_audio"
],
"segmentSettings": {
"segmentDuration": "2s"
}
},
{
"key": "mux_video_ts",
"container": "ts",
"elementaryStreams": [
"es_video",
"es_audio"
],
"segmentSettings": {
"segmentDuration": "2s"
}
},
{
"key": "vtt_english",
"container": "vtt",
"elementaryStreams": [
"webvtt-english"
],
"segmentSettings": {
"segmentDuration": "2s"
}
}
],
"manifests": [
{
"key": "manifest_dash",
"fileName": "main.mpd",
"type": "DASH",
"muxStreams": [
"mux_video_fmp4",
"mux_audio_fmp4",
"vtt_english"
],
"maxSegmentCount": 5
},
{
"key": "manifest_hls",
"fileName": "main.m3u8",
"type": "HLS",
"muxStreams": [
"mux_video_ts",
"vtt_english"
],
"maxSegmentCount": 5
}
]
}
요청을 보내려면 다음 옵션 중 하나를 펼칩니다.
다음과 비슷한 JSON 응답이 표시됩니다.
{
"name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID",
"metadata": {
"@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
"createTime": CREATE_TIME,
"target": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID",
"verb": "create",
"requestedCancellation": false,
"apiVersion": "v1"
},
"done": false
}
채널 가져오기
새 작업 ID를 사용하여 채널 만들기 작업의 결과를 확인할 수 있습니다.
채널이 생성되면 projects.locations.channels.get 메서드를 사용하여 채널 상태를 쿼리합니다.
요청 데이터를 사용하기 전에 다음을 바꿉니다.
PROJECT_NUMBER: Google Cloud 프로젝트 번호입니다. IAM 설정 페이지의 프로젝트 번호 필드에 있습니다.LOCATION: 채널이 있는 위치. 지원되는 리전 중 하나를 사용합니다.위치 표시us-central1us-east1us-east4us-west1us-west2northamerica-northeast1southamerica-east1asia-east1asia-east2asia-south1asia-northeast1asia-southeast1australia-southeast1europe-north1europe-west1europe-west2europe-west3europe-west4
CHANNEL_ID: 채널의 사용자 정의 식별자
요청을 보내려면 다음 옵션 중 하나를 펼칩니다.
다음과 비슷한 JSON 응답이 표시됩니다.
{
"name": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID",
"createTime": CREATE_TIME,
"updateTime": UPDATE_TIME,
"inputAttachments": [
{
"key": "INPUT_ID",
"input": "projects/PROJECT_NUMBER/locations/LOCATION/inputs/INPUT_ID"
}
],
"activeInput": "INPUT_ID",
"output": {
"uri": "gs://BUCKET_NAME"
},
"elementaryStreams": [
{
"key": "es_video",
"videoStream": {
"h264": {
"profile": "high",
"widthPixels": 1280,
"heightPixels": 720,
"bitrateBps": 3000000,
"frameRate": 30
}
}
},
{
"key": "es_audio",
"audioStream": {
"codec": "aac",
"channelCount": 2,
"bitrateBps": 160000
}
},
{
"key": "webvtt-english",
"textStream": {
"codec": "webvtt",
"display_name": "English",
"language_code": "en-US",
"mapping": [
{
"input_cea_channel": "CC1"
}
]
}
}
],
"muxStreams": [
{
"key": "mux_video_fmp4",
"container": "fmp4",
"elementaryStreams": [
"es_video"
],
"segmentSettings": {
"segmentDuration": "2s"
}
},
{
"key": "mux_audio_fmp4",
"container": "fmp4",
"elementaryStreams": [
"es_audio"
],
"segmentSettings": {
"segmentDuration": "2s"
}
},
{
"key": "mux_video_ts",
"container": "ts",
"elementaryStreams": [
"es_video",
"es_audio"
],
"segmentSettings": {
"segmentDuration": "2s"
}
},
{
"key": "vtt_english",
"container": "vtt",
"elementaryStreams": [
"webvtt-english"
],
"segmentSettings": {
"segmentDuration": "2s"
}
}
],
"manifests": [
{
"key": "manifest_dash",
"fileName": "main.mpd",
"type": "DASH",
"muxStreams": [
"mux_video_fmp4",
"mux_audio_fmp4",
"vtt_english"
],
"maxSegmentCount": 5
},
{
"key": "manifest_hls",
"fileName": "main.m3u8",
"type": "HLS",
"muxStreams": [
"mux_video_ts",
"vtt_english"
],
"maxSegmentCount": 5
}
],
"streamingState": "STOPPED"
}
전체 응답에는 다음 필드가 포함됩니다.
{
...
"streamingState": "STOPPED"
...
}
이 응답은 이제 채널을 시작할 수 있음을 나타냅니다.
채널 시작
projects.locations.channels.start 메서드를 사용하여 채널을 시작합니다. 입력 스트림을 수락하거나 출력 스트림을 생성하려면 먼저 채널을 시작해야 합니다.
리전에서 첫 번째 채널을 시작하는 데는 약 10분이 걸립니다.
요청 데이터를 사용하기 전에 다음을 바꿉니다.
PROJECT_NUMBER: Google Cloud 프로젝트 번호입니다. IAM 설정 페이지의 프로젝트 번호 필드에 있습니다.LOCATION: 채널이 있는 위치. 지원되는 리전 중 하나를 사용합니다.위치 표시us-central1us-east1us-east4us-west1us-west2northamerica-northeast1southamerica-east1asia-east1asia-east2asia-south1asia-northeast1asia-southeast1australia-southeast1europe-north1europe-west1europe-west2europe-west3europe-west4
CHANNEL_ID: 채널의 사용자 정의 식별자
요청을 보내려면 다음 옵션 중 하나를 펼칩니다.
다음과 비슷한 JSON 응답이 표시됩니다.
{
"name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID",
"metadata": {
"@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
"createTime": CREATE_TIME,
"target": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID",
"verb": "start",
"requestedCancellation": false,
"apiVersion": "v1"
},
"done": false
}
채널이 시작되었는지 확인하려면 이전과 같이 채널 정보 가져오기를 수행합니다. 응답에 다음이 포함되어야 합니다.
{
...
"streamingState": "AWAITING_INPUT"
...
}
입력 스트림 보내기
채널이 준비되었으면 입력 스트림을 입력 엔드포인트로 전송하여 라이브 스트림을 생성합니다. 자막이 포함된 MP4 (또는 기타 TEST_VOD_FILE)를 다운로드하고 ffmpeg를 사용하여 입력 엔드포인트로 전송할 수 있습니다.
새 터미널 창을 엽니다. 결과 확인 섹션에서 INPUT_STREAM_URI를 사용하여 다음 명령어를 실행합니다.
ffmpeg -re -stream_loop -1 -i "TEST_VOD_FILE" \
-c:v copy -c:a aac -strict 2 -f "flv" "INPUT_STREAM_URI"
생성된 라이브 스트림 재생
생성된 미디어 파일을 Shaka Player에서 재생하려면 다음 단계를 완료합니다.
- 만든 Cloud Storage 버킷을 공개적으로 읽을 수 있도록 합니다.
- Cloud Storage 버킷에서 교차 출처 리소스 공유(CORS)를 사용 설정하려면 다음을 수행합니다.
- 다음을 포함하는 JSON 파일을 만듭니다.
[ { "origin": ["https://shaka-player-demo.appspot.com/"], "responseHeader": ["Content-Type", "Range"], "method": ["GET", "HEAD"], "maxAgeSeconds": 3600 } ] -
JSON_FILE_NAME을 이전 단계에서 만든 JSON 파일 이름으로 바꾼 후 다음 명령어를 실행합니다.gcloud storage buckets update gs://BUCKET_NAME --cors-file=JSON_FILE_NAME.json
- 다음을 포함하는 JSON 파일을 만듭니다.
- Cloud Storage 버킷에서 생성된
main.m3u8파일을 찾습니다. 파일의 공개 액세스 열에서 URL 복사를 클릭합니다. - 온라인 실시간 스트림 플레이어인 Shaka Player로 이동합니다.
- 상단 탐색 메뉴에서 커스텀 콘텐츠를 클릭합니다.
- + 버튼을 클릭합니다.
파일의 공개 URL을 매니페스트 URL 상자에 붙여넣습니다.

이름 상자에 이름을 입력합니다.
저장을 클릭합니다.
재생을 클릭합니다.
라이브 스트림이 재생됩니다. Shaka Player UI에서 자막을 사용 설정해야 할 수도 있습니다.
삭제
채널 중지
projects.locations.channels.stop 메서드를 사용하여 채널을 중지합니다.
채널을 삭제하려면 먼저 채널을 중지해야 합니다.
요청 데이터를 사용하기 전에 다음을 바꿉니다.
PROJECT_NUMBER: Google Cloud 프로젝트 번호입니다. IAM 설정 페이지의 프로젝트 번호 필드에 있습니다.LOCATION: 채널이 있는 위치. 지원되는 리전 중 하나를 사용합니다.위치 표시us-central1us-east1us-east4us-west1us-west2northamerica-northeast1southamerica-east1asia-east1asia-east2asia-south1asia-northeast1asia-southeast1australia-southeast1europe-north1europe-west1europe-west2europe-west3europe-west4
CHANNEL_ID: 채널의 사용자 정의 식별자
요청을 보내려면 다음 옵션 중 하나를 펼칩니다.
다음과 비슷한 JSON 응답이 표시됩니다.
{
"name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID",
"metadata": {
"@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
"createTime": CREATE_TIME,
"target": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID",
"verb": "stop",
"requestedCancellation": false,
"apiVersion": "v1"
},
"done": false
}
입력 스트림 중지
ffmpeg를 사용하여 입력 스트림을 전송한 경우 채널을 중지한 후 자동으로 연결이 끊어집니다.
채널 삭제
projects.locations.channels.delete 메서드를 사용하여 채널을 삭제합니다. 채널에서 사용하는 입력 엔드포인트를 삭제하려면 먼저 채널을 삭제해야 합니다.
요청 데이터를 사용하기 전에 다음을 바꿉니다.
PROJECT_NUMBER: Google Cloud 프로젝트 번호입니다. IAM 설정 페이지의 프로젝트 번호 필드에 있습니다.LOCATION: 채널이 있는 위치. 지원되는 리전 중 하나를 사용합니다.위치 표시us-central1us-east1us-east4us-west1us-west2northamerica-northeast1southamerica-east1asia-east1asia-east2asia-south1asia-northeast1asia-southeast1australia-southeast1europe-north1europe-west1europe-west2europe-west3europe-west4
CHANNEL_ID: 채널의 사용자 정의 식별자
요청을 보내려면 다음 옵션 중 하나를 펼칩니다.
다음과 비슷한 JSON 응답이 표시됩니다.
{
"name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID",
"metadata": {
"@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
"createTime": CREATE_TIME,
"target": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID",
"verb": "delete",
"requestedCancellation": false,
"apiVersion": "v1"
},
"done": false
}
입력 엔드포인트 삭제
projects.locations.inputs.delete 메서드를 사용해서 입력 엔드포인트를 삭제합니다.
요청 데이터를 사용하기 전에 다음을 바꿉니다.
PROJECT_NUMBER: Google Cloud 프로젝트 번호입니다. IAM 설정 페이지의 프로젝트 번호 필드에 있습니다.LOCATION: 입력 엔드포인트가 있는 위치. 지원되는 리전 중 하나를 사용합니다.위치 표시us-central1us-east1us-east4us-west1us-west2northamerica-northeast1southamerica-east1asia-east1asia-east2asia-south1asia-northeast1asia-southeast1australia-southeast1europe-north1europe-west1europe-west2europe-west3europe-west4
INPUT_ID: 입력 엔드포인트의 사용자 정의 식별자입니다.
요청을 보내려면 다음 옵션 중 하나를 펼칩니다.
다음과 비슷한 JSON 응답이 표시됩니다.
{
"name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID",
"metadata": {
"@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
"createTime": CREATE_TIME,
"target": "projects/PROJECT_NUMBER/locations/LOCATION/inputs/INPUT_ID",
"verb": "delete",
"requestedCancellation": false,
"apiVersion": "v1"
},
"done": false
}
Cloud Storage 버킷 삭제
Google Cloud 콘솔에서 Cloud Storage 브라우저 페이지로 이동합니다.
만든 버킷 옆에 있는 확인란을 선택합니다.
삭제를 클릭합니다.
표시되는 대화상자 창에서 삭제를 클릭하여 버킷과 콘텐츠를 영구 삭제합니다.