スケーラブルなビデオ
スケーラブルビデオは、ルーティングされたセッション向けの機能であり、各加入者が他の加入者とは独立して、自身の現在のネットワーク状況に応じた画質で映像を受信できるようにすることで、多者間セッションにおける映像品質を向上させます。
スケーラブルビデオが有効でない場合、OpenTok Media Router はストリーム上のすべての加入者に同じ画質の動画を配信します。 加入者の接続状態が悪化すると、ルーターは帯域幅の推定値に基づいてパブリッシャーにビットレートの引き下げを指示し、その結果、そのストリーム上のすべての加入者の画質が低下します。スケーラブルビデオが有効になっている場合、ルーターは他の加入者が受信するコンテンツに影響を与えることなく、各加入者に対して個別に、リアルタイムで最適な画質レイヤーを選択します。
スケーラブルなビデオには ルーティングセッション (OpenTok Media Router を使用するセッション)。中継されるセッションでは利用できず、また、ストリームはクライアント間で直接送受信され、経路上に品質レイヤーを選択または切り替えるルーターが存在しないため、そのようなセッションでは有用ではありません。詳細については、以下を参照してください。 OpenTok メディアルーターとメディアモード.
スケーラブルビデオはデフォルトで有効になっています。プロジェクトレベルの設定のデフォルト値は オート、つまり、セッション内のクライアントが2つ以上あり、かつその他のすべての条件が満たされている場合、OpenTok Media Routerは自動的にスケーラブルビデオを有効にします。また、次のように設定することも可能です。 オン (常にアクティブ)または オフ. ほとんどのアプリケーションでは、コードの変更は必要ありません。
コーデックとスケーラビリティ・モデル
スケーラブルビデオがどのように機能するかは、パブリッシャーがネゴシエートするコーデックによって異なります。この違いを理解することで、パブリッシャーのCPU使用率、アップストリームの帯域幅、加入者側の品質適応を最適化する必要がある場合など、ユースケースに適したコーデックを選択することができます。
VP8: サイマルキャスト
と VP8スケーラブルなビデオは サイマルキャスト. 配信事業者は、異なる解像度やフレームレートを持つ複数の独立したビットストリームをエンコードして送信します。例えば、1080p、540p、270pなどがあり、それぞれに独自の時間(フレームレート)レイヤーがあります。各ストリームは独立しており、単独でデコードすることができます。
各ストリームは独立しているため、OpenTok Media Router は、再エンコードを行うことなく、どの加入者でも別の画質レベルに切り替えることができます。これにより、ネットワーク状況の変化に対して高い耐性が確保されます。
トレードオフ: 複数のストリームをエンコードしてアップロードするには、単一の品質を送信するよりも、パブリッシャー側でより多くのCPUとアップストリーム帯域幅を必要とします。低解像度のレイヤーは、最高品質よりもエンコードにかかるコストが大幅に低くなりますが、それでも総コストは非サイマルキャスト・ストリームよりも高くなります。
VP9:スケーラブル・ビデオ・コーディング(SVC)
と VP9スケーラブルなビデオ用途 スケーラブルビデオコーディング(SVC). エンコーダーは、複数の空間(解像度)層および時間(フレームレート)層が埋め込まれた単一のビットストリームを生成します。上位の層は下位の層に依存しているため、ベース層のみを受け取ったデコーダーでは低品質の映像が再生されますが、すべての層を受け取ったデコーダーでは、同じビットストリームから最高品質の映像が再生されます。
SVCエンコーディングにおけるパブリッシャ側のCPU負荷は、単一ストリームのエンコーディングよりも高く、VP8の同時配信とほぼ同等ですが、SVCでは複数の独立したストリームではなく1つのビットストリームのみをアップロードすればよいため、アップストリーム帯域幅の要件は少なくて済みます。 OpenTok Media Routerは、単一のエンコード済みストリームから、各加入者に適したレイヤーのサブセットを抽出して転送することで、効率的かつ柔軟な画質適応を実現し、パケット損失に対する耐性も高めています。
SVC を利用するには、パブリッシャーエンドポイントと OpenTok Media Router の両方が VP9 SVC をサポートしている必要があります。 FirefoxはVP9をサポートするが、SVCはサポートしない. Firefoxの配信元がレイヤーのないVP9を送信しているため、OpenTok Media Routerはそのストリームの画質を調整することができません。
SVCレイヤー、スケーラビリティ・モード(L1T3, L2T3, L3T3)、アーカイブの動作、デバイスのサポートについては、以下を参照してください。 ルーティング・セッション用のVP9スケーラブル・ビデオ・コーディング.
一目でわかる主な違い
| アスペクト | サイマルキャスト(VP8) | SVC (VP9) |
|---|---|---|
| 出版社が送るもの | 解像度やフレームレートが異なる複数の独立したビットストリーム(個別のSSRC/RID) | 空間レイヤーと時間レイヤーが埋め込まれた1つのビットストリーム(シングルSSRC) |
| 空間レイヤー | マルチストリーム:各解像度が別々のエンコードストリームになる | 単一のビットストリームに組み込まれる |
| 時間レイヤー | 各サイマルキャスト・ストリームは、時間レイヤーを含むことができる。 | 単一のビットストリームに組み込まれる |
| OpenTok メディアルーターの役割 | 転送するストリームを選ぶ | 適切なレイヤーを抽出し、転送する |
| Firefoxパブリッシャーサポート | RIDベースのエンコーディングでサポート | VP9は対応、SVCはFirefoxでは未対応 |
空間レイヤーの解像度比: 各空間ステップでは 解像度比2:1..アン L3T3 このストリームには、ソース解像度の100%、50%、25%の解像度を持つレイヤーがあります(例えば、1080p、540p、270p)。これが理由です。 setPreferredResolution() は大幅に異なる解像度をターゲットにすることができる。
H.264:スケーラブルビデオ非対応
H.264コーデックは、Vonage Video APIでパブリッシングとサブスクリプションのために完全にサポートされています。 スケーラブルビデオはH.264ストリームでは使用できません。. OpenTok Media Router では、H.264 ストリームの品質レイヤーを切り替えることはできません。また、H.264 がネゴシエーションされた場合、スケーラブルビデオの設定は有効になりません。アプリケーションでスケーラブルビデオが必要な場合は、代わりに VP8 または VP9 を使用してください。詳しくは ビデオコーデック.
スケーラブルなビデオサポート
スケーラブルビデオはVP8サイマルキャストとVP9 SVCでサポートされています。には対応していません。 H.264ストリーム.でしか入手できない。 ルーティングセッション.
以下のクライアントはスケーラブル・ビデオをサポートしている:
- ウェブSDK - Chrome、Firefox、Safari、Samsung Internet、Android版WebView、iOS版WebView、およびChromiumベースのEdge。注:FirefoxはVP8の同時配信に対応していますが、VP9 SVCには対応していません。
- アンドロイドSDK 対応デバイス上で
- iOS SDK 対応デバイス上で
- Windows SDK
- Linux SDK
- macOS SDK
- リアクト・ネイティブSDK 対応デバイス上で
VP9 SVCデバイスとブラウザの互換性の詳細については、以下を参照してください。 ルーティング・セッション用のVP9スケーラブル・ビデオ・コーディング.
注: デフォルトでは、スケーラブル・ビデオは、画面共有ストリームでは無効であり、カメラおよびカスタム・ビデオ・ソース・ストリームでは有効です。画面共有でスケーラブル・ビデオを有効にするには、以下を参照してください。 スケーラブルな画面共有ストリーム.
スケーラブルなビデオの使い方
プロジェクトレベルの設定
スケーラブルビデオには、プロジェクトで設定できる3つのモードがあります。 Video APIアカウント:
- あなたのところへ Video APIアカウント をクリックし、左側のメニューにあるプロジェクトのリストからプロジェクトを選択します。
- アンダー プロジェクト設定見つける スケーラブルなビデオ そして、プロジェクトの設定を選択します:
- オート (推奨) - OpenTok Media Router を使用すると、セッションに 2 つ以上のクライアントが存在する場合でも、スケーラブルなビデオ通信が可能になります。特に上書きする理由がない限り、この設定を有効にしたままにしてください。
- オン - このプロジェクトのすべてのセッションにおいて、(対応しているクライアントでは)スケーラブルビデオが常に有効になっています。
- オフ - このプロジェクトのすべてのセッションで、スケーラブルビデオが無効になっています。これを使用すると、解像度とフレームレートを固定したり、パブリッシャーのCPUおよび帯域幅の使用量を削減したりできます。
- クリック セーブ.
注: この設定は VP8サイマル放送 動作について。VP9は対応している場合は常にSVCを使用しますが、H.264はスケーラブルビデオに対応していません。いずれの形式も、この設定の影響を受けません。
注: スケーラブルビデオがアクティブな場合、追加の品質レイヤーがエンコードおよび伝送されるため、ストリームはパブリッシャーからより多くのアップストリーム帯域幅を必要とする。
スケーラブルな画面共有ストリーム
デフォルトでは、スケーラブル・ビデオは 使用不能 画面共有ストリーム用 使用可能 カメラやカスタム動画ソースのストリーム用です。画面共有のコンテンツは通常、カメラ映像ほど頻繁に変化しないため、スケーラブルビデオによる追加のエンコード負荷は通常不要です。ただし、画面共有の参加者のネットワーク環境がまちまちであるセッションでは、これを有効にすると有益な場合があります。パブリッシャーごとにデフォルト設定を上書きすることができます:
| SDK | メソッド / プロパティ |
|---|---|
| ウェブSDK | scalableScreenshare オプションで OT.initPublisher() |
| アンドロイドSDK | PublisherKit.Builder.scalableScreenshare() |
| iOS SDK | OTPublisherKitSettings.scalableScreenshare |
| Windows SDK | Publisher.Builder.ScalableScreenshare |
| Linux SDK | otc_publisher_settings_set_scalable_screenshare() |
コンテンツヒントが画面共有レイヤーに与える影響
ルーティングされたセッション内の VP8 画面共有ストリームでスケーラブルビデオが有効になっている場合、 動画コンテンツのヒント パブリッシャーに設定した内容によって、パブリッシャーが送信する同時配信レイヤーの構成が決まります。これが、次のようなツールで画面共有パブリッシャーのストリーム数(SSRC)を確認した際に、 chrome://webrtc-internals コンテンツのヒントによって異なります:
-
detailまたはtext— このパブリッシャーは、細部の再現性と読みやすさ(テキスト、線画、静的コンテンツ)を最適化します。これにより、 同じ空間解像度を持ち、フレームレートのみが異なる2つのストリーム:通常のフレームレートでのフル解像度ストリームと、より低いフレームレートでの2つ目のフル解像度ストリームです。 これにより、共有コンテンツの鮮明さと可読性を維持しつつ、加入者のネットワーク品質が低下した際にOpenTok Media Routerがフォールバックできる低ビットレートのレイヤーを確保できます。つまり、ネットワーク品質の低下によって詳細がぼやけるのではなく、フレームレートが低下するだけです。フル解像度の2つのレイヤーを用意することで、ネットワーク品質低下時の耐性と、元の詳細な解像度の維持との間で良好なバランスを実現しています。 -
motion— パブリッシャーは、スムーズな動作(例えば、動画再生の共有など)を実現するよう最適化されています。これはカメラの同時配信と同様に動作し、 異なる空間解像度を持つ複数のストリーム, そのため、OpenTok Media Routerは、ネットワーク環境が制限されている状況下でも動きを滑らかに保つために、加入者の解像度を下げることができます。
共有したコンテンツに合うコンテンツヒントを選択してください: detail または text 細部の鮮明さを維持することを優先し(そのためにフレームレートを犠牲にする)、一方で motion 滑らかな動きを優先します(解像度を優先的に低下させます)。
注: このレイヤーの動作は、VP8 による同時配信の画面共有ストリームに適用されます。コンテンツヒントは、 videoContentHint オプションで OT.initPublisher() または publisher.setVideoContentHint() メソッド — 参照 動画コンテンツのヒントの設定.
加入者優先フレームレートと解像度の設定
スケーラブルビデオを使用してストリームが配信される場合、加入者はOpenTok Media Routerに対して希望する画質を通知することができます。OpenTok Media Routerは、加入者の実際のネットワーク状況に合致する、利用可能なレイヤーのうち最も近いものを選択します。
重要だ: 呼び出し setPreferredResolution() または setPreferredFrameRate() これにより、OpenTok Media Router との再ネゴシエーションがトリガーされます。これを繰り返し、あるいは短時間に連続して行うと、負荷が高くなります。CPU リソースを消費し、ストリーム全体の品質が低下する可能性があります。設定値を継続的に調整するのではなく、一度だけ、あるいはサブスクライバーのレイアウトが大幅に変更された場合にのみ、推奨値を設定してください。
警告だ: これらの加入者側の設定は、パブリッシャーがデフォルトのスケーラビリティレイヤーレイアウトを使用していることを前提としています。パブリッシャーがこれを setTargetScalabilityMode()、メディアルーターが転送するレイヤーは、要求された解像度やフレームレートと一致しない場合があります。詳しくは、 加入者が希望する解像度およびフレームレートとの連動 詳細はこちら。
| SDK | フレームレート | 決議 |
|---|---|---|
| ウェブSDK | Subscriber.setPreferredFrameRate() - 参照 subscribe-streams ウェブガイド |
Subscriber.setPreferredResolution() - 参照 subscribe-streams ウェブガイド |
| アンドロイドSDK | SubscriberKit.setPreferredFrameRate() - 参照 サブスクライブストリーム Androidガイド |
SubscriberKit.setPreferredResolution() - 参照 サブスクライブストリーム Androidガイド |
| iOS SDK | OTSubscriberKit.preferredFrameRate - 参照 subscribe-streams iOSガイド |
OTSubscriberKit.preferredResolution - 参照 subscribe-streams iOSガイド |
| Windows SDK | Subscriber.PreferredFramerate - 参照 サブスクライブストリーム Windowsガイド |
Subscriber.PreferredResolution - 参照 サブスクライブストリーム Windowsガイド |
| Linux SDK | otc_subscriber_set_preferred_framerate() - 参照 subscribe-ストリーム Linuxガイド |
otc_subscriber_set_preferred_resolution() - 参照 subscribe-ストリーム Linuxガイド |
| リアクト・ネイティブ | preferredFrameRate のプロパティ OTSubscriber - 参照 subscribe-streams React Nativeガイド |
preferredResolution のプロパティ OTSubscriber - 参照 subscribe-streams React Nativeガイド |
スケーラブル・ビデオの動作確認方法
SDKには "スケーラブル・ビデオ・アクティブ "フラグはありませんが、以下の方法で動作していることを確認できます。
ビデオ・インスペクター
について ビデオ・インスペクター 「品質メトリクス」モジュールのツールには、コーデック、解像度、フレームレートが表示されます。プロットされた線の任意の点にカーソルを合わせると、現在使用されているコーデックを確認できます。スケーラブルビデオが有効になっている場合、ネットワーク状況の変化に応じて、1人以上の加入者の解像度やフレームレートが動的に調整されることがあります。
WebRTC統計
各SDKは、基礎となるWebRTC統計レポートを公開しています。パブリッシャー側では RTCOutboundRtpStreamStats:
- と VP8サイマル放送複数の
ssrcエントリーが異なるframeWidthそしてframeHeight値。同時配信レイヤーごとに1つずつ。 - と VP9 SVCと表示されます。
ssrcを持つ。scalabilityModeプロパティセット、例えばL3T3.
注: VP8の場合 画面共有 ストリームは、以下の方法で公開されました。 detail または text コンテンツのヒント、この2つ ssrc エントリには 同じ frameWidth そして frameHeight また、解像度ではなくフレームレートが異なります。詳しくは コンテンツヒントが画面共有レイヤーに与える影響.
統計レポートにアクセスするためのSDKメソッド:
- Web SDK -
Publisher.getRtcStatsReport()そしてSubscriber.getRtcStatsReport() - Linux - 参照 ストリーム統計の取得
チェックリストスケーラブル動画が活躍するために必要な条件
適応的な品質動作が観察されない場合は、以下をVerifyしてください:
- セッションは ルート付き、中継されなかった。
- スケーラブル・ビデオが設定されていない オフ プロジェクトレベルで。
- ネゴシエートされたコーデックは VP8またはVP9、H.264ではありません。
- パブリッシャーは 対応クライアント.
目標スケーラビリティモードの設定
パブリッシャーのスケーラビリティモードを明示的に設定することで、WebRTC がエンコードする空間(解像度)レイヤーと時間(フレームレート)レイヤーの数を制御できます。これにより、映像品質の適応性とリソース使用量のバランスをきめ細かく調整することができます。
仕組み
ターゲットのスケーラビリティモードは、メディアルーター(パブリッシャー → メディアルーター)のメディアパスに適用されます。この設定はいつでも設定または変更が可能であり、メディアパスのネゴシエーションが完了している必要はありません。また、エンコーダーがすでに稼働中のアクティブなセッション中でも、その場で更新することができます。 メディアパスが確立される前に set メソッドを呼び出した場合、SDK はその値を保持し、コーデックネゴシエーションが完了した時点で適用します。 アダプティブ・メディア・ルーティング (AMR) セッションでは、メディアパスにおいてメディアルーターをバイパスする場合、スケーラビリティモードは使用されないため、このモードはメディアルーター(パブリッシャー → メディアルーター)のメディアパスにのみ適用されます。
ターゲットが制御する内容
ターゲットスケーラビリティモードは、エンコーダーに対して、空間(解像度)および時間(フレームレート)の各レイヤーをいくつ生成すべきかを指示します。これにより、メディアルーターが各加入者に動画を転送する際に利用可能な画質オプションが直接決定されます:
- その他の空間レイヤー — メディアルーターは、帯域幅に制限のある加入者に対しては解像度を下げつつ、その他の加入者に対してはフル解像度を維持することができます。例えば、
L3T3ルーターが選択できる3つの解像度レベルを用意しています。 - さらに多くの時間層 — メディアルーターは、解像度を下げることなく、帯域に制約のある加入者に対してフレームレートを低減することができます。例えば、
L1T3常にフル解像度を維持しつつ、ルーターには3つのフレームレートレベルから選択できるようにしています。これは、スライドや文書など、細部が重要なコンテンツに最適です。 - レイヤーの数を減らす — パブリッシャーのCPUおよび帯域幅の使用量を削減しますが、加入者ごとに画質を調整するメディアルーターの機能が制限されます。
ターゲットが完全に適用されない場合
ターゲットは設定値であり、エンコーダは条件が許す場合にこれを適用します。以下のケースでは、実際に適用されるモードがターゲットと異なる場合があります:
- コーデックの制限 — ネゴシエーションされたコーデックが要求されたレイヤーに対応していない場合、モードが調整されます。たとえば、次のように設定すると
L2T3VP8を使用すると、以下の結果となりますL1T3VP8は空間スケーラビリティに対応していないため、これが適用されています。詳しくは コーデック依存のフォールバック. - 要求された空間レイヤーの解像度が低すぎます — 各空間レイヤーのステップでは、2:1の解像度比が採用されています。パブリッシャーのキャプチャ解像度が低すぎて有意義な細分化ができない場合(例えば、320×240で公開している場合など)、
L3T3(要求された場合)、最下層が小さすぎて実用にならないため、エンコーダは要求された数よりも少ない空間レイヤーを生成する場合があります。 - ハードウェアまたはリソースの制約 — リソースに制約のあるデバイスでは、CPU や帯域幅の制限を超過することになる場合、エンコーダーは要求されたすべてのレイヤーを生成しないことがあります。
適用されているモードの確認
get メソッドは、あなたの ターゲット (設定した内容)であり、必ずしも適用された内容とは限りません。エンコーダーによって実際に生成されているスケーラビリティ層を確認するには、WebRTCの統計レポート、具体的には RTCOutboundRtpStreamStats — 出典: getRtcStatsReport(). プラットフォームをまたいだ統計情報の参照方法の詳細については、以下を参照してください。 スケーラブル・ビデオの動作確認方法 そして クライアントの観測可能性.
有効なスケーラビリティモード
以下のモードがサポートされています:
| モード | 空間レイヤー | 時間レイヤー | 説明 |
|---|---|---|---|
L1T1 |
1 | 1 | 単一の解像度、単一のフレームレート(スケーラビリティなし) |
L1T2 |
1 | 2 | 単一の解像度、2つのフレームレートレベル |
L1T3 |
1 | 3 | 単一の解像度、3段階のフレームレート |
L2T1 |
2 | 1 | 2つの解像度、単一のフレームレート |
L2T2 |
2 | 2 | 2つの解像度、2つのフレームレート |
L2T3 |
2 | 3 | 2つの解像度、3つのフレームレート設定 |
L3T1 |
3 | 1 | 3つの解像度、単一のフレームレート |
L3T2 |
3 | 2 | 3つの解像度、2つのフレームレート設定 |
L3T3 |
3 | 3 | 3つの解像度、3つのフレームレートレベル |
この形式は、以下の W3C WebRTC SVC仕様: L<spatial>T<temporal>, ここで、の後の数字は L は空間レイヤーの数であり、その後に続く数字は T は、時間レイヤーの数です。
このリストに含まれていない値は、エラーとなって拒否されます。set メソッドを呼び出したことがない場合(たとえば、 setTargetScalabilityMode() Web版/Android版、または targetScalabilityMode iOS/Windows上のプロパティ)の場合、対応する get メソッドは空または null の値(プラットフォームによって異なる)を返します。これは、スケーラビリティモードが ターゲット あくまで設定によるものであり、内部で管理されるデフォルト値ではありません。SDKはユーザーに代わってデフォルトのターゲットを想定しないため、明示的に設定するまでは、返す値はありません。
コーデック依存のフォールバック
実際にそのモードは 適用された メディアルーターのメディアパスでネゴシエートされたコーデックによって異なります:
- SVC対応コーデック(VP9) — 指定されたモードがそのまま適用されます。これらのコーデックは、空間スケーラビリティ層と時間スケーラビリティ層の両方をネイティブでサポートしています。
- VP8 — VP8 は時間的なスケーラビリティのみをサポートしており、空間レイヤーはサポートしていません。空間的な品質は、異なる解像度で複数のストリームを配信すること(シムキャスト)によって処理されます。これに最も近い適用可能なモードは、時間軸を維持し、空間レイヤーを 1 に固定することで得られます。たとえば、次のように設定すると
L2T2そしてVP8がネゴシエーションされ、L1T2が適用されます。 - H.264 — Video APIでは、H.264におけるスケーラブルビデオはサポートされていないため、前述のフォールバック動作はH.264ストリームには適用されません。
get メソッドは、コーデック依存のフォールバックの後に実際に何が適用されたかに関係なく、常に明示的に設定した値(意図した値)を返します。たとえば、次のように設定した場合、 L2T3 VP8がネゴシエーションされた場合、メディアルーターは以下を適用する L1T3 (VP8には空間レイヤーがないため)、しかしgetメソッドは依然として L2T3 — 有効モードではなく、当初の目標を反映しています。
加入者が希望する解像度およびフレームレートとの連動
メディアルーターの、以下のためのレイヤー選択ロジック Subscriber.setPreferredResolution() そして Subscriber.setPreferredFrameRate() は、デフォルトのスケーラビリティ・レイヤー構成に基づいて構築されています。パブリッシャーがデフォルト以外のターゲット・スケーラビリティ・モードを設定した場合、エンコーダーによって実際に生成される空間レイヤーおよび/または時間レイヤーは、メディア・ルーターが利用可能であると想定しているものと一致しなくなり、ルーターがサブスクライバーに転送するレイヤーは、そのサブスクライバーが要求した解像度やフレームレートと一致しない可能性があります。
警告だ: パブリッシャーがスケーラビリティモードを次のように上書きした場合、 setTargetScalabilityMode() (またはiOS/Windowsにおける同等の機能)、電話をかけてきた加入者は setPreferredResolution() または setPreferredFrameRate() その配信者のストリームでは、必ずしも希望する解像度やフレームレートが得られるとは限りません。たとえば、より低い優先解像度を指定して setPreferredResolution() パブリッシャーが選択したモードで対応する空間レイヤーが公開されていない場合、この設定は効果がない可能性があり、優先フレームレートが予想とは異なる時間レイヤーに割り当てられることがあります。Applicationsが、サブスクライバー側での優先解像度/フレームレートの選択が予測通りに機能することに依存している場合は、ターゲットのスケーラビリティモードをデフォルトのままにしておいてください。
プラットフォーム固有のAPIの使用方法
アンドロイド
について PublisherKit クラスには以下が含まれる。 setTargetScalabilityMode() そして getTargetScalabilityMode() のメソッドがある。
目標スケーラビリティモードの設定
電話 setTargetScalabilityMode() PublisherKitのインスタンスに対して、ターゲットのスケーラビリティモードを設定するには:
publisher.setTargetScalabilityMode("L3T3");
このメソッドはいつでも呼び出すことができます。メディアパスのネゴシエーションが完了している必要はありません。メディアルーターのメディアパスが確立されると、このモードが適用されます。
このメソッドは OpenTokException 要求されたモードが無効な場合(つまり、以下のいずれにも該当しない場合 L1T1, L1T2, L1T3, L2T1, L2T2, L2T3, L3T1, L3T2, L3T3):
try {
publisher.setTargetScalabilityMode("L3T3");
} catch (OpenTokException e) {
Log.e(TAG, "Invalid scalability mode: " + e.getMessage());
}
対象のスケーラビリティモードの取得
電話 getTargetScalabilityMode() 明示的に設定された値を取得するために。これは null setter が一度も呼び出されていない場合:
String mode = publisher.getTargetScalabilityMode();
// "L3T3" or null
注: このゲッターは、実際に適用されたモードではなく、ユーザーの意図を返します。SVC以外のコーデック(VP8やH.264)がネゴシエーションされた場合、適用されるモードが異なる可能性があります(空間レイヤーは1にクリップされます)。
ウェブ(JavaScript)
パブリッシャ・オブジェクトには以下が含まれます。 setTargetScalabilityMode() そして getTargetScalabilityMode() のメソッドがある。
目標スケーラビリティモードの設定
電話 setTargetScalabilityMode() Publisher オブジェクトに対して、ターゲットのスケーラビリティモードを設定します。このメソッドは、希望するモードを指定する文字列を受け取ります:
publisher.setTargetScalabilityMode('L3T3');
このメソッドはいつでも呼び出すことができます。メディアパスのネゴシエーションが完了している必要はありません。メディアルーターのメディアパスが確立されると、このモードが適用されます。
要求されたモードが無効な場合(つまり、以下のいずれにも該当しない場合)、このメソッドはエラーをスローします。 L1T1, L1T2, L1T3, L2T1, L2T2, L2T3, L3T1, L3T2, L3T3):
try {
publisher.setTargetScalabilityMode('L3T3');
} catch (err) {
console.error('Invalid scalability mode:', err.message);
}
対象のスケーラビリティモードの取得
電話 getTargetScalabilityMode() 明示的に設定された値を取得するために。これは undefined setter が一度も呼び出されていない場合:
const mode = publisher.getTargetScalabilityMode();
console.log(mode); // 'L3T3' or undefined
注: このゲッターは、実際に適用されたモードではなく、ユーザーの意図を返します。SVC以外のコーデック(VP8やH.264)がネゴシエーションされた場合、適用されるモードが異なる可能性があります(空間レイヤーは1にクリップされます)。
リナックス
C SDKには以下が含まれます otc_publisher_set_target_scalability_mode() そして otc_publisher_get_target_scalability_mode() の機能がある。
目標スケーラビリティモードの設定
電話 otc_publisher_set_target_scalability_mode() パブリッシャーのターゲットスケーラビリティモードを設定するには:
otc_status status = otc_publisher_set_target_scalability_mode(publisher, "L3T3");
if (status != OTC_SUCCESS) {
printf("Failed to set scalability mode\n");
}
このメソッドはいつでも呼び出すことができます。メディアパスのネゴシエーションが完了している必要はありません。メディアルーターのメディアパスが確立されると、このモードが適用されます。
この関数は以下の値を返します OTC_INVALID_PARAM if:
- パブリッシャープポインタは
NULL - スケーラビリティ・モードの文字列は、
NULL - 指定されたモードは無効です(つまり、以下のいずれにも該当しません
L1T1,L1T2,L1T3,L2T1,L2T2,L2T3,L3T1,L3T2,L3T3)
対象のスケーラビリティモードの取得
電話 otc_publisher_get_target_scalability_mode() 明示的に設定された値を取得するために。これは NULL setter が一度も呼び出されていない場合:
const char* mode = otc_publisher_get_target_scalability_mode(publisher);
if (mode != NULL) {
printf("Target scalability mode: %s\n", mode);
}
注: このゲッターは、実際に適用されたモードではなく、ユーザーの意図を返します。SVC以外のコーデック(VP8やH.264)がネゴシエーションされた場合、適用されるモードが異なる可能性があります(空間レイヤーは1にクリップされます)。
iOS (Objective-C)
について OTPublisherKit このクラスには、以下のものが含まれています。 targetScalabilityMode 財産である。
目標スケーラビリティモードの設定
を設定する。 targetScalabilityMode OTPublisherKitインスタンスのこのプロパティを設定して、ターゲットのスケーラビリティモードを指定します:
NSError *error = nil;
[publisher setTargetScalabilityMode:@"L3T3" error:&error];
セッターはいつでも呼び出すことができます。メディアパスのネゴシエーションが完了している必要はありません。このモードは、メディアルーターのメディアパスが確立されると適用されます。
セッターは……を提起する OTError 要求されたモードが無効な場合(つまり、以下のいずれにも該当しない場合 L1T1, L1T2, L1T3, L2T1, L2T2, L2T3, L3T1, L3T2, L3T3).
対象のスケーラビリティモードの取得
続きを読む targetScalabilityMode 明示的に設定された値を取得するためのプロパティです。これは nil setter が一度も呼び出されていない場合:
NSString *mode = publisher.targetScalabilityMode;
// @"L3T3" or nil
注: このゲッターは、実際に適用されたモードではなく、ユーザーの意図を返します。SVC以外のコーデック(VP8やH.264)がネゴシエーションされた場合、適用されるモードが異なる可能性があります(空間レイヤーは1にクリップされます)。
iOS (Swift)
について OTPublisherKit このクラスには、以下のものが含まれています。 targetScalabilityMode 財産である。
目標スケーラビリティモードの設定
を設定する。 targetScalabilityMode OTPublisherKitインスタンスのこのプロパティを設定して、ターゲットのスケーラビリティモードを指定します:
try publisher.setTargetScalabilityMode("L3T3")
セッターはいつでも呼び出すことができます。メディアパスのネゴシエーションが完了している必要はありません。このモードは、メディアルーターのメディアパスが確立されると適用されます。
セッターは……を提起する OTError 要求されたモードが無効な場合(つまり、以下のいずれにも該当しない場合 L1T1, L1T2, L1T3, L2T1, L2T2, L2T3, L3T1, L3T2, L3T3).
対象のスケーラビリティモードの取得
続きを読む targetScalabilityMode 明示的に設定された値を取得するためのプロパティです。これは nil setter が一度も呼び出されていない場合:
let mode = publisher.targetScalabilityMode
// "L3T3" or nil
注: このゲッターは、実際に適用されたモードではなく、ユーザーの意図を返します。SVC以外のコーデック(VP8やH.264)がネゴシエーションされた場合、適用されるモードが異なる可能性があります(空間レイヤーは1にクリップされます)。
ウィンドウズ
について Publisher このクラスには、以下のものが含まれています。 TargetScalabilityMode 財産である。
目標スケーラビリティモードの設定
を設定する。 TargetScalabilityMode Publisher インスタンスの property を使用して、ターゲットのスケーラビリティモードを設定します:
publisher.TargetScalabilityMode = "L3T3";
セッターはいつでも呼び出すことができます。メディアパスのネゴシエーションが完了している必要はありません。このモードは、メディアルーターのメディアパスが確立されると適用されます。
セッターが OpenTokException 要求されたモードが無効な場合(つまり、以下のいずれにも該当しない場合 L1T1, L1T2, L1T3, L2T1, L2T2, L2T3, L3T1, L3T2, L3T3):
try
{
publisher.TargetScalabilityMode = "L3T3";
}
catch (OpenTokException e)
{
Console.WriteLine("Invalid scalability mode: " + e.Message);
}
対象のスケーラビリティモードの取得
続きを読む TargetScalabilityMode 明示的に設定された値を取得するためのプロパティです。これは null setter が一度も呼び出されていない場合:
string mode = publisher.TargetScalabilityMode;
// "L3T3" or null
注: このゲッターは、実際に適用されたモードではなく、ユーザーの意図を返します。SVC以外のコーデック(VP8やH.264)がネゴシエーションされた場合、適用されるモードが異なる可能性があります(空間レイヤーは1にクリップされます)。
よくある誤解とFAQ
スケーラブル・ビデオはVP9 SVCと同じか?
いいえ。「スケーラブル・ビデオ」は、Vonage Video API の機能名です。技術的な仕組みはコーデックによって異なります:
- VP8 により、スケーラブルなビデオを実現する。 サイマルキャスト. 配信事業者は、複数の独立したストリームを送信します。
- VP9 により、スケーラブルなビデオを実現する。 あいてせんたくせつぞく. パブリッシャーは、レイヤーが埋め込まれた1つのストリームを送信します。
どちらの仕組みも、OpenTok Media Router が各加入者が受信する画質を適応させることを可能にします。ドキュメントでコーデックを特定せずに「スケーラブルビデオ」と記載されている場合は、この機能全体を指しています。
優先コーデックを設定すると、スケーラブル・ビデオが強制的にオンになりますか?
いいえ。優先するコーデックの選択は、スケーラブルビデオとは無関係です。スケーラブルビデオが有効になるかどうかは、以下のすべての条件によって決まります:
- スケーラブルビデオプロジェクトの設定(「オン」、「オフ」、または「自動」)。
- ルーティングされるセッション。
- スケーラブルビデオに対応した、交渉により決定されたコーデック(VP8またはVP9。H.264ではない)。
- スケーラブル動画をサポートするパブリッシャーのクライアントまたはブラウザ。
なぜなのか? Subscriber.setPreferredResolution() 品質に適応しない?
加入者側 setPreferredResolution() そして setPreferredFrameRate() これらは OpenTok Media Router に対するヒントであり、パブリッシャーのエンコーダーに対する直接的なコマンドではありません。OpenTok Media Router は、その加入者に対してスケーラブルビデオレイヤーの選択をアクティブに行っている場合にのみ、これらのヒントに基づいて動作します。以下の条件のいずれかが当てはまる場合、選択可能なレイヤーが存在しないため、ヒントは効果を持ちません:
- プロジェクトレベルまたはパブリッシャーストリームで、スケーラブルビデオが無効になっています。
- ネゴシエーションの結果、採用されたコーデックはH.264ですが、これはスケーラブルビデオに対応していません。
- このパブリッシャーのクライアントは、スケーラブルなレイヤーを生成しません。たとえば、SVCレイヤーなしでVP9を送信するFirefoxパブリッシャーなどが挙げられます。
- パブリッシャーにはCPUまたは帯域幅の制約があり、ルーターが選択できるよう に上位レイヤーを送信していない。
- 出版社は、以下を通じてデフォルト以外のスケーラビリティモードを設定しています。
setTargetScalabilityMode()— メディアルーターのレイヤー選択はデフォルトのレイアウトに基づいて構築されているため、加入者の設定が、その加入者が期待するレイヤーと一致しない場合があります。 - セッションは中継されています。中継セッションでは、OpenTok Media Router はストリームを転送しないため、レイヤーの選択は行われません。なお、中継(P2P)セッションでは、パブリッシャーのエンコーダーがサブスクライバーのネットワーク状況に基づいて出力を直接調整しますが、これはスケーラブルビデオのレイヤー選択とは異なります。
注: リレー方式のセッションでは、一部のSDKではこれらのAPI呼び出しをエラーなしで受け付ける場合がありますが、OpenTok Media Routerはストリームの転送に関与していないため、品質レイヤーの選択に関する設定は反映されません。
注: 一部のSDKで利用可能なパブリッシャー側の解像度およびフレームレートAPIは、動作が異なります。これらは、OpenTok Media Routerの品質ヒントではなく、エンコード済みストリームの解像度とフレームレートを直接制御します。
同じセッションにスケーラブルなパブリッシャーとスケーラブルでないパブリッシャーを混在させることはできますか?
はい。スケーラブルビデオは、セッションごとではなく、ストリームごとに決定されます。1つのセッション内で、スケーラブルビデオを使用するパブリッシャーと、そうでないパブリッシャー(たとえばH.264パブリッシャーなど)が同時に存在したり、スケーラブルビデオを無効にして配信しているクライアントが存在したりする場合があります。OpenTok Media Routerは、各ストリームを個別に処理します。
スケーラブル・ビデオはアーカイブに影響するか?
について VP8サイマル放送アーカイバは、利用可能な最高品質のレイヤーを使って記録する。
について VP9 SVC個々のアーカイブは、各参加者のストリームをVP9 SVCエンコードされたWebMとして保存します。合成されたアーカイブは、セッションのコーデックに関係なく、常にH.264/AAC MP4にトランスコードされます。
VP9 SVC WebMファイルの再生は、メディアプレーヤーによっては動作しない場合があります。再生手順とトランスコード・コマンドについては、以下をご覧ください。 VP9ビデオのアーカイブに関する注意事項 のVP9ガイドにある。
詳しくは このサポート記事.