websocketで映像を送受信するのでっち上げた=>スマホの電源の関係か24/365運用は無理=>0.5FPSにしたら24時間稼働OK

websocketで映像を送・受信するの作った。
古めのスマホがネットワークカメラになる。
iPhoneでは動作確認していない。
chromeにて動作確認
https://github.com/modeverv/SendAndReceiveVideoWithWebSocket

## 追記
ちょっと動かして見たけど充電が電力消費に追いつかぬ。24H/365運用は無理。
リクエストしたら静止画をとる感じに仕様変更すとか、それこそ本式のネットワークカメラ入れたほうが良さそう。
まぁ、簡単に実現できるよーということでこの投稿は終了。

## 追記2
24稼働いけました。0.5FPSという感じにしたらなんとか。
Alfredとかどうやってるんだろう。
Canvasの処理がくそ重いのがそのまま出てる感じなのでこの辺はアプリにしてどうにかしないとですね。
ともかく、いけました、24時間稼働！！。

```javascript
    navigator.mediaDevices
      .getUserMedia(constraints)
      .then(function (stream) {
        video.srcObject = stream;
        video.onloadedmetadata = function (e) {
          video.play();
        };
        setInterval(update, 2000);
      })
      .catch(function (err) {
        alert(err.name + ": " + err.message);
      });
    //負荷を下げる目的で2秒ごとに
    const update = () => {
      const ctx = canvas.getContext("2d");
      ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
      socket.emit("video", canvas.toDataURL());
    }
```


## フロントの動画受信部

```html
<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <title>Receive Video</title>
</head>

<body>
  <video id="video" autoplay="1" width="300px"></video>
  <canvas id="canvas" width="160" height="120"></canvas>
  <img id="img" width="160px">
  <script src="/socket.io/socket.io.js"></script>
  <script>
    const socket = io();
    navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || window.navigator.mozGetUserMedia;
    window.URL = window.URL || window.webkitURL;
    var video = document.getElementById("video");
    const img = document.getElementById("img");
    var constraints = {
      audio: false,
      video: {
        facingMode: {
          exact: "environment"
        }
      }
    };
    navigator.mediaDevices.getUserMedia(constraints)
      .then(function (stream) {
        video.srcObject = stream;
        video.onloadedmetadata = function (e) {
          video.play();
        };
      })
      .catch(function (err) {
        alert(err.name + ": " + err.message);
      });
    video.addEventListener("timeupdate", () => {
      const canvas = document.getElementById("canvas");
      const ctx = canvas.getContext("2d");
      ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
      socket.emit("video", canvas.toDataURL());
    });
    socket.on("video", (dat) => {
      img.src = dat;
    });
  </script>
</body>

</html>
```

## バックエンド

```javascript
/** config */
var PORT = 8998;

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);

app.get('/', (req, res) => {
    res.sendFile(__dirname + '/index.html');
});
app.get('/send', (req, res) => {
    res.sendFile(__dirname + '/send.html');
});
io.on('connection', (socket) => {
    socket.on('video', (msg) => {
        socket.broadcast.emit('video', msg);
    });
});

server.on('listening', () => {
    console.log('listening on ' + PORT);
})

server.listen(PORT);
```

## フロントの動画送信部

```html
<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <title>Send Video</title>
</head>

<body>
  <video id="video" autoplay="1" width="300px"></video>
  <canvas id="canvas" width="160" height="120"></canvas>
  <script src="/socket.io/socket.io.js"></script>
  <script>
    const socket = io();
    navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || window.navigator.mozGetUserMedia;
    window.URL = window.URL || window.webkitURL;
    const video = document.getElementById("video");
    var constraints = {
      audio: false,
      video: {
        facingMode: {
          exact: "environment"
        }
      }
    };
    navigator.mediaDevices.getUserMedia(constraints)
      .then(function (stream) {
        video.srcObject = stream;
        video.onloadedmetadata = function (e) {
          video.play();
        };
      })
      .catch(function (err) {
        alert(err.name + ": " + err.message);
      });
    video.addEventListener("timeupdate", () => {
      const canvas = document.getElementById("canvas");
      const ctx = canvas.getContext("2d");
      ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
      socket.emit("video", canvas.toDataURL());
    });
  </script>
</body>

</html>
```

## 参考

というかほとんどそのままです。

https://qiita.com/mkoku/items/78b90b1d50cb6e2f94f2