타임코드를 사용하여 미디어 워크플로를 실시간 스트림 콘텐츠와 동기화

이 페이지에서는 타임코드를 사용하여 Live Stream API의 실시간 스트림 콘텐츠와 미디어 워크플로를 동기화하는 방법을 설명합니다. 타임코드 기능을 사용하면 대역 내 데이터로 제공되는 타임코드 입력을 재생 매니페스트에 전달할 수 있습니다. 그런 다음 내부 미디어 워크플로를 실시간 스트림 콘텐츠와 동기화할 수 있습니다. 예를 들어 독립적으로 생성된 메타데이터 주석을 실시간 스트림 콘텐츠와 일치시키거나 내부 브로드캐스트 콘텐츠를 Live Stream API 출력과 일치시킬 수 있습니다.

타임코드 데이터는 사양 SMPTE 12M을 준수해야 합니다(ST 12-2:2008 참조). H264의 경우 타임코드 데이터는 그림 타이밍 보조 보정 정보(SEI) 메시지로 전송됩니다. H265의 경우 타임코드 데이터는 타임코드 SELinux 메시지로 전달됩니다.

삽입된 타임코드 사용

입력 스트림에 삽입된 타임코드를 사용하려면 다음 timecodeConfigChannel 리소스에 추가합니다.

"timecodeConfig": {
  "source": "EMBEDDED_TIMECODE"
}

source 필드의 기본값은 MEDIA_TIMESTAMP입니다.

기본적으로 UTC 시간대는 시간대를 해석하는 데 사용됩니다. 다른 시간대를 사용하려면 timeZone 또는 utcOffset 필드를 설정합니다.

"timecodeConfig": {
  "source": "EMBEDDED_TIMECODE",

  "timeZone": {"id": "America/Los_Angeles"}
  // or
  "utcOffset": "-28800s" // -8 hours from UTC
}

timeZone 필드를 설정할 때는 일광 절약 시간이 적용됩니다. 자세한 내용은 입력 타임코드 해석 방법을 참조하세요.

출력 매니페스트에 타임코드 포함

각 출력 매니페스트의 타임코드를 포함하도록 useTimecodeAsTimeline 필드를 true로 설정할 수 있습니다.

"manifests": [
  {
    "file_name": "manifest.m3u8",
    "type": "HLS",
    "muxStreams": ["mux_720p", "mux_540p"],
    "useTimecodeAsTimeline": true
  },
  {
    "file_name": "manifest.mpd",
    "type": "DASH",
    "muxStreams": ["mux_720p", "mux_540p"],
    "useTimecodeAsTimeline": true
  }
]

HLS 매니페스트 파일

HLS 실시간 스트림의 경우 타임코드는 미디어 M3U8 매니페스트 파일의 각 세그먼트에 대해 #EXT-X-PROGRAM-DATE-TIME 태그로 내보내고 다음과 유사하게 표시됩니다.

#EXTM3U
#EXT-X-VERSION:7
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-DISCONTINUITY-SEQUENCE:0
#EXT-X-PROGRAM-DATE-TIME:2023-04-21T21:49:25.529Z
#EXTINF:1.265922
720p60_h264_ts-0000000000.ts
#EXT-X-PROGRAM-DATE-TIME:2023-04-21T21:49:26.795Z
#EXTINF:2.000000
720p60_h264_ts-0000000001.ts
#EXT-X-PROGRAM-DATE-TIME:2023-04-21T21:49:28.795Z
#EXTINF:2.000000
720p60_h264_ts-0000000002.ts
#EXT-X-PROGRAM-DATE-TIME:2023-04-21T21:49:30.795Z
#EXTINF:2.000000
720p60_h264_ts-0000000003.ts
#EXT-X-PROGRAM-DATE-TIME:2023-04-21T21:49:32.795Z
#EXTINF:2.000000
720p60_h264_ts-0000000004.ts
#EXT-X-PROGRAM-DATE-TIME:2023-04-21T21:49:34.795Z
#EXTINF:2.000000
720p60_h264_ts-0000000005.ts
#EXT-X-PROGRAM-DATE-TIME:2023-04-21T21:49:36.795Z
#EXTINF:2.000000
720p60_h264_ts-0000000006.ts
#EXT-X-PROGRAM-DATE-TIME:2023-04-21T21:49:38.795Z

#EXT-X-PROGRAM-DATE-TIME에는 ISO8601 형식 YYYY-MM-DDThh:mm:ss[.mmm]TZD에 따라 생성된 타임코드 데이터가 포함됩니다. 각 항목의 의미는 다음과 같습니다.

  • YYYY는 네 자릿수 연도입니다.
  • MM은 두 자릿수 월입니다(예: 03은 3월).
  • DD는 월의 두 자릿수 일입니다(01~31).
  • T는 시간 요소의 시작을 나타내는 집합 문자입니다.
  • hh는 두 자릿수 시간입니다(00~23, AM/PM은 포함되지 않음)
  • mm는 두 자릿수 분입니다(00~59).
  • ss은 두 자릿수 초입니다(00~59).
  • mmm는 세 자릿수 밀리초입니다(000~999).
  • TZD는 시간대 지정자(Z, ±hh:mm)입니다. Z는 UTC를 나타내며 + 또는 - 값은 UTC보다 얼마나 늦거나 빠른지 나타냅니다.

DASH 매니페스트 파일

DASH 실시간 스트림의 경우 MPD 매니페스트 파일의 availabilityStartTime 속성이 초기 타임코드로 설정되며 다음과 유사합니다.

<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" profiles="urn:mpeg:dash:profile:isoff-live:2011"
 type="dynamic" minBufferTime="PT4S" mediaPresentationDuration="PT0H0M473.262S"
 availabilityStartTime="2023-05-19T17:44:16.881Z">

availabilityStartTime에는 ISO8601 형식 YYYY-MM-DDThh:mm:ss[.mmm]TZD에 따라 생성된 타임코드 데이터가 포함됩니다. 각 항목의 의미는 다음과 같습니다.

  • YYYY는 네 자릿수 연도입니다.
  • MM은 두 자릿수 월입니다(예: 03은 3월).
  • DD는 월의 두 자릿수 일입니다(01~31).
  • T는 시간 요소의 시작을 나타내는 집합 문자입니다.
  • hh는 두 자릿수 시간입니다(00~23, AM/PM은 포함되지 않음)
  • mm는 두 자릿수 분입니다(00~59).
  • ss은 두 자릿수 초입니다(00~59).
  • mmm는 세 자릿수 밀리초입니다(000~999).
  • TZD는 시간대 지정자(Z, ±hh:mm)입니다. Z는 UTC를 나타내며 + 또는 - 값은 UTC보다 얼마나 늦거나 빠른지 나타냅니다.

타임코드 데이터 파싱 방법

삽입된 타임코드는 첫 번째 동영상 프레임에서 파싱됩니다. 출력 미디어 타임스탬프는 이후에 프레임 단위로 확장됩니다. 입력 스트림이 연결 해제되고 다시 연결될 때까지 입력과 출력 시간 간에 재동기화가 발생하지 않습니다.

동영상의 타임스탬프가 타임스탬프에서 생성된 타임스탬프로 대체되므로 채널 이벤트가 지정된 시간에 올바르게 실행되도록 타임코드 시계를 따라야 합니다.

프로덕션 파이프라인의 타임코드 생성기가 동일하거나 기본 및 백업 기여 인코더 모두에 잠겨있으면 중복 스트림에 타이밍을 정렬할 수 있습니다(출력 잠금이란 무엇인가요? 동영상 참조).

입력 타임코드 해석 방법

사진 타이밍 SEI 메시지의 타임코드에는 시간만(16:30:00;10) 포함됩니다. 출력 매니페스트에 타임코드를 포함하려면 날짜 및 시간이 모두 필요합니다(예: 전체 날짜/시간(2021-12-06T16:30:00.333Z) 또는 에포크 시간(1638837000333))

SEI 시간 코드를 날짜/시간 형식으로 해석하면 Live Stream API는 항상 수신 입력 스트림이 실시간 또는 실시간에 있다고 가정합니다. Live Stream API는 채널의 timecodeConfig에 지정된 시간대를 사용하여 SEI 시간 코드를 현재 시간과 최대한 가깝지만 늦지 않은 것으로 해석합니다.

예를 들어 Live Stream API가 2021-12-06T21:00:00Z의 현재 시간(UTC)에 입력 스트림을 수신한다고 가정해 보겠습니다. 다음 표에서는 SELinux 코드가 datetime 형식으로 변환되는 방법을 보여줍니다.

시간대 ID SEI 타임코드 현지 시간으로 해석됨 UTC와 같이 해석됨
UTC 16:30:00;10 2021-12-06T16:30:00.333+00:00 2021-12-06T16:30:00.333Z
America/Los_Angeles 16:30:00;10 2021-12-05T16:30:00.333-08:00 2021-12-06T00:30:00.333Z
America/New_York 16:30:00;10 2021-12-05T16:30:00.333-05:00 2021-12-05T21:30:00.333Z
Asia/Bangkok 16:30:00;10 2021-12-06T16:30:00.333+07:00 2021-12-06T09:30:00.333Z
America/Los_Angeles 03:30:00;10 2021-12-06T03:30:00.333-08:00 2021-12-06T11:30:00.333Z
Asia/Bangkok 03:30:00;10 2021-12-07T03:30:00.333+07:00 2021-12-06T20:30:00.333Z

해석된 시간은 2021-12-06T21:00:00Z의 현재 UTC 시간보다 늦지 않습니다.