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 传输。为避免控制台出现异常,您可以使用此修补程序: