受信のみモードを併用した多人数でのSFUの利用
<背景>
十人程度の人数がディスカッションを可能なルームを作成しようと思っております。
SFUモードを用いているのですが、7人程度以上になると、動作が不安定になるように思われました。
なので、5人程度はディスカッションし、あとは受信のみのモードで利用することで、
負荷をさげようかと考えました。
<発生現象>
受信モードでpeer.joinRoomを実行すると、room.on("stream")が呼ばれない。
よって、話している人のstreamが取得できず、音声の再生の方法がわかりません。
room.on("peerJoin")は呼ばれているので、peerIdは取得できます。
<環境>
Chrome: Version 55.0.2883.87 (64-bit)
OS Ubuntu 16.04 Windows7
<期待される事象>
受信モードでの、音声再生方法が知りたいです。
<コメント>
この質問ですが、受信モードにて参加する割合を増やせば、全体としてroomに参加できる人がふえるのではないか? という仮定をもとにした質問となります。もしその仮定自体が間違いであればそれもご指摘いただけますと幸いです。
何卒よろしくお願い致します。
-
peer.joinRoom()の受信のみモード(Streamを指定しない)ですが、SFUで利用した場合、映像が表示されるまでに数十秒掛かるようです。SkyWayの不具合の可能性があるため、継続調査させて頂きます。
ご報告ありがとうございます。
受信のみモードを利用すれば、端末側の負荷を軽減できるため、参加者を増やすことは可能だと思います。
受信のみモードを使わずに負荷を軽減する手立てとして、受信者のgetUserMediaの設定を変更し、widthとheightを最小サイズにし、且つ、ミュート処理を行うことで、同様の効果が得られるかもしれません。
ミュート処理の一例ですが、以下のようにすることでオーディオトラックとビデオトラックのミュートが可能です。
let tempVideoTrack = stream.getVideoTracks()[0];
let tempAudioTrack = stream.getAudioTracks()[0];
tempVideoTrack.enabled = false;
tempAudioTrack.enabled = false;
let mutedStream = new MediaStream();
mutedStream.addTrack(tempVideoTrack);
mutedStream.addTrack(tempAudioTrack); -
お世話になっております。
このトピックと同じと思われる現象が発生した為、追記させて頂きます。<環境>
SkyWayJS 1.0.1
Windows 10
Chrome Ver 61.0.3163.100<現象>
SFURoom使用時、
後から参加したクライアントが、受信モードでpeer.joinRoomを実行すると、room.on("stream")が呼ばれない。
但し、さらに別のクライアントから peer.joinRoomすると、前のクライアントで rooom.on('stream')が呼ばれる様子。例)
AさんがSFURoomで配信中、Bさんが受信モードで接続すると、Aさんの配信が表示されない。
但し Cさんが接続すると、Bさんのクライアントで表示されるようになります。
但し Cさんが受信モードで繋いだ場合は、Cさんのクライアントでは表示されない。どうやら受信モードで表示されない場合
どこかで peer.join または leave が発生すれば正常に表示されるようになる様子です。とりあえず、私の開発中の環境では
暫定対応として、受信モードのSFURoomのOpen後、ダミーのPeerを接続(すぐに解除)する事で
期待する動作となりました。 -
上記と似た現象で、こちらの環境ではSFURoomのstreamイベントは発火するけど、MediaStreamで映像が転送され始めるのが他クライアントが参加した後という感じです。
SFURoomのopenイベントのコールバックで下記のような処理を呼び出してwork-aroundしています。
function dummyConnect(apiKey, roomName) {
var dummyPeer = new Peer({
key: apiKey,
debug: 0
});
dummyPeer.on("open", function() {
var dummyRoom = dummyPeer.joinRoom(roomName, {
mode: "sfu"
});dummyRoom.on("open", () => {
dummyRoom.close();
dummyRoom.on("close", () => {
dummyPeer.disconnect();
});
});
});
} -
>Yusuke Naka 様
こちらの問題は解決していますでしょうか?
-
【報告】
受信モードであれこれワークアラウンドしてみたのですが、結局うまくいかなかったので、双方向モードでやりとりをすることにしました。
(どういう状況で「うまくいかない」のか把握するまでには至りませんでした…)
ですが、双方向モードでも「streamイベントは発火するが、mediastreamが転送されない」(=ビデオが真っ白)という状態が起きました。
この問題にも、鶴屋様のワークアラウンドで対処できました。ほぼ似たようなものですが、もし同じ問題で困っていらっしゃる方がいた場合、以下のコードをお使いいただければ解決すると思います。
function dummy() {
let dummyPeer = new Peer("dummy", {
key: 'API KEY',
debug: 3
});dummyPeer.on('open', function(id) {
let dummyRoom = dummyPeer.joinRoom(roomName, {mode: 'sfu'});dummyRoom.on('open', function() {
dummyPeer.disconnect();
});
});
}room.on('open', function() {
dummy();
})
サインインしてコメントを残してください。
コメント
13件のコメント