タイムコードを使用してメディア ワークフローをライブ ストリーム コンテンツと同期する

このページでは、タイムコードを使用して Live Stream API でメディア ワークフローをライブ ストリーム コンテンツと同期する方法について説明します。タイムコード機能を使用すると、帯域内データとして提供されるタイムコード入力を再生マニフェストに渡すことができます。その後、内部メディア ワークフローをライブ配信コンテンツと同期できます。たとえば、独立して生成されたメタデータ アノテーションをライブ配信コンテンツと照合したり、内部ブロードキャスト コンテンツを Live Stream API の出力と調整したりできます。

タイムコード データは、SMPTE 12M の仕様に準拠している必要があります(ST 12-2:2008 を参照)。H264 の場合、タイムコード データは画像のタイミングの補足拡張情報(SEI)メッセージに含まれます。H265 の場合、タイムコード データはタイムコードの SEI メッセージに含まれます。

埋め込みのタイムコードを使用する

入力ストリームに埋め込まれたタイムコードを使用するには、次の 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": [
  {
    "key": "manifest_hls",
    "file_name": "manifest.m3u8",
    "type": "HLS",
    "muxStreams": ["mux_720p", "mux_540p"],
    "useTimecodeAsTimeline": true
  },
  {
    "key": "manifest_dash",
    "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 は 4 桁で表した年
  • MM は 2 桁で表した月(03 は 3 月など)
  • DD は 2 桁の日付(01 ~ 31)
  • T は時間要素の開始を示す文字セット
  • hh は 2 桁で表した時間(00 ~ 23、AM/PM は含まれません)
  • mm は 2 桁で表した分(00 ~ 59)
  • ss は 2 桁で表した秒(00 ~ 59)
  • mmm は 3 桁で表したミリ秒(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 は 4 桁で表した年
  • MM は 2 桁で表した月(03 は 3 月など)
  • DD は 2 桁の日付(01 ~ 31)
  • T は時間要素の開始を示す文字セット
  • hh は 2 桁で表した時間(00 ~ 23、AM/PM は含まれません)
  • mm は 2 桁で表した分(00 ~ 59)
  • ss は 2 桁で表した秒(00 ~ 59)
  • mmm は 3 桁で表したミリ秒(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 が UTC の現在の時刻 2021-12-06T21:00:00Z で入力ストリームを受信するとします。次の表に、SEI タイムコードが日時形式に変換される方法を示します。

タイムゾーン 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 時刻より遅くなることはありません。