linux_gstreams.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. const { MediaStreamTrack, randomPort, RTCPeerConnection, RTCRtpCodecParameters, RtpPacket } = require('werift')
  2. const { Server } = require('ws')
  3. const { createSocket } = require('dgram')
  4. const { spawn } = require('child_process')
  5. const server = new Server({ port: 8888 });
  6. console.log("start");
  7. server.on("connection", async (socket) => {
  8. console.log('客户端连接');
  9. const pc = new RTCPeerConnection({
  10. codecs: {
  11. audio: [],
  12. video: [
  13. new RTCRtpCodecParameters({
  14. mimeType: "video/VP8",
  15. clockRate: 90000,
  16. payloadType: 96,
  17. }),
  18. ],
  19. },
  20. iceServers: [
  21. {
  22. urls: [
  23. "stun:caner.top:3478",
  24. ],
  25. },
  26. {
  27. urls: "turn:caner.top:3478",
  28. username: "admin",
  29. credential: "123456",
  30. },
  31. ]
  32. });
  33. const track = new MediaStreamTrack({ kind: "video" });
  34. randomPort().then((port) => {
  35. const udp = createSocket("udp4");
  36. udp.bind(port);
  37. const args = [
  38. `videotestsrc`,
  39. "video/x-raw,width=640,height=480,format=I420,framerate=15/1",
  40. "vp8enc error-resilient=partitions keyframe-max-dist=10 auto-alt-ref=true cpu-used=5 deadline=1",
  41. "rtpvp8pay",
  42. `udpsink host=127.0.0.1 port=${port}`,
  43. ].join(" ! ");
  44. spawn("gst-launch-1.0", args.split(" "));
  45. udp.on("message", (data) => {
  46. const rtp = RtpPacket.deSerialize(data);
  47. track.writeRtp(rtp);
  48. });
  49. });
  50. pc.addTransceiver(track, { direction: "sendonly" });
  51. await pc.setLocalDescription(await pc.createOffer());
  52. const sdp = JSON.stringify(pc.localDescription);
  53. socket.send(sdp);
  54. socket.on("message", (data) => {
  55. pc.setRemoteDescription(JSON.parse(data));
  56. });
  57. });