const { MediaStreamTrack, randomPort, RTCPeerConnection, RTCRtpCodecParameters, RtpPacket } = require('werift') const { Server } = require('ws') const { createSocket } = require('dgram') const { exec } = require('child_process') // open answer.html const server = new Server({ port: 8888 }); console.log("start"); server.on("connection", async (socket) => { console.log('客户端连接'); const payloadType = 96; const pc = new RTCPeerConnection({ codecs: { audio: [], video: [ new RTCRtpCodecParameters({ mimeType: "video/VP8", clockRate: 90000, payloadType: payloadType, // rtcpFeedback: [ // { type: "ccm", parameter: "fir" }, // { type: "nack" }, // { type: "nack", parameter: "pli" }, // { type: "goog-remb" }, // ] }), ], }, iceServers: [ { urls: [ "stun:caner.top:3478" ], }, { urls: "turn:caner.top:3478", username: "admin", credential: "123456", }, ] }); const track = new MediaStreamTrack({ kind: "video" }) randomPort().then((port) => { const udp = createSocket("udp4"); udp.bind(port); console.log('端口',port); // linux exec(`ffmpeg -re -f v4l2 -i /dev/video0 -pix_fmt yuv420p -s 320x240 -vcodec h264 -preset veryfast -g 1 -f rtp rtp://127.0.0.1:${port}`, (error, stdout, stderr) => { if (error) { console.error(`exec error: ${error}`); return; } }) udp.on("message", (data) => { const rtp = RtpPacket.deSerialize(data); rtp.header.payloadType = payloadType; track.writeRtp(rtp); }); }); pc.addTransceiver(track, { direction: "sendonly" }); await pc.setLocalDescription(await pc.createOffer()); const sdp = JSON.stringify(pc.localDescription); socket.send(sdp); socket.on("message", (data) => { pc.setRemoteDescription(JSON.parse(data)); }); });