WebRTC 流在第一帧后冻结
WebRTC streams freeze after first frame
这是交易,我有一个 WebRTC 1 对 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>
信号主管:
{
"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
领域,其他一切都是默认值。
似乎是 Chrome 中的一个问题,即重新附加视频元素会导致视频冻结。解决方案是只添加一次视频元素。我通过将 remoteVideosEl 部分留空来解决这个问题:
window.webrtc = new SimpleWebRTC({
localVideoEl: 'local',
remoteVideosEl: '',
autoRequestMedia: true,
debug: true,
url: 'https://server.server:8888/'
});
这种方式SimpleWebRTC不会自动为你附加视频元素,所以当调用'videoAdded'方法时你可以第一次附加视频。
另一种选择是为 DOM 元素调用 .play(),因此它将开始 video/audio 传输。为避免控制台出现异常,您可以使用此修补程序:
这是交易,我有一个 WebRTC 1 对 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>
信号主管:
{
"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
领域,其他一切都是默认值。
似乎是 Chrome 中的一个问题,即重新附加视频元素会导致视频冻结。解决方案是只添加一次视频元素。我通过将 remoteVideosEl 部分留空来解决这个问题:
window.webrtc = new SimpleWebRTC({
localVideoEl: 'local',
remoteVideosEl: '',
autoRequestMedia: true,
debug: true,
url: 'https://server.server:8888/'
});
这种方式SimpleWebRTC不会自动为你附加视频元素,所以当调用'videoAdded'方法时你可以第一次附加视频。
另一种选择是为 DOM 元素调用 .play(),因此它将开始 video/audio 传输。为避免控制台出现异常,您可以使用此修补程序: