WebRTC流在第一帧之后冻结

时间:2015-02-25 20:09:01

标签: javascript google-chrome video-streaming webrtc chromium

这是交易,我使用以下方式进行了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域,其他所有内容都是默认密钥。

2 个答案:

答案 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?