app.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. "use strict";
  2. const localMedia = document.getElementById("my-video");
  3. localMedia.muted = true;
  4. navigator.mediaDevices.getUserMedia({
  5. audio: true,
  6. video: true,
  7. }).then((localStream) => {
  8. localMedia.srcObject = localStream;
  9. grid.localStream = localStream;
  10. localMedia.addEventListener("loadedmetadata", () => localMedia.play());
  11. }).catch((error) => {
  12. peer.error = error.message;
  13. });
  14. const callee = new Vue({
  15. el: "#callee",
  16. data: {
  17. calleeId: "",
  18. },
  19. methods: {
  20. addPeer: () => {
  21. if (callee.calleeId && !grid.peers.includes(callee.calleeId))
  22. grid.peers.push(callee.calleeId);
  23. },
  24. },
  25. });
  26. const grid = new Vue({
  27. el: "#grid",
  28. data: {
  29. localStream: undefined,
  30. peers: [],
  31. },
  32. methods: {
  33. makeCall: (peerId) => {
  34. let call = peer.peer.call(peerId, grid.localStream);
  35. let video = document.getElementById(call.peer);
  36. call.on("stream", (remoteStream) => {
  37. video.srcObject = remoteStream;
  38. video.addEventListener("loadedmetadata", () => video.play());
  39. });
  40. },
  41. },
  42. });
  43. const peer = new Vue({
  44. el: "#peer",
  45. data: {
  46. clientId: "",
  47. error: "",
  48. peer: new Peer(undefined, {
  49. host: "localhost",
  50. key: "testingkey",
  51. path: "/peerjs/conference",
  52. port: 3000,
  53. }),
  54. },
  55. });
  56. peer.peer.on("close", () => peer.clientId = "");
  57. peer.peer.on("error", (error) => peer.error = error.message);
  58. peer.peer.on("open", () => peer.clientId = peer.peer.id);
  59. peer.peer.on("call", (call) => {
  60. call.answer(grid.localStream);
  61. let video = document.getElementById(call.peer);
  62. call.on("stream", (remoteStream) => {
  63. video.srcObject = remoteStream;
  64. video.addEventListener("loadedmetadata", () => video.play());
  65. });
  66. });
  67. const model = new Vue({
  68. el: "#model",
  69. data: {
  70. loading: false,
  71. loadedModel: undefined,
  72. },
  73. methods: {
  74. localDetection: () => {
  75. model.loadedModel.detect(localMedia)
  76. .then((predictions) => {
  77. const liveView = document.getElementById("live-view");
  78. for (const child of liveView.childNodes) {
  79. if (child.localName === "p") child.remove();
  80. }
  81. for (const prediction of predictions) {
  82. const p = document.createElement("p");
  83. p.innerText = `${prediction.class} (${Math.round(prediction.score * 100)})`;
  84. p.style = "top: 0; left; 0;" +
  85. `margin-left: ${prediction.bbox[0]}px;` +
  86. `margin-top: ${prediction.bbox[1]}px;` +
  87. `width: ${prediction.bbox[2]}px;`;
  88. liveView.appendChild(p);
  89. }
  90. }).catch((error) => {
  91. peer.error = error.message;
  92. });
  93. },
  94. startLoading: () => {
  95. model.loading = true;
  96. cocoSsd.load()
  97. .then((loadedModel) => {
  98. model.loading = false;
  99. model.loadedModel = loadedModel;
  100. }).catch((error) => {
  101. peer.error = error.message;
  102. });
  103. },
  104. },
  105. });
  106. setInterval(
  107. () => {
  108. if (model && model.loadedModel) model.localDetection();
  109. },
  110. 5000
  111. );