linux_ffmpeg.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. const { MediaStreamTrack, randomPort, RTCPeerConnection, RTCRtpCodecParameters, RtpPacket } = require('werift')
  2. const { Server } = require('ws')
  3. const { createSocket } = require('dgram')
  4. const { exec } = require('child_process')
  5. // open answer.html
  6. const server = new Server({ port: 8888 });
  7. console.log("start");
  8. server.on("connection", async (socket) => {
  9. console.log('客户端连接');
  10. const payloadType = 96;
  11. const pc = new RTCPeerConnection({
  12. codecs: {
  13. audio: [],
  14. video: [
  15. new RTCRtpCodecParameters({
  16. mimeType: "video/VP8",
  17. clockRate: 90000,
  18. payloadType: payloadType,
  19. // rtcpFeedback: [
  20. // { type: "ccm", parameter: "fir" },
  21. // { type: "nack" },
  22. // { type: "nack", parameter: "pli" },
  23. // { type: "goog-remb" },
  24. // ]
  25. }),
  26. ],
  27. },
  28. iceServers: [
  29. {
  30. urls: [
  31. "stun:caner.top:3478"
  32. ],
  33. },
  34. {
  35. urls: "turn:caner.top:3478",
  36. username: "admin",
  37. credential: "123456",
  38. },
  39. ]
  40. });
  41. const track = new MediaStreamTrack({ kind: "video" })
  42. randomPort().then((port) => {
  43. const udp = createSocket("udp4");
  44. udp.bind(port);
  45. console.log('端口',port);
  46. // linux
  47. 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) => {
  48. if (error) {
  49. console.error(`exec error: ${error}`);
  50. return;
  51. }
  52. })
  53. udp.on("message", (data) => {
  54. const rtp = RtpPacket.deSerialize(data);
  55. rtp.header.payloadType = payloadType;
  56. track.writeRtp(rtp);
  57. });
  58. });
  59. pc.addTransceiver(track, { direction: "sendonly" });
  60. await pc.setLocalDescription(await pc.createOffer());
  61. const sdp = JSON.stringify(pc.localDescription);
  62. socket.send(sdp);
  63. socket.on("message", (data) => {
  64. pc.setRemoteDescription(JSON.parse(data));
  65. });
  66. });