diff --git a/web-rtc/src/index.tsx b/web-rtc/src/index.tsx index f450d7b..8ffd1b3 100644 --- a/web-rtc/src/index.tsx +++ b/web-rtc/src/index.tsx @@ -1,7 +1,7 @@ import './index.less'; import React from 'react'; import ReactDOM from 'react-dom'; -import { startConnection, sendFile } from './web-rtc.ts'; +import { startConnection, sendFile, startVideo } from './web-rtc.ts'; // class View extends React.Component { // render() { @@ -16,11 +16,20 @@ import { startConnection, sendFile } from './web-rtc.ts'; function Page () { return (
- - - +
+
+ +
+
+ + +
+
+

-      
) } diff --git a/web-rtc/src/web-rtc.ts b/web-rtc/src/web-rtc.ts index 9f756f6..9accfbe 100644 --- a/web-rtc/src/web-rtc.ts +++ b/web-rtc/src/web-rtc.ts @@ -18,6 +18,7 @@ let sendChannel; let receiveChannel; let offer; let answer; +let readSliceTimer; const urlParams = new URLSearchParams(location.search) const shareId = urlParams.get('shareId'); @@ -159,7 +160,7 @@ export function sendFile() { fileReader.readAsArrayBuffer(slice); } else { console.log('DataChannel buffer is full, waiting to send more data'); - setTimeout(() => readSlice(), 0); + readSliceTimer = setTimeout(() => readSlice(), 0); } }; @@ -173,10 +174,14 @@ export function handleDataChannel() { sendChannel.onopen = () => { logMessage('Data channel is open') }; - sendChannel.onclose = () => logMessage('Data channel is closed'); + sendChannel.onclose = () => { + logMessage('Data channel is closed'); + clearTimeout(readSliceTimer) + } sendChannel.onerror = (event) => { logMessage(`Data channel error: ${event.error.message}`) + clearTimeout(readSliceTimer) } // 处理接收端的数据通道 @@ -236,3 +241,22 @@ function downloadFile(fileData: File, contentBuffer: ArrayBuffer[]) { // 释放 URL 对象 URL.revokeObjectURL(url); } + +export async function startVideo() { + if (!navigator.mediaDevices?.getUserMedia) { + logMessage('not support getUserMedia') + return + } + + try { + const videoStream = await navigator.mediaDevices.getUserMedia({ audio: true, video: true }) + const videoA = document.querySelector('#videoA'); + videoA.srcObject = videoStream; + localConnection.onaddStream = (event) => { + const videoB = document.querySelector('#videoB'); + videoB.srcObject = event.stram; + } + } catch (error) { + logMessage(error.message) + } +}