ค้นหาเว็บไซต์

javascript - เหตุการณ์ ontrack ไม่ทำงาน webRTC - Chrome


เหตุการณ์ ontrack ในฟังก์ชัน callback ที่ฉันเรียกที่ด้านล่างสุดไม่ทำงานสำหรับฉัน ฉันได้ตรวจสอบการมีอยู่ของการเชื่อมต่อ และการเชื่อมต่อเกิดขึ้นอย่างรวดเร็ว แต่ฉันไม่สามารถเข้าใจได้ว่าทำไมเหตุการณ์ ontrack ถึงไม่เกิดขึ้น

ฉันจะจัดการเหตุการณ์นี้อย่างถูกต้องได้อย่างไร? ฉันกำลังพลาดอะไรอยู่หรือเปล่า ขอโทษนะ ฉันไม่ค่อยเข้าใจ webRTC เท่าไหร่

export const useWEBRTC = (socket: Socket) => {

    const dataChannels = useRef<{ [key:string]: RTCDataChannel }>({})
    const peerConnections = useRef<{ [key:string]: RTCPeerConnection }>({})

    const [_, setConnection] = useState(peerConnections.current)

    const createVideoStream = useCallback( async (peerConnection: RTCPeerConnection) => {
        const contains = await navigator.mediaDevices.enumerateDevices()
        .then(devices => {
            setConnection({...peerConnections.current})
            const cams = devices.filter(device => device.kind === "videoinput")
            const constraints = { video: {}, audio: true }
            if(cams.length > 0)
                constraints.video = {
                    video: {
                        width: {
                            min: 320,
                            ideal: 1280,
                            max: 1920,
                        },
                        height: {
                            min: 240,
                            ideal: 720,
                            max: 1080,
                        },
                    },
                }
            else constraints.video = false

            return constraints
        })
        await navigator.mediaDevices
            .getUserMedia(contains)
                .then((stream) => {
                    stream.getTracks().forEach(track => peerConnection.addTrack(track, stream))
                }).catch((error) => {
                    switch(error.message) {
                        case 'Requested device not found':
                            return console.log('Requested device not found')
                    }
                })
    }, [])

    const createRTC = (user: string) => {
        const peerConnection = new RTCPeerConnection()
        createVideoStream(peerConnection)
        peerConnection.onicecandidate = (e) => 
            socket.emit('SEND_ICE_CANDIDATE', {
                candidate: e.candidate,
                user,
            })
        return peerConnection
    }

    useEffect(() => {
        socket.emit('JOIN_ROOM', { room_id: 8 })
        socket.on('RECEIVE_CLIENT_JOINED', ({ user_server_id }: RECEIVE_CLIENT_JOINED) => {
            const peerConnection = createRTC(user_server_id)
            const dataChannel = peerConnection.createDataChannel(user_server_id)
            dataChannel.onmessage = e => console.log(e.data)
            dataChannel.onopen = () => dataChannel.send('Connection open!')
            dataChannels.current[user_server_id] = dataChannel
            peerConnection.createOffer({
                offerToReceiveVideo: false,
                offerToReceiveAudio: true,
            })
            .then((offer) => {
                peerConnection.setLocalDescription(offer)
                socket.emit('SEND_OFFER', {
                    offer,
                    user: user_server_id,
                })
            })
            peerConnections.current[user_server_id] = peerConnection
        })
        socket.on('RECEIVE_OFFER', ({ offer, user }: RECEIVE_OFFER) => {
            const peerConnection = createRTC(user)
            peerConnection.setRemoteDescription(offer)
            peerConnection.createAnswer()
            .then((answer) => {
                peerConnection.setLocalDescription(answer)
                socket.emit('SEND_ANSWER', {
                    answer,
                    user
                })
            })
            peerConnection.ondatachannel = (e) => {
                const dataChannel = e.channel
                dataChannel.onopen = () => dataChannel.send('Connection open!')
                dataChannel.onmessage = e => console.log(e.data)
                dataChannels.current[user] = dataChannel
            }
            peerConnections.current[user] = peerConnection
        })
        socket.on('RECEIVE_ANSWER', ({ answer, user }: RECEIVE_ANSWER) => peerConnections.current[user].setRemoteDescription(answer))
        socket.on('RECEIVE_ICE_CANDIDATE', ({ candidate, user }: RECEIVE_ICE_CANDIDATE) => peerConnections.current[user].addIceCandidate(candidate))
        socket.on('RECEIVE_DISONECT', ({ user }: RECEIVE_DISONECT) => {
            if(peerConnections.current[user]) peerConnections.current[user].close()
            delete dataChannels.current[user]
            delete peerConnections.current[user]
        })

        return () => {
            socket.close()
            socket.off('RECEIVE_CLIENT_JOINED')
            socket.off('RECEIVE_OFFER')
            socket.off('RECEIVE_ANSWER')
            socket.off('RECEIVE_ICE_CANDIDATE')
            socket.off('RECEIVE_DISONECT')
        }
    },[socket])

    const videoState = useCallback((instace: HTMLVideoElement | null, _: RTCPeerConnection) => {
        /// not working ;(
        _.addEventListener('track', async (event) => {
            const [remoteStream] = event.streams
            if(instace) instace.srcObject = remoteStream
        });
    }, [])

    return { peerConnections, videoState }
}

การจัดการเหตุการณ์ ontrack ก็ไม่ได้ถูกสังเกตในการสร้างฟังก์ชัน "createVideoStream" ด้วย

บทความที่เกี่ยวข้อง