【问题标题】:No video play after reload page with simple-peer使用 simple-peer 重新加载页面后没有视频播放
【发布时间】:2020-06-08 07:12:02
【问题描述】:

目前,使用该程序将视频从一个客户端(流媒体)流式传输到另一个(观众)已经实现。一切正常,直到查看者重新加载页面。尽管传输了流,但他的视频消失了(这可以在控制台中看到)。有什么问题?

Streamer.js

useEffect(() => {
    navigator.mediaDevices
        .getUserMedia({
            video: true,
            audio: true,
        })
        .then(stream => {
            // Display own video
            localVideo.current.srcObject = stream;

            // Stream video to attendees
            gotMedia(stream);
        })
        .catch(error => {
            console.error(error);
        });
}, []);

const gotMedia = stream => {
    localStream.current = stream;
    broadcaster.current = new Peer({
        initiator: true,
        stream: localStream.current,
        config: configuration,
        offerConstraints: {
            offerToReceiveAudio: true,
            offerToReceiveVideo: true,
        },
    });
    broadcaster.current.on('signal', data => {
        socket.emit('signal', { data, room: routeMatch.params.id });
    });
    // destroy current peerconnection and create a new one
    socket.on('startConnection', () => {
        console.log('startConnection');
        if (broadcaster.current) broadcaster.current.destroy();
        broadcaster.current = new Peer({
            initiator: true,
            stream: localStream.current,
            config: configuration,
            offerConstraints: {
                offerToReceiveAudio: true,
                offerToReceiveVideo: true,
            },
        });
        broadcaster.current.on('signal', data => {
            socket.emit('signal', { data, room: routeMatch.params.id });
        });
    });
    socket.on('signal', data => {
        broadcaster.current && broadcaster.current.signal(data);
    });
};

Viewer.js

useEffect(() => {
    attendee.current = new Peer({
        initiator: false,
        config: configuration,
        answerConstraints: {
            offerToReceiveAudio: false,
            offerToReceiveVideo: false,
        },
    });
    attendee.current.on('signal', data => {
        socket.emit('signal', { data, room: routeMatch.params.id });
    });

    socket.on('signal', data => {
        attendee.current && attendee.current.signal(data);
    });

    // Get remote video stream and display it
    attendee.current.on('stream', stream => {
        console.log('stream', stream);
        console.log('remoteVideo.current.srcObject before', remoteVideo.current.srcObject);
        remoteVideo.current.srcObject = stream;
        console.log('remoteVideo.current.srcObject after', remoteVideo.current.srcObject);
    });

    // Ask broadcaster to start his connection
    socket.emit('startConnection', routeMatch.params.id);

    return () => {
        attendee.current.destroy();
    };
}, []);

重新加载页面后,我们看到有一个流,但是由于某种原因视频没有播放(console.log('remoteVideo.current.srcObject after', remoteVideo.current.srcObject);

【问题讨论】:

    标签: node.js reactjs socket.io webrtc simple-peer


    【解决方案1】:

    问题在于,当您使用ìnitialize: true 在流媒体中初始化您的 Peer 时,它会尝试直接使用给定的设置进行连接。当您重新加载查看器时,它不会收到任何信号,因为流媒体会发送此初始化一次。

    解决方案是在观看者连接后立即在流媒体中创建一个新的 Peer 对象。 (并在查看器断开连接时删除该对象)。

    这里有一个github project (demo),您可以以此为灵感来扩展您的项目。

    【讨论】:

    • 按照您的建议,我这样做了。一旦查看器连接,我就销毁当前对等体并在注释// destroy current peerconnection and create a new one之后在方法gotMedia中创建一个新的对等体@
    • 否:(重新加载页面后视频不播放
    • @zXus 看看this 怎么去掉。我现在看不到你的代码,很难说你做错了什么。
    • @zXus 如果您的问题已解决,您可以将答案视为已解决
    猜你喜欢
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多