| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- 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
- // ffmpeg -re -f v4l2 -i /dev/video0 -s 320x240 -vcodec libvpx -preset ultrafast -b:v 1000k -g 5 -f
- exec(`ffmpeg -re -f v4l2 -i /dev/video0 -s 320x240 -vcodec libvpx -preset ultrafast -b:v 1000k -g 5 -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));
- });
- });
|