这是交易,我使用以下方式进行了WebRTC 1对话:
一切似乎都运转良好,但有一个问题:
Chrom *浏览器仅显示视频的第一帧,然后视频冻结,以及音频。看看Chromium流程网络和CPU使用情况,它正在获取和解码视频,但没有显示它。这是我的代码:
window.webrtc = new SimpleWebRTC({
localVideoEl: 'local',
remoteVideosEl: 'remote',
autoRequestMedia: true,
debug: true,
url: 'https://server.server:8888/'
});
window.webrtc.on('videoAdded', function (video, peer) {
var remotes = document.getElementById('remote');
if (remotes) {
var container = document.createElement('div');
container.className = 'videoContainer';
container.id = 'container_' + webrtc.getDomId(peer);
container.appendChild(video);
video.oncontextmenu = function () {
return false;
};
remotes.appendChild(container);
if (peer) {
peer.on('iceConnectionStateChange', function (event) {
switch (peer.pc.iceConnectionState) {
case 'checking':
$('#status').text('Connecting...');
break;
case 'connected':
case 'completed': // on caller side
$('#status').text('Connected');
break;
case 'disconnected':
$('#status').text('Disconnected');
break;
case 'failed':
$('#status').text('Failed to connect');
break;
case 'closed':
$('#status').text('Connection closed');
$('#remote').empty();
break;
}
});
}
}
});
window.webrtc.on('readyToCall', $.ajax({
url: '/getroom.php',
success: function (data) {
window.webrtc.joinRoom(data);
}
}));
<p id="status">Waiting...</p>
<video id="local" width="300" height="225" autoplay></video>
<div id="remote"></div>
Signalmaster:
{
"uid": "nobody",
"isDev": true,
"logLevel": 3,
"server": {
"port": 8888,
"secure": true,
"key": "key.key",
"cert": "cer.cer"
},
"stunservers" : [
{
"url": "stun:server.server:3478"
}
],
"turnservers" : [
{
"url": "turn:server.server:3478",
"secret": "qgJeuJuIyeqX",
"expiry": 86400
}
]
}
CoTurn服务器配置为qgJeuJuIyeqX
密钥和server.server
域,其他所有内容都是默认密钥。
答案 0 :(得分:2)
Chrome似乎是一个问题,重新附加视频元素会导致视频冻结。解决方案是只添加一次视频元素。通过将remoteVideosEl部分留空来解决这个问题:
window.webrtc = new SimpleWebRTC({
localVideoEl: 'local',
remoteVideosEl: '',
autoRequestMedia: true,
debug: true,
url: 'https://server.server:8888/'
});
这样SimpleWebRTC不会自动为您附加视频元素,因此当调用'videoAdded'方法时,您可以第一次附加视频。
答案 1 :(得分:0)
另一种选择是为DOM元素调用.play(),因此它将启动视频/音频传输。要避免在控制台中出现异常,可以使用此修补程序:How to prevent "The play() request was interrupted by a call to pause()" error?