linux_ffmpeg.js 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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. // ffmpeg -re -f v4l2 -i /dev/video0 -s 320x240 -vcodec libvpx -preset ultrafast -b:v 1000k -g 5 -f
  48. 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) => {
  49. if (error) {
  50. console.error(`exec error: ${error}`);
  51. return;
  52. }
  53. })
  54. udp.on("message", (data) => {
  55. const rtp = RtpPacket.deSerialize(data);
  56. rtp.header.payloadType = payloadType;
  57. track.writeRtp(rtp);
  58. });
  59. });
  60. pc.addTransceiver(track, { direction: "sendonly" });
  61. await pc.setLocalDescription(await pc.createOffer());
  62. const sdp = JSON.stringify(pc.localDescription);
  63. socket.send(sdp);
  64. socket.on("message", (data) => {
  65. pc.setRemoteDescription(JSON.parse(data));
  66. });
  67. });