/
offer.ts
56 lines (50 loc) · 1.44 KB
/
offer.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import {
MediaStreamTrack,
randomPort,
RTCPeerConnection,
RTCRtpCodecParameters,
RtpPacket,
} from "../../../packages/webrtc/src";
import { Server } from "ws";
import { createSocket } from "dgram";
import { spawn } from "child_process";
const server = new Server({ port: 8888 });
console.log("start");
server.on("connection", async (socket) => {
const pc = new RTCPeerConnection({
codecs: {
audio: [],
video: [
new RTCRtpCodecParameters({
mimeType: "video/VP8",
clockRate: 90000,
payloadType: 96,
}),
],
},
});
const track = new MediaStreamTrack({ kind: "video" });
randomPort().then((port) => {
const udp = createSocket("udp4");
udp.bind(port);
const args = [
`videotestsrc`,
"video/x-raw,width=640,height=480,format=I420",
"vp8enc error-resilient=partitions keyframe-max-dist=10 auto-alt-ref=true cpu-used=5 deadline=1",
"rtpvp8pay",
`udpsink host=127.0.0.1 port=${port}`,
].join(" ! ");
spawn("gst-launch-1.0", args.split(" "));
udp.on("message", (data) => {
const rtp = RtpPacket.deSerialize(data);
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: any) => {
pc.setRemoteDescription(JSON.parse(data));
});
});