微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法与 peer.js 进行视频聊天

如何解决无法与 peer.js 进行视频聊天

我正在关注 this website 以进行视频通话作为反应。 我为我的纯 javascript 项目稍微更改了 connection.js 中的代码,但其他文件与教程相同。 这是我的 connection.js

import openSocket from 'socket.io-client';
import Peer from 'peerjs';


let socketInstance = null;
let peers = {};


const initializePeerConnection = () => {
    return new Peer('',{
        host: 'localhost',port: 9000,secure: false //secure=true is https and wss. secure=false is http and ws
    });
    //return new Peer()
}
const initializeSocketConnection = () => {
    const socket = openSocket('http://localhost:5000');
    return socket
}
class Connection {
    videoContainer = {};
    message = [];
    settings;
    streaming = false;
    myPeer;
    socket;
    myID = '';
    constructor(settings) {
        this.settings = settings;
        this.myPeer = initializePeerConnection();
        this.socket = initializeSocketConnection();
        this.initializeSocketEvents();
        this.initializePeersEvents();
    }
    initializeSocketEvents = () => {
        this.socket.on('connect',() => {
            console.log('socket connected');
        });
        this.socket.on('user-disconnected',(userID) => {
            console.log('user disconnected-- closing peers',userID);
            peers[userID] && peers[userID].close();
            this.removeVideo(userID);
        });
        this.socket.on('disconnect',() => {
            console.log('socket disconnected --');
        });
        this.socket.on('error',(err) => {
            console.log('socket error --',err);
        });
    }
    initializePeersEvents = () => {
        this.myPeer.on('open',(id) => {
            this.myID = id;
            const roomID = window.location.pathname.split('/')[2];
            const userData = {
                userID: id,roomID
            }
            console.log('mydata::',userData)
            this.socket.emit('join-room',userData);
            this.setNavigatorToStream();
        });
        this.myPeer.on('error',(err) => {
            console.log('peer connection error',err);
            this.myPeer.reconnect();
        })
    }
    setNavigatorToStream = () => {
        this.getVideoAudioStream().then((stream) => {
            if (stream) {
                this.streaming = true;
                this.createVideo({ id: this.myID,stream });
                this.setPeersListeners(stream);
                this.newUserConnection(stream);
            }
        })
    }
    getVideoAudioStream = (video=true,audio=true) => {
        let quality = this.settings.params?.quality;
        if (quality) quality = parseInt(quality);
        const myNavigator = navigator.mediaDevices.getUserMedia || 
        navigator.mediaDevices.webkitGetUserMedia || 
        navigator.mediaDevices.mozGetUserMedia || 
        navigator.mediaDevices.msGetUserMedia;
        return myNavigator({
            video: video ? {
                frameRate: quality ? quality : 12,noiseSuppression: true,width: {min: 640,ideal: 1280,max: 1920},height: {min: 480,ideal: 720,max: 1080}
            } : false,audio: audio,});
    }
    createVideo = (createObj) => {
        console.log('video created')
        if (!this.videoContainer[createObj.id]) {
            this.videoContainer[createObj.id] = {
                ...createObj,};
            const roomContainer = document.getElementById('room-container');
            const videoContainer = document.createElement('div');
            const video = document.createElement('video');
            video.srcObject = this.videoContainer[createObj.id].stream;
            video.id = createObj.id;
            video.autoplay = true;
            if (this.myID === createObj.id) {
                video.muted = true;
                video.className = 'my_video'
            }
            videoContainer.appendChild(video)
            roomContainer.append(videoContainer);
        } else {
            const video = document.getElementById(createObj.id)
            video.srcObject = createObj.stream
        }
    }
    setPeersListeners = (stream) => {
        //stream is my stream
        this.myPeer.on('call',function(call) {
            console.log('answered!!')
            call.answer(stream);
            call.on('stream',(userVideoStream) => {
                console.log('user stream data',userVideoStream)
                this.createVideo({ id: call.Metadata.id,stream: userVideoStream });
            });
            call.on('close',() => {
                console.log('closing peers listeners',call.Metadata.id);
                this.removeVideo(call.Metadata.id);
            });
            call.on('error',() => {
                console.log('peer error ------');
                this.removeVideo(call.Metadata.id);
            });
            peers[call.Metadata.id] = call;
        });
    }
    newUserConnection = (stream) => {
        //stream is my stream
        this.socket.on('new-user-connect',(userData) => {
            this.connectToNewUser(userData,stream);
        });
    }
    connectToNewUser(userData,stream) {
        console.log('connectTonewUser is called')
        const { userID } = userData;
        const call = this.myPeer.call(userID,stream,{ Metadata: { id: this.myID }} );
        console.log('your data:: new user connected',userData)
        call.on('stream',(userVideoStream) => {
            //userVideoStream is your stream
            console.log('your stream::',userVideoStream)
            this.createVideo({ id: userID,stream: userVideoStream,userData });
        });
        call.on('close',() => {
            console.log('closing new user',userID);
            this.removeVideo(userID);
        });
        call.on('error',() => {
            console.log('peer error ------')
            this.removeVideo(userID);
        })
        peers[userID] = call;
    }
    removeVideo = (id) => {
        delete this.videoContainer[id];
        const video = document.getElementById(id);
        if (video) video.remove();
    }
    destroyConnection = () => {
        const myMediaTracks = this.videoContainer[this.myID]?.stream.getTracks();
        myMediaTracks?.forEach((track) => {
            track.stop();
        })
        socketInstance?.socket.disconnect();
        this.myPeer.destroy();
    }
}

export default function createSocketConnectionInstance(settings={}) {
    return socketInstance = new Connection(settings);
}

确认两个客户端都连接到peer.js,sockets也连接了。

然而,在我调用connectToNewUser之后,它似乎在setPeersListeners中没有应答。

我觉得视频通话功能的形状和peerjs doc很像

你知道为什么它不起作用吗? 谢谢:)

解决方法

当我以某种方式删除所有参数时它起作用了。

曾经

const initializePeerConnection = () => {
    return new Peer('',{
        host: 'localhost',port: 9000,secure: false //secure=true is https and wss. secure=false is http and ws
    });
}

在终端

peerjs -p 9000

? 这是正常工作

const initializePeerConnection = () => {
    return new Peer()
}

你不必在终端中执行peerjs

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。