余っているPCとWebカメラで赤ちゃんの見守りカメラを自作する

こんにちは、子育てに見守りカメラは欠かせないと思っているファン(@one_quarter_)です。

皆さんは赤ちゃんが寝ているときに家事や趣味、仕事などできていますか?

ヨメ

私たちは最初は、寝ててもすぐ起きるんじゃないか?万が一のことになっていないか?が不安であまり時間が取れなかったよね

私たちの場合は特に生まれてすぐに呼吸器疾患でNICUに入院していたこともあり、本当に気が気じゃなかったです。

話を戻しまして、赤ちゃんが寝ている間もやること、やりたいことがたくさんあるので、その時間を有効に活用するためにも、見守りカメラは必須だと思います。

TIPS

見守りカメラとは、赤ちゃんの映像と音声をリアルタイムにスマホなどでみることができる製品です。音声だけのものもありますが、無音の時に寝ているのか、何かあって静かなのかは区別がつきませんので、カメラ付きをおすすめします。

見守りカメラは市販品でも安価なものがたくさん出てきています。

ファン
ですが、ちょっと待ってください!

もし、家に余っているパソコンがあったら、実はタダで見守りカメラが自作できるのです!
今回は、見守りカメラが欲しい、そして余っているパソコンがあるという方に知ってもらいたい、見守りカメラを自作する方法をご紹介します。

ファン
パソコンが苦手な方でもわかるように出来るだけわかりやすく説明していますので、詳しい方は適宜読み飛ばしていただけると嬉しいです

見守りカメラに必要なもの

見守りカメラを自作するのに必要なものはこちらです。

見守りカメラに必要なもの

  • 見守りカメラ本体になるパソコン
  • カメラ(内臓 or USB接続)
  • インターネット環境
  • 映像を見る端末
  • ubuntuのインストールメディア作成用パソコン
  • インストールメディアになる USBメモリ

私の見守りカメラの構成の例はこちらです。

私の見守りカメラ

  • acerのノートPC(見守りカメラ本体)
  • logicool C270 (USB接続)
  • Wifiルーター
  • iPad mini
  • Mac book air(インストールメディア作成用)
  • 4GBの USBメモリ(インストールメディア)

内蔵カメラがない場合はロジクールが安くてオススメです。

いろいろありまして私は3台持っています(笑)

ファン
1点だけ注意事項ですが、パソコンはlinuxである必要があります

そのため、余っている(使っていない)パソコンにlinuxをインストールして使います。
普段使いのパソコン使うのはあまりお勧めしていませんので、あくまで余っているパソコンがあればタダでできるよ、という紹介になります。

見守りカメラの作り方

見守りカメラ作成の手順は以下の通りです。

見守りカメラの作り方

  1. ubuntuのインストールメディアを作成する
  2. 見守りカメラ本体用パソコンにubuntuをインストールする
  3. カメラ・マイクのデバイス番号を調べる
  4. サーバーのスクリプトを作成する
  5. ブラウザで視聴するためのhtmlファイルを作る
  6. ffmpegをインストールする
  7. ffmpegの実行シェルスクリプトを作成する
  8. 推奨:IPアドレスを固定する
1. ubuntuのインストールメディアを作成する/2.見守りカメラ本体用パソコンにubuntuをインストールする

ubuntuのインストール方法はこちらがわかりやすいので、参考にしてみてください。

インストールが終わったら、Wifi等につなぎ、インターネット接続をしておきます。

ネット経由でインストールするので、ネットが繋がったら、以下を実行しておきます。

デスクトップ画面を右クリック→端末を開く(この後何回も出てくるので、「端末を開く」と以後呼びます)

そして以下を順に実行します(入力して改行のところでエンター)。

sudo apt-get update
sudo apt-get upgrade

また、あとで使いますのでIPアドレスを調べておきます。

sudo apt install net-tools
ifconfig

IPアドレスはココの部分です。

~$ ifconfig
enp4s0f0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether bb:88:ee:bb:ff:99 txqueuelen 1000 (イーサネット)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 18 
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (ローカルループバック)
RX packets 33745 bytes 3154410 (3.1 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 33745 bytes 3154410 (3.1 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
wlp3s0b1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.11.6⇦ココ netmask 255.255.255.0 broadcast 192.168.11.255
inet6 ffff::8888:9999:ffff:bbbb prefixlen 64 scopeid 0x20<link>
ether ff:bb:ee:77:bb:cc txqueuelen 1000 (イーサネット)
RX packets 28807647 bytes 2997732666 (2.9 GB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 38209931 bytes 54979427841 (54.9 GB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
3.カメラ・マイクのデバイス番号を調べる

USBカメラを使用する場合は、接続してから端末を開く→以下のコマンドを実行します。

カメラのデバイス番号を調べる
sudo apt install v4l-utils
v4l2-ctl --list-devices

実行結果のココがデバイス番号になります。この文字列をメモしておきます。

一見HD WebCamにも見えますが、私のC270はUVC Cameraでした。

~$ v4l2-ctl --list-devices
HD WebCam: HD WebCam (usb-0000:00:1a.0-1.3):
    /dev/video0
    /dev/video1
UVC Camera (046d:0825) (usb-0000:00:1d.0-1.2):
    /dev/video2⇦ココ
    /dev/video3
ファン
よくわからない時は両方試してみるのが確実ですね
マイクのデバイス番号を調べる
arecord -l

実行結果のココがデバイス番号です。こちらもメモしておきます。

デバイス名がUSB Audioになっている方です。

~$ arecord -l
**** ハードウェアデバイス CAPTURE のリスト ****
カード 0: PCH [HDA Intel PCH], デバイス 0: ALC269VB Analog [ALC269VB Analog]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
カード 1⇦ココ: U0x46d0x825 [USB Device 0x46d:0x825], デバイス 0: USB Audio [USB Audio]
  サブデバイス: 0/1
  サブデバイス #0: subdevice #0
4.サーバーのスクリプトを作成する

ストリーミングサーバーを立てるためのpythonスクリプトを作成します。
といっても、テキストファイルを作り、コピペするだけです。

エディタはubuntuに最初から入っているnanoを使うと簡単です。

ファン
nanoで保存する時は「Ctl+O」、閉じる時は「Ctl+X」です

端末を開く→以下を順に実行

mkdir ~/HLS
cd ~/HLS
nano streaming.py

以下をコピーして、nanoの画面を右クリック→貼り付け

※8行目のYourNameはユーザ名に変えてください。

#!/usr/bin/env python3
import os
import http.server
import socketserver

PORT = 8000

web_dir = os.path.join(os.path.dirname(__file__), '/home/YourName/HLS')
os.chdir(web_dir)

Handler = http.server.SimpleHTTPRequestHandler
httpd = socketserver.TCPServer(("", PORT), Handler)
print("serving at port", PORT)

try:
    httpd.serve_forever()
except KeyboardInterrupt:
    pass

httpd.server_close
5.ブラウザで視聴するためのhtmlファイルを作る

ブラウザで視聴できるようにhtmlファイルを作ります。

端末を開く→nanoでファイル作成

cd ~/HLS
nano index.html

以下をコピペして保存します。

<html>
<head>
  <meta charset="utf-8">
  <title>HTTP Live Streaming</title>
  <script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
</head>
<body>
  <h1>Live camera</h1>
  <div>
    <video id="live" width="640" height="480" crossOrigin="anonymous" autoplay="autoplay" controls="controls">
  </div>
  <script>
  if (Hls.isSupported()) {
    var video = document.getElementById('live');
    var hls = new Hls();
    hls.loadSource('./playlist.m3u8');
    hls.attachMedia(live);
  }
  </script>
</body>
</html>
6.ffmpegをインストールする

端末を開く→以下を実行します。

sudo apt-get install ffmpeg
7.ffmpegの実行シェルスクリプトを作成する

端末を開く→以下を順に実行します。

cd ~
nano streaming

以下をコピペして保存します。

※⇦マイクはココと⇦カメラはココは消してください
2行目のYourNameはユーザ名に変えてください。

#! /bin/bash
httpDir=/home/YourName/HLS
cd $httpDir
pkill -f ffmpeg
sleep 5
rm $httpDir/stream/stream_*.ts
rm $httpDir/playlist.m3u8
rm $httpDir/log.txt
ffmpeg -f alsa -ac 1 -thread_queue_size 8192 \
  -i hw:1⇦マイクはココ \
  -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 \
  -f v4l2 -thread_queue_size 8192 -input_format yuyv422 -video_size 800x600 \
  -i /dev/video2⇦カメラはココ \
  -filter_complex scale=800x600,fps=12 \
  -c:v libx264 -b:v 764k -g 24 \
  -c:a aac -b:a 64k \
  -flags +cgop+global_header \
  -f hls \  
  -hls_time 2 -hls_list_size 3 -hls_allow_cache 0 \
  -hls_segment_filename $httpDir/stream/stream_%d.ts \
  -hls_base_url stream/ \
  -hls_flags delete_segments \
  $httpDir/playlist.m3u8 &> $httpDir/log.txt &
8.推奨:IPアドレスを固定する

IPアドレスの固定は必須ではありませんが、やっておいたほうが便利ですのでご紹介します。

TIPS

IPアドレスを固定しないと、見守りカメラ用のPCを再起動した時や、ルーターが再起動した時などにIPアドレスが変わってしまい、今まで見られたのに見られなくなってしまうことがあります。

ただ、IPアドレスの固定方法はお使いのルーターによって設定が違うので、私の家で使っているBuffaloのWifiルーターを例にご紹介します。

IPアドレスの固定方法(Buffalo)

  1. 192.168.11.1にブラウザでアクセスする
  2. ユーザ名とパスワードを入れる(ID: admin, 初期パスワード: password)
  3. 「Internet/LAN」タブの「DHCPリース」をクリック
  4. 見守りカメラ用のPCの現在のIPアドレスの「手動割当に変更」ボタンをクリック

パソコンに慣れていない方は、なかなか項目が多く大変だったかもしれませんが、これで自作見守りカメラは完成です。

ファン
お疲れ様でした!

見守りカメラの使い方

では、見守りカメラの使い方です。

見守りカメラを起動する
見守りカメラの起動方法

  1. サーバーのスクリプトを実行する
  2. ffmpegのシェルスクリプトを実行する

まず、カメラ側のPCにストリーミング配信用のサーバーを立ち上げます。
端末を開く→以下を順に入力

cd ~
python streaming.py

正しく動作しているかどうかを確認するには同じWi-Fiに接続しているスマホや別のPCから、ブラウザで 見守りカメラ用のパソコンのIPアドレス+ポート番号(192.168.11.xx:8000など)にアクセスして、「Live camera」のタイトルと動画の画面になっていれば正常に起動できています。

次に、ffmpegのシェルスクリプトを起動し、ストリーミング配信する動画をカメラ映像から生成し続けます。
先ほどの端末の画面は閉じずに、新たにまた端末を開き、以下を実行します。
※YourNameはユーザ名に変えてください

/home/YourName/streaming

起動方法は以上です。
長時間起動していて不安定になった時はPCを再起動して、上記の手順を踏むだけでまた見守りカメラを使うことができます。

ファン

2番をやるだけでも生成されている動画ファイルがリセットされますので、そちらだけやってみてダメなら再起動してます

カメラ映像を視聴する
カメラ映像の視聴方法

  • 推奨:VLCプレイヤーを使う
  • その他:ブラウザで見る

カメラ映像の視聴方法はVLCプレイヤーを使うのがおすすめです。

TIPS

VLCプレイヤーとは、ほぼ全ての拡張子の動画を再生することができる動画プレイヤーで、PCのフリーソフト、無料スマホアプリとして利用可能です。

VLCプレイヤーをダウンロードする

私の場合、iPad miniで視聴していますので、アプリでの視聴方法をご紹介します。

ファン

AndroidやPCでも設定する項目は一緒です

VLCプレイヤーの設定方法

  1. アプリを起動する
  2. ネットワークをタップ
  3. ネットワークストリームを開くをタップ
  4. アドレスバーにhttp://192.168.11.xx:8000/playlist.m3u8と入力
  5. ネットワークストリームを開くをタップ

1.アプリを起動する
2.ネットワークをタップ

3.ネットワークストリームを開くをタップ

4.アドレスバーにhttp://192.168.11.xx:8000/playlist.m3u8と入力

5.ネットワークストリームを開くをタップ

ファン
次回以降は履歴から開けます

トラブルシューティング

私のPCがスペックが悪いせいか、たまに動画が不安定になることがあります。
その場合は基本的にffmpegの再起動で解決します。

不安定の解消方法

  • 手動でffmpegを再起動する
  • 自動でffmpegを再起動する
手動でffmpegを再起動する

やり方は、streamingを起動するだけです。
端末を開く→以下を実行

/home/YourName/streaming
ファン
ただ、いちいち再起動するのも面倒なので、以下の方法で自動化しています
自動でffmpegを再起動する

linuxにはcronという時間を指定してコマンドを実行する方法があります。
ここにffmpegのシェルスクリプトを起動するように設定をします。

設定方法は、「crontab -e」と端末を開くで入力するとnanoで時間指定のコマンドを書くことができます。
そして、以下のコマンドを書いておくと朝6時から夜24時まで2時間おきにffmpegのシェルスクリプトを再起動します。

# m h  dom mon dow   command
0 6 * * * /home/YourName/streaming
0 8 * * * /home/YourName/streaming
0 10 * * * /home/YourName/streaming
0 12 * * * /home/YourName/streaming
0 14 * * * /home/YourName/streaming
0 16 * * * /home/YourName/streaming
0 18 * * * /home/YourName/streaming
0 20 * * * /home/YourName/streaming
0 22 * * * /home/YourName/streaming
0 0 * * * pkill -f ffmpeg

2時間ごとに再起動していますが、かなり不安定になる頻度は低下しています。

ファン
スペック次第ではいらないかもしれないですし、不安定になったら試してみてください

自作見守りカメラのレビュー

実際に自作見守りカメラを導入して2か月使用していますので、使い勝手をレビューしたいと思います。

ヨメ
現在も絶賛稼働中!
画質・音質

画質・音質共に、そこそこの設定をしていますので、特に不満はありません。

画質についてですが、カメラから1mぐらい離れた位置の2センチ四方のサイズの文字が読み取れる程度の画質になっています。
また、赤ちゃんの呼吸によるお腹の上下もなんとか読み取れるぐらいですので、音がなくても寝ていることが確認できて安心です。

音質は良くも悪くもなく必要十分といったところでしょうか。
泣き声はもちろん、手足を動かした時の衣擦れ音や場合によっては、ため息程度は聞き取れるぐらいの音質、音量にはなっています。

どちらも後ほど紹介するスマホアプリのAlfred Cameraよりは良くなっていますので、満足です。

ファン
特に画質はこっちの方がかなりいいです!
遅延

大体10秒程度遅れて映像、音声が届きます。
できればもう少し遅延が少ない方が安心ですが、10秒程度であれば許容範囲だと思います。
少し試行錯誤しましたが、これよりは速くなりませんでした。
PCのスペックにも依存すると思いますので、いいPCであればもっと早いかもしれません。

ちなみに私のPCは以下のようなスペックです。

スペック一覧

  • Intel(R) Celeron(R) CPU 847 @ 1.10GHz
  • Memory: 4GB
安定性

トラブルシューティングの中でも触れましたが、私のPCではスペックが悪いせいか、たまにストリーミングが止まることがあります。
そのため、cronで2時間おきに自動的にffmpegを再起動するように設定しています。

ヨメ
VLCプレイヤーで2時間おきにプレイリストを開きなおさないといけないのはちょっと面倒だけどね…

ただ、これのおかげで、手動で再起動するのは激減しました、1週間に1回あるかないかぐらいの頻度ですので、許せる範囲です。

これに関しては、熱の問題もありそうだったので、同時に以下のようなPCクーラーが余っていたので、途中からこちらも使用しています。

番外編:余ったスマホで見守りカメラ

番外編になりますが、実はスマホアプリで余ったスマホを見守りカメラにするというものがあります。

Alfred Camera

  •  
  • Google Play で手に入れよう

最初は私もこのアプリを使っていましたが、自作できるかを調べて出来そうだったので、自作に切り替えました。

ファン
切り替えた理由は画質の低さとセキュリティの不安です

ただ、このアプリにもメリットは多いので、デメリットが気にならないよ、という方にはおすすめです。

ヨメ
前に使ってたスマホが余っていることってよくあるしね
Alfred Cameraのメリット

  • 無料で利用できる
  • インストールと簡単な設定のみで使用できる
  • スマホ、PCどちらからの利用もできる
  • カメラからの音声を聞くだけでなく、カメラ側に音声を送ることができる
Alfred Cameraのデメリット

  • 画質が悪い
  • 映像・音声がサーバーに送信されるので、プライバシー、セキュリティが不安

見守りカメラとしてはいいアプリだと思いますので、デメリットが許容できる方は使ってみてはいかがでしょうか?

まとめ

今回は赤ちゃんがいる家庭で必須の見守りカメラを余っているパソコンを使って自作する方法をご紹介しました。

慣れていない方にとっては大変かもしれませんが、余っているものでタダで見守りカメラを作ることができます。

また、ローカルのネットワークにしか映像も音声も流しませんので、セキュリティ的にも安心です。

興味がありましたらぜひ作ってみてくださいね。

ファン
質問等がありましたら、コメント、Twitter(@one_quarter_)などでお気軽にどうぞ!

最後までお読みいただきありがとうございました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です