UIのカスタマイズ — Web
OpenTokの動画のユーザーインターフェースをカスタマイズするために、以下の設定を行うことができます:
- 動画の初期寸法の設定
- 動画のリサイズや位置変更
- 公開ストリームに名前を追加する
- 動画内の名前の表示・非表示
- ミュートオーディオボタンの表示/非表示
- ビデオのクロップとレターボックスの調整
- ビデオのスナップショット画像を取得する
- オーディオ専用モードで表示する画像の設定
- オーディオレベルに応じてユーザーインターフェースを調整
- 加入者オーディオがブロックされている場合にカスタムUI要素を表示する
- ビデオの有効/無効時のユーザーインターフェースの調整
- 動画に内蔵されたすべてのユーザーインターフェイスコントロールを非表示にする
- パブリッシャーまたはサブスクライバーのビデオ・エレメントへの直接アクセス
- Media Stream Available API を使用した MediaStream オブジェクトへのアクセス
- サブスクライバのMediaStreamオブジェクトへのアクセス
動画の初期位置と寸法の設定
動画を公開する際に、パブリッシャーが置き換える DOM 要素 (またはその ID) を指定できます。また、パブリッシャーの最初の幅と高さを指定することもできます:
// Replace the first parameter with ID of the target DOM element:
const publisher = OT.initPublisher('myPublisherElementId',
{width:400, height:300});
session.publish(publisher);
を設定することもできます。 insertMode に渡すオプションの OT.initPublisher() メソッドを使用します。 'append' 指定したDOM要素(コンテナ)の子要素としてパブリッシャーを追加するには:
const publisherOptions = {
insertMode: 'append',
width: 400,
height: 300
};
const publisher = OT.initPublisher('publisherContainerElementId', publisherOptions);
session.publish(publisher);
同様に、ストリームを購読するとき、ターゲット DOM 要素(またはその ID)を指定できます。また、サブスクライバの最初の幅と高さを指定することもできます:
const options = {width: 400, height: 300, insertMode: 'append'}
const subscriber = session.subscribe(stream, 'containerElementId', options);
また、親DOM要素のサイズに対するパーセンテージで幅と高さの初期値を指定することもできます:
const publisherOptions = {
insertMode: 'append',
width: '100%',
height: '100%'
};
const publisher = OT.initPublisher(publisherContainerElement, publisherOptions);
session.publish(publisher);
置換要素IDを指定しない(またはNULLに設定する)と、アプリケーションはHTML本文に新しいDOM要素を追加します。デフォルトの幅は264ピクセル、デフォルトの高さは198ピクセルです。
複数のCSSルールを適用したい場合は、親(コンテナ)DOM要素に適用する:
<style>
#publisherContainer.large
{ width: 640px; height: 480px; }
#publisherContainer.small
{ width:100px; height: 100px; }
</style>
<div id="publisherContainer"></div>
<script>
const publisher = OT.initPublisher('publisherContainer',
{width: '100%', height: '100%', insertMode: 'append'}
</script>
モバイル機器で動画に異なるサイズを適用するには、CSS メディアクエリを使用します:
<style>
#publisherContainer
{ width: 100px; height: 100px; }
@media screen and (max-width: 650px) {
#publisherContainer
{ width: 89px; height: 50px; }
}
</style>
<div id="publisherContainer"></div>
<script>
const publisher = OT.initPublisher('publisherContainer',
{width: '100%', height: '100%', insertMode: 'append'}
</script>
動画のサイズを動的に変更したい場合は、以下のように設定します。 insertMode への 'append' を設定する。 height そして width への '100%'.
パブリッシャーまたはサブスクライバーの動画のサイズ変更や位置変更については、次のセクションを参照してください。
動画のリサイズや位置変更
について element プロパティは、その HTML DOM 要素です。HTML DOM 内でこれを再配置したり、要素のサイズを変更するには、その style.width そして style.height 他のDOM要素と同様に、プロパティを次のように指定します:
document.getElementById("target").appendChild(publisher.element);
publisher.element.style.width = "100px";
publisher.element.style.height = "75px";
最初の width そして height パブリッシャ・オブジェクトまたはサブスクライバ・オブジェクトのサイズをパーセンテージ (100% など) で指定すると、その親エレメントの 1 つをリサイズすることでサイズを変更できます。以下の例は、Publisher のサイズを変更する関数を含んでいます:
<script type="text/javascript">
const publisherOptions = {
insertMode: "append",
height: "100%",
width: "100%"
}
const publisher = OT.initPublisher("publisherContainer", publisherOptions);
session.publish(publisher);
function resizePublisher() {
const publisherContainer = document.getElementById("publisherContainer");
publisherContainer.style.width = "1000px";
publisherContainer.style.height = "750px";
}
</script>
<div id="container">
<div id="publisherContainer"></div>
<a href="javascript:resizePublisher()">resize</a>
</div>
前節を参照のこと、 動画の初期寸法の設定 パブリッシャーやサブスクライバーの初期位置や寸法を設定する方法については、こちらをご覧ください。
重要だ: 次のように設定して、パブリッシャーまたはサブスクライバーのデフォルトのユーザーインターフェースを無効にすると、 insertDefaultUI への false Publisher または Subscriber オブジェクトをインスタンス化する際、 element 発行者または購読者のプロパティは未定義となります。以下のイベントを監視してください。 videoElementCreated イベントで、以下の element イベントオブジェクトのプロパティを使用して、パブリッシャーまたはサブスクライバーの HTML DOM 要素にアクセスします。詳しくは、 パブリッシャーまたはサブスクライバーのビデオ・エレメントへの直接アクセス.
公開ストリームに名前を追加する
パブリッシャーの作成時に、ビデオに表示する名前を(オプションで)指定できます:
// Replace the first parameter with the target element ID:
const publisher = OT.initPublisher("myPublisher",
{name: "John"})
session.publish(publisher);
この名前を使ってクライアントを識別することができる。
出版社の「名前」欄に個人情報を使用しないこと — パブリッシャー名は、セッションの他の参加者に公開される可能性があり、またインスペクターツールやVonageの内部ログにも表示される可能性があるため、パブリッシャー名には、暗号化されていない機密情報や個人情報を決して使用しないでください。 セキュリティのベストプラクティスを参照してください.
トークン作成時に、クライアントに関するメタデータを追加することもできる。この名前はビデオでは自動的に表示されません。しかし、トークン作成時にデータを追加することで、より安全に情報を追加することができます(トークンはクライアントではなくサーバー上で作成されるため。詳しくは トークンの作成.
クライアントは、パブリッシャーまたはサブスクライバーのビューで名前を非表示にするかどうかを選択できます。次のセクションを参照してください。
動画内の名前の表示・非表示
ストリームを公開する際、動画内に表示される名前を指定することができます(前のセクションを参照)。
パブリッシャの作成時に、パブリッシャ・ビデオに名前を表示するかどうかを指定するには style.nameDisplayMode に渡すオプションの OT.initPublisher() メソッドを使用する:
// Replace the first parameter with the target element ID:
const publisher = OT.initPublisher("myPublisher",
{
name: "John",
style: { nameDisplayMode: "off" }
});
session.publish(publisher);
について style.nameDisplayMode プロパティには3つの値のいずれかを設定できる:
"auto"- この名前は、ストリームが最初に表示されたときと、ユーザーがビデオの上にマウスを置いたときに表示されます(デフォルト)。"off"- 名前は表示されない。"on"- 名前が表示される。
パブリッシャを作成したら、名前の表示モードを変更するには setStyle() メソッドを呼び出します。(を参照してください)。 ドキュメンテーション のために Publisher.setStyle() メソッド)
ストリームを購読する際に、購読者ビデオに名前を表示するかどうかを指定するには style.nameDisplayMode に渡すオプションの Session.subscribe() メソッドを使用する:
// Replace the first two parameters with the stream and target element ID:
const subscriber = session.subscribe(stream,
"mySubscriber",
{
style: { nameDisplayMode: "off" }
});
サブスクライバを作成したら、名前表示モードを変更するために setStyle() メソッドを呼び出します。(を参照してください)。 ドキュメンテーション のために Subscriber.setStyle() メソッド)
ミュートオーディオボタンの表示/非表示
デフォルトでは、パブリッシャーまたはサブスクライバーのユーザーインターフェースには、音声のミュートボタンが含まれています。パブリッシャーの場合、ユーザーはこのボタンをクリックしてマイクのオン/オフを切り替えることができます。サブスクライバーの場合、ユーザーはこのボタンをクリックしてスピーカーのオン/オフを切り替えることができます。
ストリームを公開する際、ミュートボタンを表示するかどうかは style.buttonDisplayMode プロパティを OT.initPublisher() メソッドを使用する:
const publisher = OT.initPublisher(
'publisher-element-id', // Replace with the replacement element ID
{
name: 'John',
style: {buttonDisplayMode: 'on'}
}
);
session.publish(publisher);
について style.buttonDisplayMode プロパティには3つの値のいずれかを設定できる:
"auto"— ミュートボタンは、ストリームが最初に表示されたときと、ユーザーが動画にマウスを合わせるときに表示されます(デフォルト設定)。"off"— ミュートボタンが表示されません。"on"— ミュートボタンが表示されます。
同様に、ストリームを購読する際、 style.buttonDisplayMode プロパティを Session.subscribe() メソッドを使用する:
const subscriber = session.subscribe(stream,
'subscriber-element-id', // Replace with the replacement element ID
{
style: {buttonDisplayMode: 'on'}
}
);
パブリッシャーまたはサブスクライバーを作成したら、 setStyle() Publisher オブジェクトまたは Subscriber オブジェクトのメソッド。(詳細については、 Publisher.setStyle() そして サブスクライバー.setStyle().)
ビデオのクロップとレターボックスの調整
を設定することで、パブリッシャーまたはサブスクライバーのビデオのクロッピングまたはレターボックスを指定できます。 fitMode に渡すオプションの OT.initPublisher() または Session.subscribe().以下の2つの文字列のいずれかを渡す:
"cover"- 動画の寸法が DOM 要素の寸法と一致しない場合は、動画が切り取られます。これは、カメラフィードを公開する動画のデフォルト設定です。"contain"- 動画の寸法が DOM 要素の寸法と一致しない場合、動画はレターボックス化されます。これは、画面共有動画のデフォルト設定です。
例えば、次のコードは video 要素がレターボックス化されたパブリッシャーを初期化します:
const publisher = OT.initPublisher("publisher-element-id",
{fitMode: "contain"});
次のコードは、video要素が切り取られたストリームを購読する:
const subscriber = session.subscribe(stream,
"subscriber-element-id",
{fitMode: "cover"});
ビデオのスナップショット画像を取得する
以下のコードでは、パブリッシャー・ビデオの静止画像をキャプチャして表示しています:
const imgData = publisher.getImgData();
const img = document.createElement("img");
img.setAttribute("src", "data:image/png;base64," + imgData);
// Replace with the parent DIV for the img
document.getElementById("containerId").appendChild(img);
次のコードは、加入者ビデオの静止画像をキャプチャして表示します:
const imgData = subscriber.getImgData();
const img = document.createElement("img");
img.setAttribute("src", "data:image/png;base64," + imgData);
// Replace with the parent DIV for the img
document.getElementById("containerId").appendChild(img);
オーディオ専用モードで表示する画像の設定
を使用することができます。 backgroundImageURI スタイルを使用して、ビデオがない場合に表示される画像を設定します。設定する値は、Web 上の画像の URL にすることができます。また data: を使用して取得したURLのようなものです。 getImgData() メソッドは、サブスクライバー・オブジェクトの 前節).
次のコードは、サブスクライバーの背景画像を設定します。への呼び出しが Session.subscribe() が正常に完了すると、背景画像が設定される。ビデオストリームがある場合、背景は加入者のビデオからキャプチャされた静止画像に設定され、そうでない場合は、Web URLからロードされた画像に設定されます:
const subscriber = session.subscribe(event.stream, 'subscriberElement', function(error) {
if (error) {
console.log(error.message)'
return;
}
if (subscriber.stream.hasVideo) {
const imgData = subscriber.getImgData();
subscriber.setStyle('backgroundImageURI', imgData);
} else {
subscriber.setStyle('backgroundImageURI',
'data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" width="1" height="1"%3E%3Crect width="1" height="1" fill="%23f4eadf"/%3E%3C/svg%3E'
);
}
});
サブスクライバーに背景画像を設定していない場合、動画がないときは、ストリームの配信者がストリームを初期化した際にイニシャルが設定されていた場合、そのイニシャルが表示されます(参照: パブリッシャーの初期化).
例えば、no imageを渡せば、現在の背景を取り除くことができる: subscriber.setStyle('backgroundImageURI', null).事前に設定されている場合は、イニシャルが表示されます。
オーディオレベルに応じてユーザーインターフェースを調整
パブリッシャーとサブスクライバーのオブジェクトのディスパッチ audioLevelUpdated イベントを定期的に発生させ、オーディオ・レベルをレポートします。これらのイベントを使用して、オーディオレベルインジケータを表示することができます。また、これらのイベントを使用して、セッションでアクティブなスピーカーを検出することもできます。
次の例は、加入者の音量を示すメーター要素の値を調整します。このコードでは audioLevelDisplayMode スタイル 'off'これは、サブスクライバーに表示されるデフォルトのオーディオレベルメーターを無効にします。オーディオレベルは対数的に調整され、移動平均が適用されます:
subscriber.setStyle('audioLevelDisplayMode', 'off');
const movingAvg = null;
subscriber.on('audioLevelUpdated', function(event) {
if (movingAvg === null || movingAvg <= event.audioLevel) {
movingAvg = event.audioLevel;
} else {
movingAvg = 0.7 * movingAvg + 0.3 * event.audioLevel;
}
// 1.5 scaling to map the -30 - 0 dBm range to [0,1]
const logLevel = (Math.log(movingAvg) / Math.LN10) / 1.5 + 1;
logLevel = Math.min(Math.max(logLevel, 0), 1);
document.getElementById('subscriberMeter').value = logLevel;
});
この例では、IDが "subscriberMeter "のHTMLメーター要素があると仮定している。
なお、オーディオ専用モードでは、パブリッシャーまたはサブスクライバーのDOM要素に、デフォルトで音量インジケーター(要素の右上隅)が表示されます。このデフォルトのユーザーインターフェース要素を無効にして、独自の音量メーターを表示させることもできます。次のトピックを参照してください。 ビデオの有効/無効時のユーザーインターフェースの調整.
を使用することもできます。 audioLevelUpdated イベントを使用して、パブリッシャーまたはサブスクライバーのオーディオが十分な音量で十分な時間続いた場合に、参加者が話し始めたと判断することができます。または、オーディオが十分な時間静かであった場合、参加者が話を止めたと識別することができます:
const subscriber = session.subscribe(event.stream);
SpeakerDetection(subscriber, function() {
console.log('started talking');
}, function() {
console.log('stopped talking');
});
const SpeakerDetection = function(subscriber, startTalking, stopTalking) {
const activity = null;
subscriber.on('audioLevelUpdated', function(event) {
const now = Date.now();
if (event.audioLevel > 0.2) {
if (!activity) {
activity = {timestamp: now, talking: false};
} else if (activity.talking) {
activity.timestamp = now;
} else if (now- activity.timestamp > 1000) {
// detected audio activity for more than 1s
// for the first time.
activity.talking = true;
if (typeof(startTalking) === 'function') {
startTalking();
}
}
} else if (activity && now - activity.timestamp > 3000) {
// detected low audio activity for more than 3s
if (activity.talking) {
if (typeof(stopTalking) === 'function') {
stopTalking();
}
}
activity = null;
}
});
};
(コンソールに出力する代わりに、ユーザーが話し始めたり話し終えたりした際に、アプリでユーザーインターフェースの要素を変更することもできます。)
加入者オーディオがブロックされている場合にカスタムUI要素を表示する
ブラウザによっては、オーディオの再生が自動的にブロックされ click イベントで、加入者のオーディオ再生が開始されます。これらのブラウザには、Safari、Firefox 66+、Chrome 71+が含まれます。
オーディオ再生がブロックされている場合、Subscriber オブジェクトはオーディオ再生ボタンを表示します。サブスクライバーのデフォルトのオーディオ再生ボタンを無効にし、ユーザーがクリックしてオーディオ再生を開始する独自の UI 要素を表示することができます。
デフォルトのオーディオ再生ボタンの表示を無効にするには style.audioBlockedDisplayMode プロパティの options パラメーターの Session.subscribe() メソッド):
const subscriberOptions = {
style: { audioBlockedDisplayMode: "off" }
};
const subscriber = session.subscribe(stream,
'subscriber-element-id', // Replace with the replacement element ID
subscriberOptions
);
のイベントリスナーを追加する。 audioBlocked そして audioUnblocked サブスクライバによってディスパッチされるイベントを使用して、カスタムUIエレメントを表示したり非表示にしたりします(オーディオを再生するためにクリックするように使用者に指示します):
subscriber.on({
audioBlocked: function(event) {
// display custom UI
},
audioUnblocked: function(event) {
// hide custom UI
}
});
ユーザーがカスタム UI 要素をクリックしたら、 OT.unblockAudio() メソッドを使用する:
customElement.addEventListener('click', async () => {
try {
await OT.unblockAudio();
} catch (err) {
console.error('Unblocking audio failed.', err);
return;
}
console.log('Unblocked audio successfully.');
});
ビデオの有効/無効時のユーザーインターフェースの調整
サブスクライバーのイベントに基づいてUIを調整する
サブスクライバ・オブジェクトは、サブスクライバのストリームでビデオが有効または無効になることに関連する以下のイベントをディスパッチする:
videoEnabled- ビデオが無効化された後に有効化されたときにディスパッチされる。videoDisabled- ビデオが無効化されたときにディスパッチされる。そのreasonプロパティは、ビデオが無効化された理由を示す。(このイベント・オブジェクトは ビデオ有効変更イベント オブジェクト)videoDisableWarning— OpenTok Media Router がストリームの品質が低下したと判断し、さらに品質が低下した場合は動画が停止される場合に送信されます。品質がさらに低下した場合、加入者は動画を停止し、videoDisabledイベント。このイベントは、パブリッシャーのオーディオフォールバック機能を使用している際、パブリッシャーのストリーム品質が低下した場合にもディスパッチされることがあります。詳しくは、 オーディオのフォールバックに関する開発者ガイド.videoDisableWarningLifted- 以前は無効になっていたビデオが有効になった。
について videoDisableWarning そして videoDisableWarningLifted イベントは OpenTok メディアルーター (メディアモードが「ルーティング」に設定されているセッション)ただし、 パブリッシャーのオーディオフォールバック機能, そこでは、イベントはルーティングまたは中継されたセッションで視聴可能となります。
デフォルトでは、加入者はビデオ無効警告インジケータとビデオ無効インジケータを表示します。 videoDisableWarning そして videoDisableWarningLifted イベントがディスパッチされます。インジケーターのデフォルト表示を無効にするには videoDisabledDisplayMode サブスクライバー・オブジェクトのスタイル設定。
次の例では videoDisabledDisplayMode ビデオ無効警告インジケータとビデオ無効インジケータを1秒ごとに点滅させるスタイル設定。 videoDisableWarning そして videoDisableWarningLifted イベントがディスパッチされる:
const indicatorBlinker = new IndicatorBlinker(subscriber);
const IndicatorBlinker = function(subscriber) {
const timer;
const indicatorOn = false;
subscriber.on({
videoDisabled: function(event) {
start();
},
videoDisableWarning: function(event) {
start();
},
videoDisableWarningLifted: function(event) {
stop();
},
videoEnabled: function(event) {
stop();
}
});
const start = function() {
subscriber.setStyle('videoDisabledDisplayMode', 'on');
if (timer) {
clearInterval(timer);
}
timer = setInterval(function() {
if (indicatorOn) {
subscriber.setStyle('videoDisabledDisplayMode', 'off');
} else {
subscriber.setStyle('videoDisabledDisplayMode', 'on');
}
indicatorOn = !indicatorOn;
}, 1000);
indicatorOn = true;
};
const stop = function() {
if (timer) {
clearInterval(timer);
}
};
};
を設定することもできます。 videoDisabledDisplayMode スタイル 'off' をベースに独自のユーザーインターフェイス要素を追加します。 videoDisableWarning, videoDisabled, videoDisableWarningLiftedそして videoEnabled のイベントがある。
パブリッシャーのイベントに基づいてUIを調整する
いつ パブリッシャー・オーディオ・フォールバック が有効になっている場合、Publisher オブジェクトは、品質条件の変化に応じてこれらのイベントをディスパッチします:
videoDisableWarning- パブリッシャーがストリームの品質が低下したと判断したときにディスパッチされ、品質がさらに低下するとビデオは無効になります。videoDisableWarningLifted- パブリッシャーが、ストリームの品質が改善され、無効化されているビデオが直ちに危険にさらされることはないと判断した場合にディスパッチされます。videoDisabled- ストリームの品質が低下し、送信ビデオ・トランスポートが無効になったとパブリッシャが判断した場合にディスパッチされます。注: 動画が無効になっても、パブリッシャはパブリッシング・クライアントのUIにパブリッシャの動画(カメラ画像など)を表示します。videoEnabled— 理由を明記して送信:qualityパブリッシャーが、ストリームの品質が向上したと判断し、動画の送信が再開されたとき。
デフォルトでは、パブリッシャーは videoDisableWarning そして videoDisabled が発生する。
について style プロパティの options のパラメータを使用する。 OT.initPublisher() が含まれるようになった。 videoDisabledDisplayMode プロパティ。次の設定を行うことができます。 videoDisabledDisplayMode プロパティを以下の文字列値のいずれかに設定することで、デフォルトのユーザーインターフェース要素の表示方法を制御できます:
auto(デフォルト) — 動画が再生停止状態にある場合、またはストリームの画質が低いために再生停止になる恐れがある場合、アイコンが自動的に表示されます。off- アイコンは表示されません。上記のイベントに基づいて、独自のユーザー・インターフェース通知を表示することができます。on— ストリームの画質が低いために動画が再生停止状態になった場合、または再生停止の恐れがある場合、アイコンが自動的に表示されます。
例えば、以下のコードは、デフォルトのビデオ無効化ユーザーインターフェイス要素を無効にし、関連イベントを処理します(独自のユーザーインターフェイス通知を提供できるようにします):
// Enabled
const publisher = OT.initPublisher('target', {
audioFallback: {
publisher: true,
},
style: {
videoDisabledDisplayMode: 'off',
}
});
publisher.on({
videoDisableWarning: () => {
// Custom action — for example, add custom UI notification
},
videoDisableWarningLifted: () => {
// Custom action — for example, remove custom UI notification
},
videoDisabled: () => {
// Custom action — for example, add custom UI notification
},
videoEnabled: () => {
// Custom action — for example, remove custom UI notification
},
});
を設定することもできます。 videoDisabledDisplayMode スタイルを動的に呼び出します。 Publisher.setStyle() メソッドを使用する:
publisher.setStyle('videoDisabledDisplayMode', 'off');
// Alternately:
publisher.setStyle({
videoDisabledDisplayMode: 'off',
// other styles ...
});
動画に内蔵されたすべてのユーザーインターフェイスコントロールを非表示にする
パブリッシャ・オブジェクトとサブスクライバ・オブジェクトには、以下の組み込みユーザ・インターフェース・コントロールが含まれます:
- ストリーム名の表示
- オーディオ・レベル・インジケータ
- 音声ミュートボタン
- ビデオ無効インジケータとビデオ無効警告アイコン(加入者のみ)
を設定することで、これらすべてを無効にすることができます。 showControls プロパティ false での properties パラメータに渡す OT.initPublisher() メソッドまたは Session.subscribe() メソッドを使用する。
例えば、以下のコードでは、組み込みのユーザ・インターフェイス・コントロールを含まないPublisherオブジェクトが作成されます:
const publisherOptions = {
showControls: false
};
const publisher = OT.initPublisher(
'publisher-element-id', // Replace with the replacement element ID
publisherOptions
);
次のコードでは、組み込みのユーザー・インターフェース・コントロールを含まないサブスクライバー・オブジェクトを作成します:
const subscriberOptions = {
showControls: false
};
const subscriber = session.subscribe(stream,
'subscriber-element-id', // Replace with the replacement element ID
subscriberOptions
);
個々のユーザーインターフェースコントロールの表示は、 showControls プロパティを true (デフォルト設定)の場合は、以下のトピックを参照してください:
パブリッシャーまたはサブスクライバーの Video 要素に直接アクセスする
パブリッシャまたはサブスクライバのデフォルトのユーザー・インターフェース要素を無効にし、HTMLにアクセスすることができます。 Video 要素を直接指定します。ストリームを公開または購読するときは insertDefaultUI プロパティ false を呼び出すときに OT.initPublisher() または Session.subscribe() メソッド。このオプションを false, OpenTok.js は HTML DOM にデフォルトの UI 要素を挿入せず、その element Publisher または Subscriber オブジェクトのプロパティが未定義です。その代わりに、Publisher 要素は videoElementCreated イベント Video 要素が作成されます。その element イベントオブジェクトのこのプロパティは、 Video 要素。これをHTML DOMに追加して、動画を表示します。
次のコードはパブリッシャーを初期化し、その Video 要素をHTML DOMに追加する:
const publisher = OT.initPublisher({insertDefaultUI: false});
publisher.on('videoElementCreated', function(event) {
document.getElementById('publisher-video-parent-id').appendChild(event.element);
});
以下のコードは、ストリームを購読し、そのストリームに Video 要素をHTML DOMに追加する:
const subscriber = session.subscribe(stream, {insertDefaultUI: false});
subscriber.on('videoElementCreated', function(event) {
document.getElementById('subscriber-video-parent-id').appendChild(event.element);
});
を設定した場合 insertDefaultUI プロパティ falseを設定しないでください。 targetElement パラメータを呼び出す際に OT.initPublisher() または Session.subscribe().(これはエラーになる)。
デフォルトのユーザーインターフェイス要素には、ビデオのほかに、ユーザーインターフェイスコントロール、ビデオのロードインジケータ、ビデオの自動トリミングまたはレターボックスが含まれます。もし insertDefaultUI に設定する。 true (デフォルト)を使用して、個々のユーザーインターフェイス設定を制御することができます。 fitMode, showControlsそして style オプションを使用します。このページの他のトピックを参照してください。
また、購読者の MediaStream オブジェクトにアクセスして(それを自分の Video 要素)。次のセクションを参照してください。
Media Stream Available APIによるパブリッシャーおよびサブスクライバーのMediaStreamオブジェクトへのアクセス
MediaStreamオブジェクトにアクセスするには mediaStreamAvailable イベントがディスパッチされます。Media Stream Available API は 2.27.7 で利用可能になりました。 バージョン2.27.7以前のサブスクライバのMediaStreamオブジェクトへのアクセス 下記リンクのガイドを参照。
重要な注意事項
- PublisherオブジェクトとSubscriberオブジェクトは、ミュートや切断など、Video APIのあらゆる側面を制御するために使用されるべきである。
- オーディオは、カスタム・エレメントとパブリッシャまたはサブスクライバ・ウィジェットの両方を通して再生されます。カスタムエレメントは、エコーを避けるためにミュートする必要があります。
- シルエットや動画コントロールなどのOpenTok Chrome機能は表示されません。
- MediaStreamオブジェクトは、アダプティブ・メディア・ルーティングによっ て引き起こされるすべての変更をアカウントする。
以下は、Media Stream Available APIを使用したReact Session、Subscriber、Publisherコンテキストフックの例である。この例では React を使用していますが、Media Stream Available API はフレームワークに依存しません。リスナーは、コールバックの一部としてではなく、パブリッシャーとサブスクライバーが作成された直後にアタッチする必要があることに注意してください。
セッション・コンポーネント
const [subscriberStream, setSubscriberStreams] = useState([]);
async function subscribe(stream, session, options = {}) {
if (session) {
const subscriber = session.current.subscribe(stream, null, { ...options, insertDefaultUI: false });
subscriber.on('mediaStreamAvailable', ({ mediaStream }) => {
setSubscriberStreams((prev) => [...prev, { mediaStream, subscriber }]);
});
}
}
加入者コンポーネント
import { useEffect, useRef } from 'react';
const Subscriber = ({ subscriber, mediaStream }) => {
const videoRef = useRef(null);
useEffect(() => {
if (mediaStream) {
videoRef.current.srcObject = mediaStream;
}
}, [mediaStream]);
return (
<video
ref={videoRef}
autoPlay
id={subscriber.streamId}
playsInline
muted
></video>
);
}
export default Subscriber;
パブリッシャーコンポーネント
import { useEffect, useRef } from 'react';
const Publisher = ({ publisher, mediaStream }) => {
const videoRef = useRef(null);
useEffect(() => {
if (mediaStream) {
videoRef.current.srcObject = mediaStream;
}
}, [mediaStream]);
return (
<video
ref={videoRef}
autoPlay
id={publisher.streamId}
playsInline
muted
></video>
);
}
export default Publisher;
バージョン2.27.7以前のサブスクライバのMediaStreamオブジェクトへのアクセス
なお、前述の「Media Stream Available API」は、MediaStreams にアクセスするための推奨される方法です。この回避策が必要となるのは、OpenTok バージョン 2.27.7 以前の場合のみです。
サブスクライバーが使用する MediaStream オブジェクトにアクセスできます。HTMLVideoElement オブジェクト( videoElementCreated 前節で説明した、サブスクライバーによってディスパッチされたイベント)には srcObject プロパティを含む。これは、サブスクライバのオーディオ ビデオ ストリームの MediaStream オブジェクトです。この MediaStream オブジェクトを別の Video 要素(その srcObject プロパティ):
session.on('streamCreated', function(event) {
const subscriber = session.subscribe(event.stream, { insertDefaultUI: false });
subscriber.on('videoElementCreated', event => {
// myVideoElement is a Video element you have created:
myVideoElement.srcObject = event.element.srcObject;
});
});
を使用するルーティング・セッションでは アダプティブ・メディア・ルーティングセッションが中継ストリームからルーティングストリームに切り替わると、加入者 のMediaStreamが変更される可能性がある(このセクションを参照)。 ヘルプセンターのナレッジベース記事).のイベント・リスナーを追加する。 play イベントを使用して、更新された MediaStream インスタンスを取得します:
session.on('streamCreated', function(event) {
const subscriber = session.subscribe(event.stream, { insertDefaultUI: false });
subscriber.on('videoElementCreated', event => {
// myVideoElement is a Video element you have created:
myVideoElement.srcObject = event.element.srcObject;
myVideoElement.play()
event.element.addEventListener('play', () => {
// The MediaStram has changed
myVideoElement.srcObject = event.element.srcObject;
myVideoElement.play();
});
});
});