音声だけが聞こえない問題。。

802 views
Skip to first unread message

miyamoto

unread,
Aug 31, 2016, 6:37:43 AM8/31/16
to SkyWay Technical Forum
お世話になります。

片方あるいは両方の音声のみが聞こえない問題が1/10くらいで発生しています。
1000回に10回くらい発生してます。

ブラウザを閉じず一度peerを切って再度peerに接続しても治る場合と治らない場合が結構あります。

数回来る返したら治る場合があり、または数回繰り返しても治らない場合があります。。

ブラウザを閉じたり画面を遷移させるとかなり高い確率で復旧することがあります。

chrome://webrtc-internalsで確認するとaudioが完全に送られてない 0 のままです。

もし同じ事例があればどう解決したか教えていただけすでしょうか?

よろしくお願いします。

Yusuke NAKA

unread,
Aug 31, 2016, 9:19:15 AM8/31/16
to SkyWay Technical Forum
miyamoto 様

SkyWay開発チームの仲です。
ご報告ありがとうございます。

webrtc-internalsをご利用ということなので、Chromeを利用してWebアプリケーションとして利用されているという認識でよろしいでしょうか?
発生条件をもう少し詳しく教えていただけないでしょうか?

- Chromeのバージョン
- Peerそれぞれが利用するネットワーク環境(例えば、LTEルーターや家庭用インターネット回線等)
- アプリケーションの実装方法(SkyWayを利用する部分はどのような処理になっているのか、可能な範囲で結構です)

等具体的な条件を記載いただければ、類似の事例が出てくる可能性も高くなると考えます。
よろしくお願いいたします。

2016年8月31日水曜日 19時37分43秒 UTC+9 miyamoto:

miyamoto

unread,
Sep 2, 2016, 3:45:40 AM9/2/16
to SkyWay Technical Forum
仲様

お世話になります。

- Chromeのバージョン
- Peerそれぞれが利用するネットワーク環境(例えば、LTEルーターや家庭用インターネット回線等)
こちらですが様々な環境なので確定ができない状況です。。(一日2000回以上のpeer接続)


- アプリケーションの実装方法(SkyWayを利用する部分はどのような処理になっているのか、可能な範囲で結構です)


*CALLEE*
- close existing peer connections
- disconnect peerjs, if connected
- connect to PeerJS
- on connect, emit "startCall", with peer id, to CALLER to call CALLEE


// reset peer
resetPeer();

// initiate peer
initializePeer();

上記の2つのメッソドを使って音声が聞こえない場合一度切って再度peerにアクセスする仕組みですが、

聞かない場合が多いです。

もし接続確立やdisconnectの際に他のメッソドなどを使ったほうがよかったりしますか?


function resetPeer(){
/* reset peer */
try {
/* drop all previous connections */
if (
typeof connect.peer.connections !== 'undefined' &&
connect.peer.connections.length !== 0
) {
console.warn("[RESET_PEER] resetting peer connections");
var connectedPeers = connect.peer.connections;
/* loop through previous connections */
for (var peerConnections in connectedPeers) {
/* if had multiple connections */
if (connectedPeers[peerConnections].length !== 0) {
for (var i = 0; i < connectedPeers[peerConnections].length; i++) { 
if (typeof connectedPeers[peerConnections][i] === 'undefined') { continue; }
console.warn("[RESET_PEER] closing peer connection -> " + peerConnections + " || " + connectedPeers[peerConnections][i].open);
connectedPeers[peerConnections][i].close();
}
}
}
}
connect.peer.disconnect();
/* catch error */
} catch (ex){}
}



/* initialize peer */
con.initializePeer = function(callback){
/* connect to the peerjs server */
element.peer = new Peer(connect.config.peerID, {
host: element.signalHost,
port: element.signalPort,
debug: 2,
path: '/peerjs',
secure: true,
config: { iceServers: element.iceServers } // THIS IS USING TWILIO ICE SERVERS
});
element = this;
/* catch peerjs events */
element.peer
/* catch when connection is opened */
.off('open').on('open', function(id){
/* set the peerID */
element.config.peerID = id;
/* if student, inform the teacher to call him/her */
if (element.config.memberType == 'CALLEE') { callee.startCall(id); }
/* if teacher, call student */
if (element.config.memberType == 'CALLER' && connect.peerID !== false) { 
caller.callCallee({content: {peerID: connect.peerID}}); 
}
/* if has callback execute callback */
if ($.isFunction(callback)) { callback(); }
})

/* catch when a call is received */
.off('call').on('call', function(call){
/* answer and stream the call */
call.answer(connect.cameraStream);
call.off('stream').on('stream', function(stream){
/* set needed vars */
connect.peerStream = stream;
/* peer camera */
$(constant.peerCamera).prop("src", window.URL.createObjectURL(stream)).show();
})
/* catch when the current call is dropped */
.off('close').on('close', function(){
console.warn("[PEER_CALL] connection was dropped");
});
})
/* catch when peerJS closes. this is also triggered when the peer closes his/her connection */
.off('close').on('close', function(){
console.warn("[PEER_CALL] connection was closed");
})

/* catch if any errors occur during peer connection */
.off('error').on('error', function(error){
console.warn("[PEERJS ERROR] " + error);
try { element.peer.disconnect(); } catch (ex) {}
});
};




*CALLER*
- receive "startCall" emit with peer id
- if not connected to PeerServer, connect. else, skip
- on connect call CALLEE

connect.socket.on("startCall", function(id){
// reset peer
resetPeer();

  // traps here
if (connect.peer !== null && connect.peer.disconnected === false) {
caller.callCallee(id);
return;
}
// initiate peer
initializePeer();
})

caller.callCallee = function(peerID){
/* call student */
connect.peer.call(
peerID, 
connect.cameraStream,
{
'constraints': {
'mandatory': {
'OfferToReceiveAudio': true,
'OfferToReceiveVideo': true
}
}
}
);
}



後、peer serverを独自で立てていますが特別なことはやっておりません。

*PEER SERVER (independent)
```
/* set server functions */
var server     = require('https').createServer(ssl.options, app);
var io         = require("socket.io").listen(server, socketConfig);
var socket     = io.sockets;
var peer       = require("peer").ExpressPeerServer;

/* set app engine */
app.use('/peerjs', peer(server, {debug: true}));

/* listen to default port 0.0.0.0 */
var server = server.listen(ssl.port, "0.0.0.0", function(){ 
util.log("[SOCKET] listening to port " + ssl.port, 'green'); 
logger.dbInit(db);

});
```
以上、よろしくお願いします。



2016年8月31日水曜日 21時19分15秒 UTC+8 Yusuke NAKA:

Yusuke NAKA

unread,
Sep 12, 2016, 4:39:24 AM9/12/16
to SkyWay Technical Forum
miyamoto 様

仲です。
返信が遅くなり申し訳ありません。



- Chromeのバージョン
- Peerそれぞれが利用するネットワーク環境(例えば、LTEルーターや家庭用インターネット回線等)
こちらですが様々な環境なので確定ができない状況です。。(一日2000回以上のpeer接続)


承知しました。



function resetPeer(){
/* reset peer */
try {
/* drop all previous connections */
if (
typeof connect.peer.connections !== 'undefined' &&
connect.peer.connections.length !== 0
) {
console.warn("[RESET_PEER] resetting peer connections");
var connectedPeers = connect.peer.connections;
/* loop through previous connections */
for (var peerConnections in connectedPeers) {
/* if had multiple connections */
if (connectedPeers[peerConnections].length !== 0) {
for (var i = 0; i < connectedPeers[peerConnections].length; i++) { 
if (typeof connectedPeers[peerConnections][i] === 'undefined') { continue; }
console.warn("[RESET_PEER] closing peer connection -> " + peerConnections + " || " + connectedPeers[peerConnections][i].open);
connectedPeers[peerConnections][i].close();
}
}
}
}
connect.peer.disconnect();
/* catch error */
} catch (ex){}
}




connect.peer.disconnect() ですが、シグナリングサーバとの接続を切断しますが、Peer同士の接続は切れません。
その前段で .MediaConnection.close() しているためPeer同士の切れているはずですが、念の為に peer.destory() を使ってみてはいかがでしょうか?
peer.destory()は全てのMediaConnectionを切断したうえでサーバへの接続も切断します。
見たところ、音が聞こえない要因を作りこむような処理はないようですね。
(独自実装されているシグナリングサーバ部分については、わかりかねます)

音声以外に映像の通信もやられていますよね?
映像と音声が同時に通らないようであれば、利用者間の通信環境に依存している可能性もありますが、音声のみ聞こえなくなるのでしょうか?
Reply all
Reply to author
Forward
0 new messages