ffmpeg.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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. const payloadType = 96;
  10. const pc = new RTCPeerConnection({
  11. codecs: {
  12. audio: [],
  13. video: [
  14. new RTCRtpCodecParameters({
  15. mimeType: "video/h264",
  16. clockRate: 90000,
  17. payloadType: payloadType,
  18. }),
  19. ],
  20. },
  21. });
  22. const track = new MediaStreamTrack({ kind: "video" })
  23. randomPort().then((port) => {
  24. const udp = createSocket("udp4");
  25. udp.bind(port);
  26. // test vp8
  27. // exec(`D:/ffmpeg-4.4-full_build/bin/ffmpeg.exe -re -f lavfi -i testsrc=size=640x480:rate=30 -vcodec libvpx -cpu-used 5 -deadline 1 -g 10 -error-resilient 1 -auto-alt-ref 1 -f rtp rtp://127.0.0.1:${port}`,(error, stdout, stderr) => {
  28. // if (error) {
  29. // console.error(`exec error: ${error}`);
  30. // return;
  31. // }
  32. // console.log(`stdout: ${stdout}`);
  33. // console.error(`stderr: ${stderr}`);
  34. // })
  35. // video h264
  36. exec(`D:/ffmpeg-4.4-full_build/bin/ffmpeg.exe -f dshow -video_size 640x480 -i video="Logitech HD Webcam C525" -pix_fmt yuv420p -c:v h264 -g 10 -preset ultrafast -tune zerolatency -f rtp rtp://127.0.0.1:${port}`,(error, stdout, stderr) => {
  37. if (error) {
  38. console.error(`exec error: ${error}`);
  39. return;
  40. }
  41. })
  42. udp.on("message", (data) => {
  43. const rtp = RtpPacket.deSerialize(data);
  44. rtp.header.payloadType = payloadType;
  45. track.writeRtp(rtp);
  46. });
  47. });
  48. pc.addTransceiver(track, { direction: "sendonly" });
  49. await pc.setLocalDescription(await pc.createOffer());
  50. const sdp = JSON.stringify(pc.localDescription);
  51. socket.send(sdp);
  52. socket.on("message", (data) => {
  53. pc.setRemoteDescription(JSON.parse(data));
  54. });
  55. });