ユーザーガイド(User Guide)

チャンネル(Channels)

チャンネルの作成(Channel creation)

一般的に、Virtual Channel のワークフローは、 PUT /channels/{channel} エンドポイントを使用してチャンネルを作成することから始まります。このリクエストを生成するには、次の2つが必要です。

  • チャンネル名を決めて、その名前を使ってPUTするURLを作る必要があります。(つまり、 rock_concert という名前のチャンネルを作る場合は、http://localhost:8000/channels/rock_concert とPUTします。)

  • 適切なSMILプレイリストを application/xml リクエストボディとして提供する必要があります。(SMIL作成の詳細は SMILの作成(SMIL creation) を参照してください)。

選択したチャンネル名は、再生URLに反映されます。例えば、前述の rock_concert という名前の場合、再生URLは http://localhost/rock_concert.isml で利用可能になります。

Note

従来のOrigin設定とは異なり、 http://localhost/rock_concert.isml の再生URLは、対応するサーバーマニフェストファイルの名前がディスク上で rock_concert.isml であることを意味しません。代わりに、チャンネル作成時にSMILプレイリストの全内容に基づいてUUIDが生成され、そのUUIDがサーバーマニフェストのファイル名として使用されます。

ライブチャンネルの作成は、時間のかかる操作となることがあります。そのため、PUT 操作が返された後、実際のチャンネル作成はVirtual Channelがスケジュールしたバックグラウンドジョブによって実行されることを理解しておくことが重要です。

つまり、PUT 操作は新しいチャンネルを即座に作成するものではなく、エラーなくチャンネルが作成されることを保証するものでもありません。チャンネル作成ジョブが終了するまでには、プレイリストの複雑さやネットワーク速度などのさまざまな要因に応じて、処理に時間がかかる場合があります。

チャンネルがライブであるかを確認するためには、チャンネル作成のステータスを確認する必要があります。

Note

一度特定のプレイリストを使用してチャンネルを作成すると、同じプレイリストを使用する以降のチャンネル作成にかかる時間はほとんど瞬時になります。実際、同じSMILプレイリストを使用するすべてのチャンネルは、関連するismlサーバーマニフェストやメディアセグメントを完全に再利用します。

チャンネル作成ジョブのステータスを確認する(Checking channel creation job status)

ユーザーは、 GET /channels/{channel}/status エンドポイントを使用して、いつでもチャンネルのステータスを監視できます。考えられるステータスは以下の通りです。

  • Pending: あなたのチャンネルは近々作成される予定です。この時点では、チャンネルの変更は許可されません。

  • In Progress: チャンネルを作成するジョブがまだ実行中です。ステータスエンドポイントにより、追加の詳細が提供されます。この時点では、チャンネルの変更は許可されません。

  • Success: ジョブが成功し、チャンネルがライブであり、関連するプレイアウトURLでアクセス可能です。

  • Failed: エラーのため、チャンネルが作成されませんでした。この場合、 remix および mp4split コマンドの結果に関する詳細が含まれるタスクのログを取得できるAPIエンドポイントを参照してください。

チャンネルが Success ステータスに達すると、ステータスエンドポイントで提供される対応する origin_url で再生が可能になります。

ステータスが Pending または In Progress の場合は、システムがジョブの実行を完了するまで待つ必要があります。

ステータスが Failed の場合は、プレイリスト処理中に問題が発生したことを意味します。この場合は、専用のエンドポイントを使用してremixやmp4splitのログを確認する必要があります。

チャンネルの修正/変更(Amending/modifying channels)

チャンネルのステータスが「Success」または「Failure」の場合、別の PUT 操作(通常は変更されたSMILプレイリストを使用)を実行すると、既存のチャンネルが上書きされます。

Note

➡️ このエンドポイントはチャンネルの“トランジション”を行うためのものではありません! これは主に、特定のプレイリストで作成されたものの、まだ再生が開始されていないチャンネルを“上書きして忘れる”ために使われます。実際、すでに再生が開始されたチャンネルに対して PUT を試みても失敗します。

チャンネルの一覧表示と削除(Listing and deleting channels)

/channel エンドポイントで既存のチャンネルのリストを取得できます。

チャンネルを削除するには、 DELETE 操作を実行します。これは、チャンネル作成ジョブが Success または Failed ステータスのいずれかである場合にのみ許可されます。

Warning

この DELETE 操作は何もチェックを行わず、すでに再生中のチャンネルも削除します。

トランジション(Transitions)

一つ以上のチャンネルを作成した後は、トランジションを追加する手順に進むことができます。

トランジションを使用すると、実行中のバーチャルチャンネルをシームレスに更新し、新しいVOD2Liveプレイリストや外部のライブソースに切り替えることができます。VOD2Liveプレイリストに切り替える際には、プレイリストを最初から開始するか、すでに再生中のプレイリストに途中から切り替えることが可能です。

これらのオプションにより、チャンネルを必要に応じて柔軟に運用することができます。

VOD2Liveプレイリストやライブソースなど、Virtual Channelの出力がどのようにソースに対応するかを視覚的に示す例については、以下の図を参照してください。

この図は、VOD2LiveプレイリストAで開始し、一定期間ライブソースXに切り替えた後、新しいVOD2LiveプレイリストBに切り替えるVirtual Channelを示しています。

Virtual Channelがライブソースに移行し、その後新しいVOD2Liveプレイリストに切り替わる Virtual Channel transitioning to live source then new VOD2Live

この例は、Virtual ChannelがVOD2LiveプレイリストAで開始し、一定期間ライブソースXに切り替えた後、再び同じVOD2LiveプレイリストAに戻る様子を示しています。この場合、プレイリストA内のライブソース用の時間枠には、切り替えが期待通りに動作するようにフィラーコンテンツを含める必要があります。

Virtual Channelがライブソースに移行し、その後既存のVOD2Liveプレイリストに戻る Virtual Channel transitioning to live source then back to the existing VOD2Live playlist

トランジションの作成(Transition creation)

既存のチャンネルを指定された日時に現在のプレイリストから別のプレイリストへ“トランジション”させることが、専用エンドポイント PUT /channels/{channel}/transitions/{transition} を使用して可能です。この操作はチャンネル作成時と似ており、次の2つが必要です。

  • 「トランジション」を行いたいチャンネルの名前と、トランジションを行いたい時間を知っていること。この情報は、 PUT を実行するURLを形成するために使用されます。(例: rock_concert イベントを別のプレイリストに 2022-07-18T20:00:00Z に遷移させる場合、PUT するURLは http://localhost:8000/channels/rock_concert/2022-07-18T20:00:00Z になります)

  • チャンネルがトランジションする内容を記述した適切なSMILプレイリストを application/xml リクエストボディとして提供すること(SMIL作成に関する指示は SMILの作成(SMIL creation) を参照してください)。

Warning

トランジションの時間は常にUTCで表記し、許可されている2つの時間形式 2022-04-14T06:00:00Z または 2022-04-14T06:00:00.000Z のいずれかを使用してください。

チャンネルの場合と同様に、トランジションの作成も時間のかかる操作となり、バックグラウンドで実行されます。そのため、このエンドポイントを使用した後は、必ずトランジション作成のステータスを確認するようにしてください。

Note

一度特定のプレイリストを使用してトランジションを作成すると、同じプレイリストを使用する以降のトランジション作成にかかる時間はほとんど瞬時になります。実際、同じSMILプレイリストを使用するすべてのトランジションは、関連するismlサーバーマニフェストやメディアセグメントを完全に再利用します。

トランジション作成エンドポイントは、以下の条件が満たされない場合、即座にエラーを返します:

  • 提供されたトランジション時間がSMILプレイリスト内で指定された vod2live_start_time よりも早い場合、トランジションは拒否されます。そのようなトランジションを許可すると、まだ開始されていないプレゼンテーションに切り替えることを意味し、プレゼンテーションにギャップが生じるため、常にエラーと見なされます。

  • トランジション時間が過去である場合、トランジションは拒否されます。こうしたトランジションを許可すると、すでにチャンネル再生を開始しているプレイヤーがすべて破損する可能性があります。

これらのチェックをスキップする必要があると理解しており、その結果を把握している場合は、APIエンドポイントに ?force クエリパラメータを追加することで強制的にチェックを無効化できます。

トランジション作成ジョブのステータスを確認する(Checking transition creation job status)

ユーザーとして、いつでも GET /channels/{channel}/transitions/{transition}/status エンドポイントを使用して、トランジション作成ジョブのステータスを監視できます。可能なステータスは次のとおりです:

  • Pending : 設定中のトランジションはまもなく作成される予定です。この時点では、チャンネルまたはトランジションに変更を加えることはできません。

  • In Progress : トランジションを作成するジョブがまだ実行中です。statusエンドポイントにより、追加の詳細が提供されます。この時点では、トランジションに変更を加えることはできません。

  • Success : ジョブが成功し、トランジションがアクティブになりました。予定された時間にチャンネルは提供されたプレイリストに切り替わります。

  • Failed : エラーのため、トランジションが作成されませんでした。この場合、 remix および mp4split コマンドの結果に関する詳細が含まれるタスクのログを取得できるAPIエンドポイントを参照してください。チャンネルに変更は加えられていません。

ステータスが Pending または In Progress の場合は、システムがジョブの実行を完了するまで待つ必要があります。

ステータスが Failed の場合は、プレイリスト処理中に問題が発生したことを意味し、専用のエンドポイントを使用してremixまたはmp4splitのログを確認する必要があります。

remixとmp4splitのステップが成功したとしても、処理に時間がかかりすぎた場合、ジョブは失敗することがあります。実際、動作するismlが生成された後、Virtual Channelはスケジュールされたトランジション時間が過ぎていないかを確認します。もし過ぎている場合、そのジョブは中止されたと見なされます。このようなトランジションを許可すると、すでにチャンネル再生を開始しているプレイヤーがすべて破損する恐れがあります。

Warning

If the transition was created using the ?force parameter (see previous section), the above check will be skipped.

トランジションのの修正/変更(Amending/modifying transitions)

トランジションのステータスが“Success”または“Failure”の場合、別のPUT操作(通常は変更されたSMILプレイリストを使用)を実行すると、既存のトランジションが上書きされます。

Warning

このエンドポイントは、スケジュールされているがまだアクティブでないトランジション(つまり、トランジション時間が未来の場合)を変更・上書きするためのものです。トランジションがアクティブである場合(つまり、トランジション時間が過去の場合)、このエンドポイントは失敗し、チャンネルに対して変更は行われません。現在、チャンネルで再生中のプレイリストを変更したい場合は、将来のとある時点に新しいトランジションを作成することが正しい対応です。

トランジションのの一覧表示と削除(Listing and deleting transitions)

特定のチャンネルにおける既存のトランジションのリストは、 /channels/{channel}/transitions エンドポイントを使用して取得できます。このエンドポイントは、これまでに登録された各トランジションごとに、ジョブのステータスや関連するSMILの詳細を含むデータ形式で結果を返します。

登録に成功したトランジション(実際にチャンネルに影響を与えるもの)のみを取得したい場合は、クエリパラメータを使用して結果をフィルタリングできます。例: /channels/{channel}/transitions?status=Success 。同様に、失敗したトランジションジョブをフィルタリングする場合は、 /channels/{channel}/transitions?status=Failed を使用します。

このエンドポイントでは、時間ベースのクエリもサポートされています。特定のチャンネルにおける指定された期間内のトランジションリストを取得する必要がある場合は、 beginend クエリパラメータを使用して行うことができます。例:

GET /channels/{channel}/transitions?begin=2022-10-21T07:03:41Z&end=2022-10-22T07:03:41Z

いつものように、ISO-8601形式のUTC時間の表記が必要です。

To remove a transition, perform a DELETE operation. This will be allowed only if the transition creation job is in either one of the Success or Failed statuses. トランジションを削除するには、 DELETE 操作を実行します。この操作は、トランジション作成ジョブが Success または Failed のいずれかのステータスにある場合にのみ許可されます。

Warning

DELETE 操作はチェックを一切行わず、過去にあたるトランジション開始時間のアクティブなトランジションも正常に削除します。この場合、削除対象のプレイリストに関連したコンテンツを再生中のデバイスやプレイヤーは再生を停止し、ハング状態になります。ただし、ベースとなるチャンネルは引き続き動作し、削除されたトランジションより前のコンテンツやベースチャンネルの内容に“戻り”ます。

Note

古い未使用のトランジションの自動削除は、Virtual Channel で元々有効になっていることを忘れないでください(詳細は 自動トランジション削除(Automatic transition deletion) を参照)。そのため、一定の期間後(デフォルトでは7日後)にトランジションが自動的に削除される場合があります。

SMILの作成(SMIL creation)

SMILプレイリストは、Virtual Channelで次の目的のために使用される基本的な手段です。

  • チャンネルやトランジションのコンテンツを指定する(通常は <body> セクションで行われます)

  • チャンネルやトランジション作成時にremix/mp4splitへのオプションを渡す(通常は <head> セクションで行われます)

この目的のために、2種類のSMILプレイリストが存在します:

  • VOD2Live SMILプレイリスト:これは、Unified Remix-VOD2Liveを既に使用している場合に馴染みのあるプレイリストです。既存のVODアセットとタイムメタデータをつなぎ合わせてコンテンツを定義し、チャンネルやトランジション作成時にRemix/mp4splitへのオプションを渡すことができます。

  • LIVE SMILプレイリスト:はるかにシンプルで、コンテンツのつなぎ合わせ自体はできませんが、既存の外部Origin Liveソースをバーチャルチャンネルに追加するために使用されます。

それぞれについて、以下のセクションで詳しく説明します。

VOD2Live SMIL

VOD2Liveプレイリストの場合、2つの必須オプション、 vod2livevod2live_start_time を持つ <head> セクションが必要です。

<head> 内では、追加のOrigin出力設定オプションも設定できます。どのようにフォーマットされるかを確認するには、mp4splitを使用して次のように例の.ismlファイルを生成してみてください: mp4split -o stdout:.isml --hls.client_manifest_version=5

以下に、例を示します: VOD2Live Smil:

<?xml version='1.0' encoding='UTF-8'?>
<smil xmlns="http://www.w3.org/2001/SMIL20/Language">
  <head>
    <meta name="vod2live" content="true" />
    <meta name="vod2live_start_time" content="2022-04-14T06:00:00Z" />
    <meta name="hls_client_manifest_version" content="5" />
    <meta name="hls_minimum_fragment_length" content="48/25" />
    <meta name="mpd_minimum_fragment_length" content="48/25" />
    <meta name="mpd_segment_template" content="time" />
    <meta name="timed_metadata" content="true" />
    <meta name="splice_media" content="true" />
  </head>
  <body>
    <seq>
      <par clipEnd="wallclock(1970-01-01T00:00:44.160Z)">
        <audio src="https://usp-vod2live.s3.amazonaws.com/Promo_Learning-aac-128k.mp4"/>
        <video src="https://usp-vod2live.s3.amazonaws.com/Promo_Learning-avc1-400k.mp4"/>
        <video src="https://usp-vod2live.s3.amazonaws.com/Promo_Learning-avc1-750k.mp4"/>
        <video src="https://usp-vod2live.s3.amazonaws.com/Promo_Learning-avc1-1000k.mp4"/>
        <video src="https://usp-vod2live.s3.amazonaws.com/Promo_Learning-avc1-1500k.mp4"/>
      </par>
    </seq>
  </body>
</smil>

Warning

You can use the provided example for your tests, because it is based on media stored on a publicly accessible s3 bucket. As such though, it will only work if you have not set any S3 authentication environmental variables. この提供された例は、公開アクセス可能なS3バケットに格納されたメディアに基づいているため、テストに使用できます。ただし、S3認証用の環境変数を 設定していない場合にのみ 動作します。

希望するチャンネルの開始時間は、ISO-8601日付時刻形式を守り、UTCで時間を表現することで設定できます。vod2live の値は true のままにしておく必要があります。

有効なSMILプレイリストの追加例は、Virtual Channelのリポジトリ内の example folder で確認できます。

広告挿入のためのSCTE 35(SCTE 35 for ad insertion)

Due to the flexibility of both SCTE 35 and DASH EventStreams there are many options for scheduling SCTE 35 events to enable ad insertion in Virtual Channel, but the most straightforward and recommended method is to schedule separate cue out and cue in events on the first element of the break and the return to main content respectively. SCTE 35とDASH EventStreamsの柔軟性により、Virtual Channelで広告挿入を有効にするためのSCTE 35イベントをスケジュールするオプションは多岐にわたりますが、最もシンプルで推奨される方法は、ブレイクの開始時(広告が再生される部分の最初のポイント時)にキューアウトイベント、メインコンテンツへの復帰時にキューインイベントをそれぞれスケジュールすることです。

SMILプレイリスト内のDASHイベントでイベントの長さを設定せずにこれらのイベントをスケジュールすると、Virtual Channelは実際の期間を計算し、すべてが適切に出力されるようにします。

spliceEventId 1001と1002の2つのブレイク用の2つのSCTE 35イベントを持つ例を示します。

<?xml version='1.0' encoding='UTF-8'?>
<smil xmlns="http://www.w3.org/2001/SMIL20/Language">
  <!--
    Example playlist with SCTE 35 cues to signal ad breaks
  -->
  <head>
    <meta name="vod2live" content="true"/>
    <meta name="vod2live_start_time" content="2023-01-01T00:00:00Z"/>
    <meta name="hls_client_manifest_version" content="5"/>
    <meta name="dvr_window_length" content="600"/>
    <meta name="timed_metadata" content="true"/>
    <meta name="splice_media" content="true"/>
  </head>
  <body>
    <seq>
      <par>
        <!-- Start of ad break CUE OUT - SCTE 35 event ID 1001 -->
        <video src="http://s3.internal.unified-streaming.com/vod2live/Unified_Astronaut_A_v2-avc1-400k.mp4"/>
        <video src="http://s3.internal.unified-streaming.com/vod2live/Unified_Astronaut_A_v2-avc1-750k.mp4"/>
        <video src="http://s3.internal.unified-streaming.com/vod2live/Unified_Astronaut_A_v2-avc1-1000k.mp4"/>
        <video src="http://s3.internal.unified-streaming.com/vod2live/Unified_Astronaut_A_v2-avc1-1500k.mp4"/>
        <video src="http://s3.internal.unified-streaming.com/vod2live/Unified_Astronaut_A_v2-avc1-2200k.mp4"/>
        <video src="http://s3.internal.unified-streaming.com/vod2live/Unified_Astronaut_A_v2-aac-128k.mp4"/>
        <EventStream xmlns="urn:mpeg:dash:schema:mpd:2011" schemeIdUri="urn:scte:scte35:2014:xml+bin">
          <Event id="1">
            <Signal xmlns="http://www.scte.org/schemas/35/2016">
              <SpliceInfoSection>
                <SpliceInsert spliceEventId="1001" outOfNetworkIndicator="1" spliceImmediateFlag="1">
                  <Program/>
                </SpliceInsert>
              </SpliceInfoSection>
            </Signal>
          </Event>
        </EventStream>
      </par>
      <par>
        <video src="http://s3.internal.unified-streaming.com/vod2live/Toothpaste_Glitch_v2-avc1-400k.mp4"/>
        <video src="http://s3.internal.unified-streaming.com/vod2live/Toothpaste_Glitch_v2-avc1-750k.mp4"/>
        <video src="http://s3.internal.unified-streaming.com/vod2live/Toothpaste_Glitch_v2-avc1-1000k.mp4"/>
        <video src="http://s3.internal.unified-streaming.com/vod2live/Toothpaste_Glitch_v2-avc1-1500k.mp4"/>
        <video src="http://s3.internal.unified-streaming.com/vod2live/Toothpaste_Glitch_v2-avc1-2200k.mp4"/>
        <video src="http://s3.internal.unified-streaming.com/vod2live/Toothpaste_Glitch_v2-aac-128k.mp4"/>
      </par>
      <par clipEnd="wallclock(1970-01-01T00:01:00Z)" >
        <!-- End of ad break CUE IN - SCTE 35 event ID 1001 -->
        <video src="http://s3.internal.unified-streaming.com/vod2live/What_is_SCTE35_Jamie-avc1-400k.mp4"/>
        <video src="http://s3.internal.unified-streaming.com/vod2live/What_is_SCTE35_Jamie-avc1-750k.mp4"/>
        <video src="http://s3.internal.unified-streaming.com/vod2live/What_is_SCTE35_Jamie-avc1-1000k.mp4"/>
        <video src="http://s3.internal.unified-streaming.com/vod2live/What_is_SCTE35_Jamie-avc1-1500k.mp4"/>
        <video src="http://s3.internal.unified-streaming.com/vod2live/What_is_SCTE35_Jamie-avc1-2200k.mp4"/>
        <video src="http://s3.internal.unified-streaming.com/vod2live/What_is_SCTE35_Jamie-aac-128k.mp4"/>
        <video src="http://s3.internal.unified-streaming.com/vod2live/What_is_SCTE35_Jamie.ismt"/>
        <EventStream xmlns="urn:mpeg:dash:schema:mpd:2011" schemeIdUri="urn:scte:scte35:2014:xml+bin">
          <Event id="2">
            <Signal xmlns="http://www.scte.org/schemas/35/2016">
              <SpliceInfoSection>
                <SpliceInsert spliceEventId="1001" outOfNetworkIndicator="0" spliceImmediateFlag="1">
                  <Program/>
                </SpliceInsert>
              </SpliceInfoSection>
            </Signal>
          </Event>
        </EventStream>
      </par>
      <par>
        <!-- Start of ad break CUE OUT - SCTE 35 event ID 1002 -->
        <video src="http://s3.internal.unified-streaming.com/vod2live/Cycle_Unified_v2-avc1-400k.mp4"/>
        <video src="http://s3.internal.unified-streaming.com/vod2live/Cycle_Unified_v2-avc1-750k.mp4"/>
        <video src="http://s3.internal.unified-streaming.com/vod2live/Cycle_Unified_v2-avc1-1000k.mp4"/>
        <video src="http://s3.internal.unified-streaming.com/vod2live/Cycle_Unified_v2-avc1-1500k.mp4"/>
        <video src="http://s3.internal.unified-streaming.com/vod2live/Cycle_Unified_v2-avc1-2200k.mp4"/>
        <video src="http://s3.internal.unified-streaming.com/vod2live/Cycle_Unified_v2-aac-128k.mp4"/>
        <EventStream xmlns="urn:mpeg:dash:schema:mpd:2011" schemeIdUri="urn:scte:scte35:2014:xml+bin">
          <Event id="3">
            <Signal xmlns="http://www.scte.org/schemas/35/2016">
              <SpliceInfoSection>
                <SpliceInsert spliceEventId="1002" outOfNetworkIndicator="1" spliceImmediateFlag="1">
                  <Program/>
                </SpliceInsert>
              </SpliceInfoSection>
            </Signal>
          </Event>
        </EventStream>
      </par>
      <par>
        <video src="http://s3.internal.unified-streaming.com/vod2live/Unified_Astronaut_A_v2-avc1-400k.mp4"/>
        <video src="http://s3.internal.unified-streaming.com/vod2live/Unified_Astronaut_A_v2-avc1-750k.mp4"/>
        <video src="http://s3.internal.unified-streaming.com/vod2live/Unified_Astronaut_A_v2-avc1-1000k.mp4"/>
        <video src="http://s3.internal.unified-streaming.com/vod2live/Unified_Astronaut_A_v2-avc1-1500k.mp4"/>
        <video src="http://s3.internal.unified-streaming.com/vod2live/Unified_Astronaut_A_v2-avc1-2200k.mp4"/>
        <video src="http://s3.internal.unified-streaming.com/vod2live/Unified_Astronaut_A_v2-aac-128k.mp4"/>
      </par>
      <par clipEnd="wallclock(1970-01-01T00:01:00Z)">
        <!-- End of ad break CUE IN - SCTE 35 event ID 1002 -->
        <video src="http://s3.internal.unified-streaming.com/vod2live/ManifestEdit_Lightboard_V4_Linzi-avc1-400k.mp4"/>
        <video src="http://s3.internal.unified-streaming.com/vod2live/ManifestEdit_Lightboard_V4_Linzi-avc1-750k.mp4"/>
        <video src="http://s3.internal.unified-streaming.com/vod2live/ManifestEdit_Lightboard_V4_Linzi-avc1-1000k.mp4"/>
        <video src="http://s3.internal.unified-streaming.com/vod2live/ManifestEdit_Lightboard_V4_Linzi-avc1-1500k.mp4"/>
        <video src="http://s3.internal.unified-streaming.com/vod2live/ManifestEdit_Lightboard_V4_Linzi-avc1-2200k.mp4"/>
        <video src="http://s3.internal.unified-streaming.com/vod2live/ManifestEdit_Lightboard_V4_Linzi-aac-128k.mp4"/>
        <video src="http://s3.internal.unified-streaming.com/vod2live/ManifestEdit_Lightboard_V4_Linzi.ismt"/>
        <EventStream xmlns="urn:mpeg:dash:schema:mpd:2011" schemeIdUri="urn:scte:scte35:2014:xml+bin">
          <Event id="4">
            <Signal xmlns="http://www.scte.org/schemas/35/2016">
              <SpliceInfoSection>
                <SpliceInsert spliceEventId="1002" outOfNetworkIndicator="0" spliceImmediateFlag="1">
                  <Program/>
                </SpliceInsert>
              </SpliceInfoSection>
            </Signal>
          </Event>
        </EventStream>
      </par>
    </seq>
  </body>
</smil>

ライブ配信用SMIL(Live SMIL)

ライブプレイリストの場合、空の``<body>`` と、2つの必須オプション、live_source と``dvr_window_length`` を持つ``<head>`` セクションが必要です。

In HLS ad insertion use cases it's also important to set two additional options to ensure that media segmentation and segment duration is signalled correctly. These options are hls_minimum_fragment_length and splice_media, they should be set to the same values used in the source live stream.

HLS広告挿入のユースケースでは、メディアのセグメンテーションとセグメントの長さが正しくシグナリングされるようにするために、2つの追加のオプション、 hls_minimum_fragment_lengthsplice_media を設定することも重要です。これらのオプションは、ソースライブストリームで使用されている値と同じ値に設定する必要があります。

以下に例があります: Live Smil

<?xml version='1.0' encoding='UTF-8'?>
<smil xmlns="http://www.w3.org/2001/SMIL20/Language">
  <head>
    <meta name="live_source" content="https://demo.unified-streaming.com/k8s/vc-perm-live-source/trunk/colourbars/colourbars.isml" />
    <meta name="dvr_window_length" content="30" />
    <meta name="hls_minimum_fragment_length" content="48/25" />
    <meta name="splice_media" content="true" />
  </head>
  <body/>
</smil>

Notice that live_source must refer to an existing Live Origin instance and that dvr_window_length is expressed in seconds.

A live SMIL must only refer to one existing live source, i.e. it is not possible to "stitch" multiple live sources together in a single playlist. For this purpose, you will have to use multiple Live playlists and use transitions.

live_source は実在するライブOriginインスタンスを参照する必要があり、dvr_window_length は秒単位で表されます。

ライブSMILは1つの既存のライブソースのみを参照する必要があります。つまり、1つのプレイリストで複数のライブソースを“つなぎ合わせる”ことはできません。この目的のためには、複数のライブプレイリストを使用し、トランジションを用いる必要があります。

ライブソースの遅延の処理(Handling live source latency)

OriginからのVOD2Live出力は、サーバーのウォールクロック時間を使用して視聴者が再生できる最新のポイントである“ライブエッジ”を決定します。ただし、コンテンツが制作元からストリーミングプラットフォームに送られる過程(寄与)やエンコードによる遅延がある場合、ライブソースに切り替える際にプレイヤーがバッファリングしたり再生が停止したりすることがあります。

このライブストリームの遅延に対応するために、チャンネルのVOD2Live出力全体を遅らせるオプションが提供されています。

この設定はチャンネルごとに行われます。異なるチャンネルは、それぞれ異なる遅延を持つライブソースを使用する可能性があるためです。

ライブストリームの遅延を見つける(Find your live stream latency)

You can use the /archive or /statistics endpoints on your live stream to check approximately how much latency there is on the stream itself. We do not need to check any latency added downstream of the Origin by CDN or player, as that does not impact the Virtual Channel transitioning process.

For example, checking the latency of one of our test live streams:

ライブストリームの遅延をおおよそ確認するには、/archive または /statistics エンドポイントを使用できます。CDNやプレイヤーによってOrigin以降に追加される遅延は、Virtual Channelのトランジションプロセスには影響を与えないため、確認する必要はありません。

例えば、テストライブストリームの遅延を確認する場合:

#!/bin/bash

curl --silent https://demo.unified-streaming.com/k8s/vc-perm-live-source/trunk/colourbars/colourbars.isml/archive | grep -E "content|end"

次のように見えるはずです:

content="2022-11-22T16:37:13.335659Z">
<c start="2022-11-22T14:00:00Z" end="2022-11-22T16:37:03.360000Z" />
<c start="2022-11-22T14:00:00Z" end="2022-11-22T16:37:03.360000Z" />
<c start="2022-11-22T14:00:00Z" end="2022-11-22T16:37:03.360000Z" />
<c start="2022-11-22T14:00:00Z" end="2022-11-22T16:37:03.360000Z" />
<c start="2022-11-22T14:00:00Z" end="2022-11-22T16:37:03.360000Z" />

この例では、リクエストが16:37:13に行われ、すべてのメディアストリームのライブエッジが16:37:03であるため、エンコード遅延は約10秒です。

VOD2Live遅延の設定(Set a VOD2Live delay)

APIを使用して、チャンネルのすべてのVOD2Live出力に適用される遅延を設定できます。これを行うには、遅延させる秒数を整数で指定し、/channels/{channel_name}/delay エンドポイントに PUT します。

例えば:

#!/bin/bash

curl -X PUT -d 10 http://localhost:8000/channels/test_channel/delay

APIは設定された遅延を返します:

{"delay":10}

同じエンドポイントで GET メソッドを使用してチャンネルの遅延を取得したり、DELETE メソッドを使用して遅延を解除することもできます。

コンテンツの一致(Content matching)

HLSでは、ストリーム中にABR(アダプティブビットレート)ラダー、トラック、エンコードプロファイルを変更することは一切許可されていません。DASHは技術的には許可されていますが、実際には信頼性が低いです。

そのため、Virtual Channelで使用するすべてのコンテンツをできるだけ一致させることが重要です。

通常のエンコーダーのばらつきや、タイトルごとに意図的に行われるパータイトルエンコードが原因で、VODコンテンツに違いが生じ、一致させるのが難しくなることがあります。

しかし、Virtual ChannelがUnified Remixを使用してVODプレイリストを処理する方法により、希望する出力プロファイルを指定し、各ソースメディアから最適なトラックを選択することが可能です。

Remixは、ソースメディアに基づいて最適なトラックを見つけるために特定のアルゴリズムを用いて判断します。最良の出力を得るためには、トラックがかなり似ていることが最適です。たとえば、単一の30MBit 4KビデオトラックをフルABRラダーを使用して他のコンテンツに一致させることは、望ましいクライアントエクスペリエンスを提供する可能性が低いです。

デフォルトでは、一致は、任意のSMILプレイリストの最初のエントリをターゲットプロファイルとして使用して行われますが、最良の方法は、別途目標プロファイルを定義し、それに一致するようにすべてのプレイリストを処理することです。

ライブソースを使用している場合、これを行う最良の方法は、ライブストリームから短いクリップをキャプチャして、それをターゲットプロファイルとして使用することです。

それ以外の場合は、希望するプロファイルで短いクリップをエンコードして参照として使用します。

ターゲットプロファイルの設定(Setting a target profile)

SMILプレイリストのhead内で outputDescription メタ要素を設定し、希望するターゲットプロファイルのISOBMFFファイルへのURLを指定してください。

For example:

<?xml version='1.0' encoding='UTF-8'?>
<smil xmlns="http://www.w3.org/2001/SMIL20/Language">
  <head>
    <meta name="outputDescription"
      content="https://usp-vod2live.s3.amazonaws.com/Promo_Learning-ad-dref.mp4" />
      ...
  </head>
  <body>
    ...
  </body>
</smil>

制限事項(Limitations)

現時点では、Limitations, Scaling, Caching and DRM の章で述べられているVOD2Liveの制限は、Virtual ChannelのVOD2Liveプレイリストにも適用されます。

VOD2LiveプレイリストにSCTE35イベントが含まれていて、トランジションを使用している場合は、SCTE35機会がプログラムされている時間にトランジションをスケジュールしないよう、手動で調整する必要があります。つまり、「CUE-OUT」イベントの後にトランジションが発生すると、それに対応する「CUE-IN」イベントが失われることになり、下流で予期しない動作を引き起こす可能性があります。

DRM保護(DRM protection)

DRM protection and VOD2Live で説明されているように、DRMの使用が可能です。

マニフェスト編集パイプライン(Manifest Edit pipelines)

Virtual Channelには「Manifest Edit」の機能が統合されています。これに慣れていない場合は、Manifest Edit の章を読むことをお勧めします。そこには、一般的な説明や独自のパイプライン構成ファイルを作成するための詳細な手順、さらに例が記載されています。

簡単に言うと、「Manifest Edit」は、Plugins Library から1つ以上のプラグインを組み合わせて編集したパイプラインを適用することで、DASHとHLSのマニフェストのカスタマイズバージョンを作成することができます。

ユーザーは、yamlパイプライン構成ファイルを使用して編集パイプラインを定義します。Originで使用されるのと同じパイプライン構成ファイルを、変更せずにVirtual Channelでも使用できます。

Virtual ChannelのAPIには、チャンネルのマニフェストURIにパイプライン構成ファイル(およびそれによってマニフェスト編集ユースケース)を関連付けるための特定のエンドポイントが含まれています。

The simplest possibility is to associate a pipeline to the "default" channel's manifest URI (e.g. [...]/channel.isml/.mpd for DASH or [...]/channel.isml/.m3u8 for HLS). In this case, the channel's manifest will always be modified by the Use Case specified by the pipeline.

最も簡単な可能性は、パイプラインを「デフォルト」チャンネルのマニフェストURI(たとえば、DASHの場合は [...]/channel.isml/.mpd 、HLSの場合は [...]/channel.isml/.m3u8 )に関連付けることです。この場合、チャンネルのマニフェストは常にパイプラインで指定されたユースケースによって変更されます。

より柔軟な方法として、パイプラインをチャンネルの“バリアント”マニフェストURIに関連付けることができます。これは、一種の“エイリアス”として機能し、編集されていないオリジナルのマニフェストと編集済みのマニフェストを別々のURIで管理できます。例えば、 mpd_use_case というパイプラインを [...] /channel.isml/.mpd?python_pipeline_config=mpd_use_case というURIに関連付けると、このURIは mpd_use_case パイプラインによって編集されたマニフェストを返します。一方で、基本のURI [...] /channel.isml/.mpd は引き続きオリジナルのマニフェストを返します。

次のセクションでさらに説明します。

ベースチャンネルにパイプラインを追加する(Adding a pipeline to the base channel)

PUT /channels/{channel}/pipelines/{format} エンドポイントを使用して、マニフェスト編集の使用ケースをベースチャンネルに関連付けることができます。以下の点を確認してください:

  • {channel} はパイプラインを関連付けたいチャンネル名です。

  • {format} はサポートされている形式(例:mpd、m3u8_main、m3u8_media)の1つを指定します。

  • リクエストボディは有効なyaml構成ファイルであること。

  • Content-Type htmlヘッダーが「text/yaml」、「text/x-yaml」または「application/x-yaml」などの、サポートされている値のいずれかに設定されていること。

Normally, {channel} would refer to an existing channel. Using a non-existing channel name is possible though. The operation would be successful but will have no effect. If and when the referred channel will be created, the pipeline will be associated with it.

This endpoints performs pipeline validation by checking that:

通常、 {channel} は既存のチャンネルを指しますが、存在しないチャンネル名を使用することも可能です。その場合、操作は成功しますが、何も影響はありません。後に指定されたチャンネルが作成されると、そのパイプラインが関連付けられます。

このエンドポイントは、以下を確認することでパイプラインの検証を行います。

  • yamlが構文的に有効であること

  • パイプラインで指定されたフォーマットが、エンドポイントパスで指定された {format} 文字列と整合していること(たとえば、m3u8パイプラインをmpdエンドポイントにPUTするとエラーが発生します)

  • パイプラインで言及されているプラグインが有効であること

  • 各プラグインには正しい関連する構成セクションがあること

上記のいずれかのチェックが合格しない場合、415または422が返されます。 成功した場合、エンドポイントは200 OKとチャンネルの再生URIを返します。

PUT操作は、同じチャンネルに対する既存のパイプラインを事前にチェックせず、既存のものを無言で上書きすることに注意してください。

チャンネル「バリアント」(バリエーション)にパイプラインを追加する(Adding a pipeline to a channel "variant")

チャンネルのマニフェストにおいて、オリジナル版と編集版の両方にアクセスできるようにしたい場合は、チャンネルのバリアントを使用するべきです。

さらに柔軟性を持たせ、複数の編集されたマニフェストのバージョンに同時にアクセスしたい場合にも、チャンネルバリアントは適した選択です。

PUT /channels/{channel}/pipelines/{format}/variants/{variant} エンドポイントを使用して、マニフェスト編集の使用ケースをチャンネルバリアントに関連付けます。以下を確認してください。

  • {channel} is the name of the channel you want to associate a pipeline to.

  • {format} specifies one of the supported formats (i.e. mpd, m3u8_main or m3u8_media).

  • the request body is a valid yaml configuration file

  • the Content-Type html header is set to one of the supported values (i.e. "text/yaml", "text/x-yaml" or "application/x-yaml")

  • {variant} is a variant name of your choice. It will directly affect the playout URI, which is obtained by adding the query parameter python_pipeline_config={variant} to the base channel playout URI.

  • {channel} は、パイプラインを関連付けたいチャンネルの名前です。

  • {format} は、サポートされているフォーマットの1つを指定します(たとえば、mpd、m3u8_main、またはm3u8_media)。

  • リクエストボディは有効なyaml構成ファイルであること

  • Content-Type htmlヘッダーがサポートされている値の1つに設定されていること(たとえば、"text/yaml"、"text/x-yaml"、または"application/x-yaml")

  • {variant} は、任意のバリアント名です。これは、ベースチャンネルの再生URIにクエリパラメータ``python_pipeline_config={variant}`` を追加することで取得される再生URIに直接影響します。

このエンドポイントでは、ベースチャンネルに関連付けられたパイプラインの場合と同じチェックが実行されます。

必要なだけたくさんのバリアントを作成することができます。PUT操作は、同じバリアントに対する事前に存在するパイプラインに対してチェックを実行せず、既存のパイプラインを無言で上書きします。

パイプラインとバリアントの追跡(Keeping track of pipelines and variants)

指定されたベースチャンネルまたはバリアントに関連付けられたパイプライン構成ファイルを、任意のフォーマットについていつでも取得できます。これは、次のエンドポイントを使用して行います。

  • GET /channels/{channel}/pipelines/{format} (デフォルトパイプライン)

  • GET /channels/{channel}/pipelines/{format}/variants/{variant}

特定のチャンネルとフォーマットのすべてのバリアントとそれに関連付けられたパイプライン構成ファイルのリストを取得するには、エンドポイントを使用します。

  • GET /channels/{channel}/pipelines/{format}/variants

チャンネルとすべてのフォーマットに対して、チャンネルのすべてのパイプライン(デフォルトとバリアント)と関連するパイプライン構成ファイルを包括的に表示するには、エンドポイントを使用します。

  • GET /channels/{channel}/pipelines

パイプラインの削除(Deleting pipelines)

特定のフォーマットのベースチャンネルのパイプラインは、次のエンドポイントを使用して削除できます。

  • DELETE /channels/{channel}/pipelines/{format}

特定のフォーマットのチャンネルバリアントは、次のエンドポイントを使用して削除できます。

  • DELETE /channels/{channel}/pipelines/{format}/variants/{variant}

チャンネルバリアントパイプラインを削除すると、関連する再生URIが単純に消えて404が返されます。

ベースチャンネルパイプラインを削除すると、関連する再生URIは引き続き機能し、元の編集されていないマニフェストが返されます。

トラブルシューティング(Troubleshooting)

Channel endpoints

Channel Endpoint

Status Code

Meaning

How to fix

PUT /channels/{channel}

415

ボディの MIME タイプが間違っています。

Content-Typeヘッダーに application/xml を指定してください。

PUT /channels/{channel}

422

SMILに構文エラーがあります。

XMLの構文をチェックしてください。

PUT /channels/{channel}

400

SMILに構文エラーがあります。

<head>セクションのオプションをチェックする。<body>セクションをチェックする。

PUT /channels/{channel}

400

その名前のチャンネルはすでにライブで存在する。

トランジションを追加するか、force クエリパラメータを使用してください(実行中のストリームは中断されるので注意してください!!!)。

PUT /channels/{channel}

503

同じチャンネルですでに実行中のジョブがあるかもしれません。

ジョブが Success または Failed ステータスに達するまで待ち、再試行してください。

DELETE /channels/{channel}

404

存在しないチャンネルを削除しようとしています。

チャンネル名の確認してください。

DELETE /channels/{channel}

503

チャンネル作成/更新ジョブが実行中です。現在は削除できません。

ジョブが Success または Failed ステータスになるまで待ち、再試行してください。

GET /channels/{channel}/status

404

指定されたチャンネルが見つかりません。

チャンネル名のダブルチェックしてください。

GET /channels/{channel}/smil

404

指定されたチャンネルが見つかりません。

チャンネル名のダブルチェックしてください。

GET /channels/{channel}/isml

404

指定されたチャンネルが見つかりません。

チャンネル名のダブルチェックしてください。

GET /channels/{channel}/logs/remix

404

指定されたチャンネルが見つかりません。

チャンネル名のダブルチェックしてください。

GET /channels/{channel}/logs/mp4split

404

指定されたチャンネルが見つかりません。

チャンネル名のダブルチェックしてください。

GET /channels/{channel}/logs

404

指定されたチャンネルが見つかりません。

チャンネル名のダブルチェックしてください。

GET /channels/{channel}

404

指定されたチャンネルが見つかりません。

チャンネル名のダブルチェックしてください。

GET /channels/

404

チャンネルが作成されていないか、すべて削除されています。

新しいチャンネルを作ってください。

Transition endpoints

Transition Endpoint

Status Code

Meaning

How to fix

PUT /channels/{channel}/transitions/{transition}

415

ボディの MIME タイプが間違っています。

Content-Typeヘッダーに application/xml を指定してください。

PUT /channels/{channel}/transitions/{transition}

422

SMILに構文エラーがあります。

XMLの構文をチェックしてください。

PUT /channels/{channel}/transitions/{transition}

400

SMILに構文エラーがあります。

<head>セクションのオプションをチェックする。<bodyセクションをチェックする。

PUT /channels/{channel}/transitions/{transition}

400

その名前のチャンネルはすでにライブで存在する。

トランジションを追加するか、force クエリパラメータを使用してください(実行中のストリームは中断されるので注意してください!!!)。

PUT /channels/{channel}/transitions/{transition}

400

トランジションプレイリストを処理できません。トランジション時間 <time> が過去になっています。

新しいトランジション時間を選択するか、force クエリパラメータを使用してください(実行中のストリームは中断されるので注意してください!!!)

PUT /channels/{channel}/transitions/{transition}

400

[...] vod2live_start_time=<time> がスケジュールされたトランジション時間 <time> より後になっています。

新しい vod2live_start_time またはトランジション時間を選択するか、force クエリパラメータを使用してください(実行中のストリームは中断されるので注意してください!!!)。

PUT /channels/{channel}/transitions/{transition}

503

同じトランジションに対してすでに実行中のジョブが存在する可能性があります。

ジョブが Success または Failed ステータスに達するまで待ち、再試行してください。

DELETE /channels/{channel}/transitions/{transition}

404

存在しないトランジションを削除しようとしている。

トランジション名を確認してください。

DELETE /channels/{channel}/transitions/{transition}

503

トランジション作成/更新ジョブが実行中です。現在は削除できません。

ジョブが Success または Failed のステータスになるまで待ち、再試行してください。

GET /channels/{channel}/transitions/{transition}/status

404

指定されたトランジションが見つかりません。

トランジション名のダブルチェックをしてください。

GET /channels/{channel}/transitions/{transition}/smil

404

指定されたトランジションが見つかりません。

トランジション名のダブルチェックをしてください。

GET /channels/{channel}/transitions/{transition}/isml

404

指定されたトランジションが見つかりません。

トランジション名のダブルチェックをしてください。

GET /channels/{channel}/transitions/{transition}/logs/remix

404

指定されたトランジションが見つかりません。

トランジション名のダブルチェックをしてください。

GET /channels/{channel}/transitions/{transition}/logs/mp4split

404

指定されたトランジションが見つかりません。

トランジション名のダブルチェックをしてください。

GET /channels/{channel}/transitions/{transition}/logs

404

指定されたトランジションが見つかりません。

トランジション名のダブルチェックをしてください。

GET /channels/{channel}/transitions

404

指定されたトランジションが見つかりません。

トランジション名のダブルチェックをしてください。

Manifest Edit endpoints

Manifest Edit Endpoint

Status Code

Meaning

How to fix

PUT /channels/{channel}/pipelines/{format}

415

ボディの MIME タイプが間違っています。

Content-Typeヘッダには 「text/yaml」、「text/x-yaml」、または 「application/x-yaml 」を指定してください。 または "application/x-yaml」

PUT /channels/{channel}/pipelines/{format}/variants/{variant}

415

ボディの MIME タイプが間違っています。

Content-Typeヘッダには 「text/yaml」、「text/x-yaml」、または 「application/x-yaml 」を指定してください。 または "application/x-yaml」

PUT /channels/{channel}/pipelines/{format}

422

無効な yaml パイプライン設定。

エラーのレスポンス・ボディをチェックし、修正すべき点の詳細を確認する。

PUT /channels/{channel}/pipelines/{format}/variants/{variant}

422

無効な yaml パイプライン設定。

エラーのレスポンス・ボディをチェックし、修正すべき点の詳細を確認する。

GET /channels/{channel}/pipelines/{format}

404

{channel} と {format}のパイプラインが見つからない・

{channel} と {format}をダブルチェックしてください。-yaml

GET /channels/{channel}/pipelines/{format}/variants/{variant}

404

チャンネル/フォーマットのパイプラインが見つからない。/variant

Double-check the provided {channel}, {format} and {variant}.

GET /channels/{channel}/pipelines/{format}/variants

404

チャンネル/フォーマットのパイプラインが見つからない。

{channel} と {format}を

GET /channels/{channel}/pipelines

404

{channel} のパイプラインが見つからない。

{channel} をダブルチェックしてください。

DELETE /channels/{channel}/pipelines/{format}

404

チャンネル/フォーマットのパイプラインが見つからない。

{channel} と {format}をダブルチェックしてください。

DELETE /channels/{channel}/pipelines/{format}/variants/{variant}

404

チャンネル/フォーマットのパイプラインが見つからない。/variant

Double-check the provided {channel}, {format} and {variant}.