DVR 세션 만들기

이 페이지에서는 Live Stream API를 사용하여 라이브 스트림에서 디지털 비디오 레코더 (DVR) 세션을 만드는 방법을 보여줍니다. 라이브 스트림 중과 종료 후에 DVR 세션을 볼 수 있습니다.

DVR 세션과 채널 클립의 차이점

DVR 세션은 채널 클립 (VOD 클립이라고도 함)과 유사하지만 다음과 같은 주요 차이점이 있습니다.

  • DVR 세션:
    • API는 DVR 매니페스트를 라이브 스트림 세그먼트와 동일한 위치에 저장하므로 Cloud Storage에 추가로 복사하지 않습니다. DVR 매니페스트는 라이브 스트림 매니페스트와 유사하지만 더 깁니다. 보관 기간이 만료되면 세그먼트 파일과 함께 매니페스트가 삭제됩니다.
    • 과거, 현재, 향후 콘텐츠에 대한 DVR 세션을 만들 수 있습니다. 예를 들어 DVR 세션이 라이브 스트림 뒤에 이어질 수 있으며, 나중에 시작 및 중지되도록 DVR 세션을 예약할 수도 있습니다.
    • DVR 세션의 일반적인 사용 사례는 라이브 스트리밍 이벤트의 DVR 기능을 지원하는 것입니다. 예를 들어 시청자가 라이브 스트림이 시작된 1시간 후에 참여하여 1시간 지연된 콘텐츠를 시청하거나 일부를 건너뛸 수 있습니다.
  • 채널 클립:
    • Live Stream API는 클립 매니페스트와 연결된 세그먼트 파일을 사용자 지정 디렉터리에 복사하므로 보관 기간이 만료되어도 삭제되지 않습니다. 클립을 완전히 제어할 수 있습니다.
    • 이전 콘텐츠만 클립할 수 있습니다. 라이브 클립 및 향후 클립 예약은 지원되지 않습니다.
    • 클립의 일반적인 사용 사례는 라이브 스트림을 보관처리하여 라이브 스트림을 VOD 파일로 무기한 사용할 수 있도록 하는 것입니다.

채널 클립에 대한 자세한 내용은 라이브 스트림에서 VOD 클립 만들기를 참고하세요.

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-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • 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-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • 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) 버전으로 구성됩니다.

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

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

라이브 스트림 채널에 보관이 사용 설정된 경우 DVR 세션을 만들기 위해 라이브 스트림 세그먼트와 매니페스트가 유지됩니다. retentionWindowDuration 객체는 라이브 스트림 출력이 Cloud Storage에 업로드된 후 저장되는 시간을 지정합니다. 보관 기간은 Cloud Storage에서 세그먼트가 생성된 시점부터 시작됩니다.

보관 기간은 30일로 제한됩니다. 보관 기간이 지나면 세그먼트 파일, 라이브 스트림 매니페스트, DVR 매니페스트가 Cloud Storage에서 자동으로 삭제됩니다. 삭제된 세그먼트를 사용하여 DVR 세션을 만들 수 없습니다. 삭제 프로세스는 비동기식이며 완료되기까지 최대 24시간이 걸릴 수 있습니다.

DVR 세션 생성을 사용 설정하려면 매니페스트에 를 지정합니다. 실제로 세션을 만들 때 이 키를 참조합니다. 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-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • 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-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • 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

DVR 세션 만들기

DVR 세션을 만들려면 projects.locations.channels.dvrSessions.create 메서드를 사용합니다.

dvrManifests 배열의 manifestKey 필드를 사용하여 콘텐츠를 저장할 매니페스트를 지정합니다. 이 페이지의 채널 구성 예시에서 이 키는 manifest_hls로 설정되어 있습니다.

dvrWindows 배열에 timeInterval 객체를 추가하여 라이브 스트림의 여러 시간 섹션을 단일 DVR 세션으로 결합할 수 있습니다.

"dvrManifests": [
  {
    "manifestKey": "manifest_hls"
  }
],
"dvrWindows": [
  {
    "timeInterval": {
      "startTime": "2022-07-08T23:03:20.000Z",
      "endTime": "2022-07-08T23:04:20.000Z"
    }
  },
  {
    "timeInterval": {
      "startTime": "2022-07-08T23:05:20.000Z",
      "endTime": "2022-07-08T23:06:20.000Z"
    }
  }
]

다음에 유의하세요.

  • 각 DVR 세션은 dvrWindowstimeInterval를 하나 이상 포함해야 합니다.
  • dvrManifests.manifestKey 필드는 DVR 세션의 상위 채널에 정의된 HLS 매니페스트를 참조해야 합니다. DVR 세션 생성 요청이 성공하면 생성된 DVR 매니페스트의 URI가 dvrManifests.outputUri 필드에 반환됩니다. 이 URI는 채널의 outputUri 필드에 지정된 경로에 있습니다.
  • dvrManifests 배열은 요청당 하나의 매니페스트만 지원합니다. 동일한 DVR 기간에 여러 매니페스트를 생성하려면 매니페스트를 여러 DVR 세션으로 분할해야 합니다.
  • timeInterval 객체 집합은 겹치지 않고 연대순으로 정렬되어야 합니다. startTime은 모든 timeInterval에서 endTime보다 이전이어야 합니다.
  • startTimeendTime는 라이브 스트림 타임라인을 나타냅니다. 매니페스트에 삽입된 타임코드가 사용 설정된 경우 이 타임라인은 입력 스트림에 제공된 삽입된 타임코드를 기반으로 하며 실제 시계와 다를 수 있습니다.
  • DVR 기간의 총 최대 시간은 24시간입니다.
  • dvrWindows의 마지막 timeIntervalendTime는 비워 둘 수 있습니다. 이 경우 DVR 세션 시간 (총 24시간)을 최대화하도록 endTime가 자동으로 계산됩니다.
  • DVR 기간은 미래의 기간을 포함하여 모든 기간을 대상으로 할 수 있습니다. 그러나 향후 시간으로 확장되는 dvrWindows의 DVR 세션 수는 1개로 제한됩니다.
  • 모든 DVR 기간이 엄격히 과거인 DVR 세션 수에는 제한이 없습니다.

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

  • 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-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID: 채널의 사용자 정의 식별자입니다.
  • DVR_SESSION_ID: DVR 세션의 사용자 정의 식별자입니다.
  • INTERVAL_START_TIME: 원래 실시간 스트림 매니페스트의 마크인 Unix epoch 시간. RFC3339 UTC 'Zulu' 형식의 타임스탬프를 사용합니다(예: 2014-10-02T15:01:23Z).
  • INTERVAL_END_TIME: 원래 실시간 스트림 매니페스트의 마크아웃 Unix epoch 시간. RFC3339 UTC 'Zulu' 형식의 타임스탬프를 사용합니다(예: 2014-10-02T15:01:23Z).

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

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

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

DVR 세션 가져오기

DVR 세션을 가져오려면 projects.locations.channels.dvrSessions.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-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID: 채널의 사용자 정의 식별자입니다.
  • DVR_SESSION_ID: DVR 세션의 사용자 정의 식별자입니다.

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

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

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID/dvrSessions/DVR_SESSION_ID",
  "createTime": CREATE_TIME,
  "startTime": START_TIME,
  "updateTime": UPDATE_TIME,
  "state": "SUCCEEDED",
  "dvrManifests": [
    {
      "manifestKey": "manifest_hls",
      "outputUri": "gs://BUCKET_NAME/dvr/DVR_SESSION_ID/main.m3u8"
    }
  ],
  "dvrWindows": [
    {
      "timeInterval": {
        "startTime": "INTERVAL_START_TIME",
        "endTime": "INTERVAL_END_TIME"
      }
    }
  ]
}

응답에는 세션 상태를 나타내는 state 필드가 포함되어야 합니다.

{
  ...
  "state": "PENDING" // DVR session is waiting to be processed (for example, it is waiting for the channel to start)
  ...
}

상태 목록과 설명은 state 참조 문서를 참고하세요.

버킷 콘텐츠 확인

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

  • 채널 구성에 지정된 manifests.fileName과 이름이 같은 DVR 세션의 최상위 매니페스트 (예: main.m3u8) 온라인 미디어 플레이어를 사용하여 이 매니페스트를 재생할 수 있습니다.
  • 채널에 지정된 각 muxStreams.key의 하위 디렉터리 (예: mux_video_ts). 각 하위 디렉터리에는 DVR 세션의 재생목록이 포함됩니다 (예: index-1.m3u8).

DVR 세션 재생

생성된 미디어 파일을 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. 재생을 클릭합니다.

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

패턴 테스트 동영상

광고 시점 이벤트

라이브 스트림에 광고 시점 이벤트를 만든 경우 DVR 세션에는 라이브 스트림에 표시되는 광고 세그먼트가 포함됩니다.