실시간 스트림에서 VOD 클립 만들기

이 페이지에서는 Live Stream API를 사용하여 실시간 스트림에서 VOD 클립을 만드는 방법을 설명합니다. VOD 클립은 실시간 스트림에서 저장된 HLS 매니페스트 파일과 세그먼트 파일로 구성됩니다. HLS 매니페스트만 지원됩니다.

Google Cloud 프로젝트 및 인증 설정

Google Cloud 프로젝트와 사용자 인증 정보를 만들지 않은 경우 시작하기 전에를 참조하세요.

입력 엔드포인트 만들기

입력 엔드포인트를 만들려면 projects.locations.inputs.create 메서드를 사용합니다.

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • PROJECT_NUMBER: Google Cloud 프로젝트 번호. IAM 설정 페이지의 프로젝트 번호 필드에 있습니다.
  • LOCATION: 입력 엔드포인트를 만들 위치. 지원되는 리전 중 하나를 사용합니다.
    위치 표시
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • INPUT_ID: 입력 스트림을 전송할 새 입력 엔드포인트에 대한 사용자 정의 식별자입니다. 이 값은 1~63자(영문 기준)여야 하고 [a-z0-9]로 시작하고 끝나야 하며 문자 사이에 대시(-)를 포함할 수 있습니다. 예를 들면 my-input입니다.

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 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
}

이 명령어는 요청 진행 상태를 추적하는 데 사용할 수 있는 장기 실행 작업(LRO)을 만듭니다. 자세한 내용은 장기 실행 작업 관리를 참조하세요.

입력 엔드포인트 세부정보 가져오기

입력 엔드포인트의 세부정보를 가져오려면 projects.locations.inputs.get 메서드를 사용합니다.

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • PROJECT_NUMBER: Google Cloud 프로젝트 번호. IAM 설정 페이지의 프로젝트 번호 필드에 있습니다.
  • LOCATION: 입력 엔드포인트가 있는 위치. 지원되는 리전 중 하나를 사용합니다.
    위치 표시
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • INPUT_ID: 입력 엔드포인트의 사용자 정의 식별자입니다.

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 JSON 응답이 표시됩니다.

{
  "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 메서드를 사용합니다. 다음 샘플은 HLS 실시간 스트림을 생성하는 채널을 만듭니다. 실시간 스트림은 단일 고화질(1280x720) 버전으로 구성됩니다.

VOD 클립을 만들 수 있도록 하려면 retentionConfig 객체를 채널 구성에 추가하세요.

"retentionConfig": {
  "retentionWindowDuration": {
      "seconds": 86400
    }
},

실시간 스트림 채널에 보관을 사용 설정하면 VOD 클립을 만들기 위해 세그먼트와 매니페스트 파일이 보관됩니다. retentionWindowDuration 객체는 실시간 스트림 출력이 Cloud Storage에 업로드된 후 저장되는 시간을 지정합니다. 보관 기간은 세그먼트가 Cloud Storage에서 생성되는 시점에 시작됩니다. 보관 기간은 30일로 제한됩니다. 보관 기간이 지나면 세그먼트가 Cloud Storage에서 자동으로 삭제됩니다. 삭제된 세그먼트를 사용하여 VOD 클립을 만들 수는 없습니다. 삭제 프로세스는 비동기식이며 완료되기까지 최대 24시간이 걸릴 수 있습니다.

VOD 클립 생성을 사용 설정하려면 매니페스트의 키를 지정하세요. 실제로 클립을 만들 때 이 키를 참조합니다. HLS 매니페스트만 지원됩니다.

"manifests": [
{
  ...
  "key": "manifest_hls"
}

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • PROJECT_NUMBER: Google Cloud 프로젝트 번호. IAM 설정 페이지의 프로젝트 번호 필드에 있습니다.
  • LOCATION: 채널을 만들 위치. 지원되는 리전 중 하나를 사용합니다.
    위치 표시
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID: 만들려는 채널의 사용자 정의 식별자입니다. 이 값은 1~63자(영문 기준)여야 하고 [a-z0-9]로 시작하고 끝나야 하며 문자 사이에 대시(-)를 포함할 수 있습니다.
  • INPUT_ID: 입력 엔드포인트의 사용자 정의 식별자입니다.
  • BUCKET_NAME: 실시간 스트림 매니페스트 및 세그먼트 파일을 보관하기 위해 만든 Cloud Storage 버킷의 이름입니다.

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 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
}

이 명령어는 요청 진행 상태를 추적하는 데 사용할 수 있는 장기 실행 작업(LRO)을 만듭니다. 자세한 내용은 장기 실행 작업 관리를 참조하세요.

채널 시작

채널을 시작하려면 projects.locations.channels.start 메서드를 사용합니다.

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • PROJECT_NUMBER: Google Cloud 프로젝트 번호. IAM 설정 페이지의 프로젝트 번호 필드에 있습니다.
  • LOCATION: 채널이 있는 위치. 지원되는 리전 중 하나를 사용합니다.
    위치 표시
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-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
}

이 명령어는 요청 진행 상태를 추적하는 데 사용할 수 있는 장기 실행 작업(LRO)을 만듭니다. 자세한 내용은 장기 실행 작업 관리를 참조하세요.

입력 스트림 보내기

새 터미널 창을 엽니다. 입력 엔드포인트 세부정보 가져오기 섹션에서 INPUT_STREAM_URI를 사용하여 다음 명령어를 실행합니다.

ffmpeg -re -f lavfi -i "testsrc=size=1280x720 [out0]; sine=frequency=500 [out1]" \
  -acodec aac -vcodec h264 -f flv INPUT_STREAM_URI

VOD 클립 만들기

VOD 클립을 만들려면 projects.locations.channels.clips.create 메서드를 사용합니다.

outputUri 필드를 사용하여 Cloud Storage에서 클립 및 클립 매니페스트 파일을 저장할 위치를 지정합니다. 실시간 스트림 매니페스트에 만든 동일한 버킷 또는 다른 버킷을 사용할 수 있습니다. 버킷 이름에 디렉터리 이름을 추가할 수도 있습니다(예: my-bucket/vod-clip).

clipManifests 배열의 manifestKey 필드를 사용하여 클립을 저장할 매니페스트를 지정합니다. 이 페이지의 채널 구성 예시에서 이 키는 manifest_hls로 설정됩니다.

timeSlice 객체를 slices 배열에 추가하여 실시간 스트림의 여러 시간 섹션을 하나의 클립으로 결합할 수 있습니다.

"outputUri": "gs://my-bucket",
"clipManifests":[
  {
    "manifestKey": "manifest_hls"
  }
],
"slices":[
  {
    "timeSlice": {
      "markinTime": "2022-07-08T23:03:20.000Z",
      "markoutTime": "2022-07-08T23:04:20.000Z"
    }
  },
  {
    "timeSlice": {
      "markinTime": "2022-07-08T23:05:20.000Z",
      "markoutTime": "2022-07-08T23:06:20.000Z"
    }
  }
]

다음에 유의하세요.

  • 각 클립에는 slices에 하나 이상의 timeSlice가 포함되어야 합니다.
  • clipManifests.manifestKey 필드는 클립의 상위 채널에서 정의된 HLS 매니페스트를 참조해야 합니다. 클립 작업 생성 요청이 성공하면 생성된 클립 매니페스트의 URI가 clipManifests.outputUri 필드에 반환됩니다. 이 URI는 클립의 outputUri 필드에서 지정된 경로에 있습니다.
  • clipManifests 배열은 요청당 매니페스트 하나만 지원합니다. 동일한 클립 작업에 대해 여러 매니페스트를 생성하려면 매니페스트를 여러 클립 작업 요청으로 분할해야 합니다.
  • 클립 슬라이스는 동일해야 합니다. 모든 요소는 timeSlice 유형이어야 합니다.
  • timeSlice 객체 집합은 겹치지 않아야 하며 시간 순서대로 되어 있어야 합니다. markinTime은 모든 timeSlice에서 markoutTime보다 이전이어야 합니다.
  • 클립의 최신 markinTime이 채널 시작 시간 또는 보관 기간의 시작보다 이전인 경우 마크인 시간은 둘 중 더 늦은 시간으로 설정됩니다.
  • 클립의 최신 markoutTime이 채널 중지 시간보다 늦으면 채널 중지 시간으로 설정됩니다. 클립의 최신 markoutTime이 현재 시스템 실제 경과 시간보다 늦은 경우 API가 실제로 자르기 작업을 시작하는 시간으로 설정됩니다.
  • 클립의 최대 길이는 24시간입니다.

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • PROJECT_NUMBER: Google Cloud 프로젝트 번호. IAM 설정 페이지의 프로젝트 번호 필드에 있습니다.
  • LOCATION: 채널이 있는 위치. 지원되는 리전 중 하나를 사용합니다.
    위치 표시
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID: 채널의 사용자 정의 식별자
  • CLIP_ID: VOD 클립의 사용자 정의 식별자
  • MARK_IN_TIME: 원래 실시간 스트림 매니페스트의 마크인 Unix epoch 시간. RFC3339 UTC 'Zulu' 형식의 타임스탬프를 사용합니다(예: 2014-10-02T15:01:23Z).
  • MARK_OUT_TIME: 원래 실시간 스트림 매니페스트의 마크아웃 Unix epoch 시간. RFC3339 UTC 'Zulu' 형식의 타임스탬프를 사용합니다(예: 2014-10-02T15:01:23Z).
  • BUCKET_NAME: VOD 클립 매니페스트 및 세그먼트 파일을 보관하기 위해 만든 Cloud Storage 버킷의 이름. 실시간 스트림 매니페스트에 만든 동일한 버킷 또는 다른 버킷을 사용할 수 있습니다. 버킷 이름에 디렉터리 이름을 추가할 수도 있습니다(예: my-bucket/vod-clip).

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 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/clips/CLIP_ID",
    "verb": "create",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": false
}

이 명령어는 요청 진행 상태를 추적하는 데 사용할 수 있는 장기 실행 작업(LRO)을 만듭니다. 자세한 내용은 장기 실행 작업 관리를 참조하세요.

VOD 클립 가져오기

VOD 클립을 가져오려면 projects.locations.channels.clips.get 메서드를 사용합니다.

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • PROJECT_NUMBER: Google Cloud 프로젝트 번호. IAM 설정 페이지의 프로젝트 번호 필드에 있습니다.
  • LOCATION: 채널이 있는 위치. 지원되는 리전 중 하나를 사용합니다.
    위치 표시
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID: 채널의 사용자 정의 식별자
  • CLIP_ID: VOD 클립의 사용자 정의 식별자

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 JSON 응답이 표시됩니다.

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID/clips/CLIP_ID",
  "createTime": CREATE_TIME,
  "startTime": START_TIME,
  "updateTime": UPDATE_TIME,
  "state": "SUCCEEDED",
  "outputUri": "gs://BUCKET_NAME",
  "slices": [
    {
      "timeSlice": {
        "markinTime": "MARK_IN_TIME",
        "markoutTime": "MARK_OUT_TIME"
      }
    }
  ],
  "features": {},
  "clipManifests": [
    {
      "manifestKey": "manifest_hls",
      "outputUri": "gs://BUCKET_NAME/main.m3u8"
    }
  ]
}

생성된 매니페스트는 clipManifests.outputUri 필드에 지정된 URI에 있습니다. 매니페스트 파일 이름은 상위 채널의 manifests.fileName 필드 값과 동일합니다.

응답에 다음이 포함되어야 합니다.

{
  ...
  "state": "SUCCEEDED"
  ...
}

projects.locations.channels.clips.get 메서드를 사용하면 채널당 최근 클립 작업 레코드 1,000개만 사용할 수 있습니다. 제한보다 오래된 클립 작업 기록은 모두 삭제됩니다. outputUri로 지정된 생성된 클립 파일을 관리해야 합니다. Live Stream API는 Cloud Storage에서 이러한 파일을 삭제하지 않습니다.

버킷 콘텐츠 확인

클립의 outputUri 필드에 지정된 대로 Cloud Storage 버킷을 엽니다. 다음 파일과 디렉터리가 포함되어 있는지 확인합니다.

  • 채널 구성에 지정된 manifests.fileName과 이름이 같은 클립의 최상위 매니페스트(예: main.m3u8) 온라인 미디어 플레이어를 사용하여 이 매니페스트를 재생할 수 있습니다.
  • 채널에 지정된 각 muxStreams.key의 디렉터리(예: mux_video_ts)
    • 클립의 재생목록(예: index-1.m3u8)
    • YYYYMMDDTHHMMSSZ 형식을 사용하여 이름이 지정된 디렉터리(예: 20220708T203309Z/). 이 디렉터리에는 VOD 클립 세그먼트가 있습니다.
      • VOD 클립을 구성하는 여러 세그먼트 segment-number.ts 파일

VOD 클립 재생

생성된 미디어 파일을 Shaka Player에서 재생하려면 다음 단계를 완료합니다.

  1. 만든 Cloud Storage 버킷을 공개적으로 읽을 수 있도록 합니다.
  2. Cloud Storage 버킷에서 교차 출처 리소스 공유(CORS)를 사용 설정하려면 다음을 수행합니다.
    1. 다음을 포함하는 JSON 파일을 만듭니다.
      [
        {
          "origin": ["https://shaka-player-demo.appspot.com/"],
          "responseHeader": ["Content-Type", "Range"],
          "method": ["GET", "HEAD"],
          "maxAgeSeconds": 3600
        }
      ]
    2. JSON_FILE_NAME을 이전 단계에서 만든 JSON 파일 이름으로 바꾼 후 다음 명령어를 실행합니다.
      gcloud storage buckets update gs://BUCKET_NAME --cors-file=JSON_FILE_NAME.json
  3. Cloud Storage 버킷에서 생성된 파일을 찾습니다. 파일의 공개 액세스 열에서 URL 복사를 클릭합니다.
  4. 온라인 실시간 스트림 플레이어인 Shaka Player로 이동합니다.
  5. 상단 탐색 메뉴에서 커스텀 콘텐츠를 클릭합니다.
  6. + 버튼을 클릭합니다.
  7. 파일의 공개 URL을 매니페스트 URL 상자에 붙여넣습니다.

  8. 이름 상자에 이름을 입력합니다.

  9. 저장을 클릭합니다.

  10. 재생을 클릭합니다.

테스트 패턴 재생이 실시간 스트림으로 표시됩니다.

패턴 테스트 동영상

광고 시점 및 슬레이트 이벤트

라이브 스트림에 광고 시점 이벤트를 만든 경우 VOD 클립에는 광고가 포함되지 않습니다. API는 광고 시점 대신 다음 태그로 대체된 재생목록을 생성합니다.

#EXT-X-CUE-OUT: AD_BREAK_DURATION
#EXT-X-CUE-IN

VOD 클립의 시작 또는 끝에 표시되는 슬레이트는 자동으로 삭제됩니다. 라이브 스트림 콘텐츠로 둘러싸여 스트림 내에 표시되는 슬레이트는 생성된 VOD 클립에 유지됩니다.