私は実際に NodeJS、ws、WebRTC.io、および socket.io に基づくアプリケーションに取り組んでいます。このアプリケーションの目的は、ホストのビデオを複数の出席者にブロードキャストすることです。
主催者とすべての出席者が Web アプリケーションをロードし、主催者がビデオを起動してすべての出席者にストリーミングします。この場合、問題はありませんが、主催者がビデオを起動し、出席者が部屋に参加した場合、この出席者はストリームを取得できず、このストリームを取得する方法がわかりません.
私は多くの解決策を試しました。
最初の解決策
出席者が部屋に到着すると、彼は socket.io を介してホストにメッセージを送信し、ホストは彼のストリームを送り返します。問題は、ストリームが MediaStream ではなくオブジェクトとして出席者に届くため、使用できないことです。
2番目のソリューション
出席者が部屋に到着すると、socket.io を介してホストにメッセージを送信し、ホストは で作成された BLOB を返信しwindow.webkitURL.createObjectURL(rtc.streams[0])
ます。この BLOB を出席者のビデオ ソースとして使用しますが、404 エラーが発生します。
両方のソリューションのコードは次のとおりです。
var isStreamCreated = false;
function startVideoLive() {
var video = document.getElementById('video');
//Test if peer connection is available for the browser
if (PeerConnection) {
if (getRole() == 1) {
rtc.createStream({
"video": true,
"audio": true
}, function (stream) {
video.src = URL.createObjectURL(stream);
video.play();
isStreamCreated = true
});
}
}
if (isConnected != true) {
var room = '1234';
rtc.connect('ws://' + server + ':8443', room);
isConnected = true;
}
}
function setAttendeeWebRTC() {
if (getRole() == 0) {
var message = {
type: "getStreamInfos",
URL: null,
stream: null
}
socket.emit('message', message);
rtc.on('add remote stream', function (stream, socketId) {
rtc.attachStream(stream, 'video');
isStreamCreated = true;
});
}
}
startVideoLive();
setAttendeeWebRTC();
function onGetStreamInfos(message) {
if (getRole() == 1 && isStreamCreated == true) {
message.URL = window.webkitURL.createObjectURL(rtc.streams[0]);
message.stream = rtc.streams[0];
socket.emit('message', message);
} else if (getRole() == 0 && isStreamCreated == false && message.URL != null && message.stream != null) {
document.getElementById('video').src = message.URL;
// OR
rtc.attachStream(message.stream, 'video')
isStreamCreated = true;
}
}
getRole() は、接続しているユーザーが出席者 (0) か主催者 (1) かを知るために使用されます。
サーバー側では、websocket メッセージをブロードキャストし、webrtc.io を追加します (その他にも多くの機能がありますが、この場合は役に立ちません)。
2 ケースのエラーは次のとおりです。
ブロブの場合: GET blob:http%3A//128.1.222.159%3A8081/881928b6-70d3-4054-b15e-88d635a2125f 404 (見つかりません)
ストリームの場合: Uncaught TypeError: Type error
rtc.attachStream
onGetStreamInfos
(匿名関数)
EventEmitter.emit socket.io.js? =1375350434038:633
SocketNamespace.onPacket socket.io.js? =1375350434038:2248
Socket.onPacket socket.io.js? =1375350434038:1930
Transport.onPacket socket.io.js? =1375350434038:1332
Transport.onData socket.io.js?_=1375350434038:1303
WS.open.websocket.onmessage
誰かが私の問題に対処する方法についてアイデアを持っている場合は、事前に感謝します.
編集1:
問題を解決する方法を見つけましたが、新しい問題があります。ここに私の部分的な解決策があります:
function onGetStreamInfos(message) {
if (getRole() == 1 && isStreamCreated == true) {
rtc.createPeerConnections();
rtc.addStreams();
rtc.addDataChannels();
rtc.sendOffers()
} else if (getRole() == 0 && isStreamCreated == false) {
isStreamCreated = true;
}
}
しかし今、出席者が部屋に参加すると、他の出席者はビデオを失いました。通常、新しい参加者と古い参加者の間にピア接続を作成するべきではないためだと思います。
非常に明確かどうかはわかりませんが、さらに情報が必要な場合はお気軽にお問い合わせください。最終的に問題を解決する方法が見つかった場合は、ここで解決策を提供します.
編集2:
削除するrtc.createPeerConnections();
とrtc.addDataChannels();
、ほとんどの場合に機能するようです(あまりテストしていません)。