Soracom

Users

スタートガイド
Home スタートガイド スターターキット商品 IoT 体験キット 〜簡易監視カメラ〜をセットアップする Getting Started

STEP 5: タイムラプス動画を作成する

撮りためた画像を使用して、タイムラプス (低速度撮影) 動画を作成してみましょう。

植物の成長や雲の動きなど、ゆっくり変化をするようなものを一定間隔 (たとえば 1 分ごと) に撮影した画像を使って、仮に 1 秒間に 30 コマ使用すると 1 時間が動画では約 2 秒となるような動画を作成できます。こういった映像を「低速度撮影 (タイムラプス) 映像」と呼びます。

セットアップ

パッケージのインストール

動画へのコンバートには、ffmpeg というプログラムを利用しますので、下記のコマンドでパッケージをインストールしてください。既にインストールされている場合は不要です。

ffmpeg version 4.3.1 で動作を確認しています。

$ sudo apt install -y ffmpeg

非常に多くのパッケージをダウンロードしますので、少し時間がかかります。3G 接続を切って有線や Wifi 接続でインストールした方がよいかもしれません。3G 接続を切るには USB ドングルを抜きます。再度 USB ドングルを挿せば 3G 接続が有効になります。

スクリプトのダウンロード

スクリプトをダウンロードします。

pi@raspberrypi:~ $ sudo wget http://soracom-files.s3.amazonaws.com/time-lapse.sh
--2016-08-02 09:13:16--  http://soracom-files.s3.amazonaws.com/time-lapse.sh
Resolving soracom-files.s3.amazonaws.com (soracom-files.s3.amazonaws.com)... 52.219.16.1
Connecting to soracom-files.s3.amazonaws.com (soracom-files.s3.amazonaws.com)|52.219.16.1|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1262 (1.2K) [text/plain]
Saving to: ‘time-lapse.sh’

time-lapse.sh                100%[===========================================>]   1.23K  --.-KB/s   in 0s

2016-08-02 09:13:16 (41.6 MB/s) - ‘time-lapse.sh’ saved [1262/1262]
pi@raspberrypi:~ $ sudo chmod +x time-lapse.sh

引数なしで実行すると、コマンドの説明が表示されます。

pi@raspberrypi:~ $ ./time-lapse.sh
使い方: ./time-lapse.sh [options] /full/path/to/output.mp4 # 出力するMP4ファイルへのフルパス
Options:
 -d /path/to/images/ (default=/var/www/html/images/) # 元となる画像の格納場所
 -f filter_string (default=no filter) # ファイル名のフィルタ
 -s N (speed, default=30 frames per seconds) # スピード、デフォルトでは 30枚/秒、1 分に一回撮影したものであれば、30分/秒となる

それでは、実際に画像を動画を変換してみましょう。

オプションを指定しない場合、/var/www/html/images 以下の画像ファイルをすべて使用して、動画を作成します。 変換が終わった後の動画をすぐにブラウザで見れるように、/var/www/html/ 以下に動画ファイルを出力しておくと便利です。 画像の枚数やラズパイのバージョンによって変換にかかる時間が変わるので、変換が終わるまで気長に待ちましょう。

$ ./time-lapse.sh /var/www/html/time-lapse.mp4
-- 1. mkdir /var/tmp/time-lapse-2889 for workspace
-- 2. symlinking images as seqeuntial filename (it may take a while...)
28 files found.

-- 3. converting jpeg files to MPEG-4 video (it may also take a while...)
ffmpeg version 4.1.4-1+rpt1~deb10u1 Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 8 (Raspbian 8.3.0-6+rpi1)
  configuration: --prefix=/usr --extra-version='1+rpt1~deb10u1' --toolchain=hardened --libdir=/usr/lib/arm-linux-gnueabihf --incdir=/usr/include/arm-linux-gnueabihf --arch=arm --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-omx-rpi --enable-mmal --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
  libavutil      56. 22.100 / 56. 22.100
  libavcodec     58. 35.100 / 58. 35.100
  libavformat    58. 20.100 / 58. 20.100
  libavdevice    58.  5.100 / 58.  5.100
  libavfilter     7. 40.101 /  7. 40.101
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  3.100 /  5.  3.100
  libswresample   3.  3.100 /  3.  3.100
  libpostproc    55.  3.100 / 55.  3.100
Input #0, image2, from '%08d.jpg':
  Duration: 00:00:00.93, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: mjpeg, yuvj444p(pc, bt470bg/unknown/unknown), 640x480 [SAR 96:96 DAR 4:3], 30 fps, 30 tbr, 30 tbn, 30 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (mjpeg (native) -> h264 (libx264))
Press [q] to stop, [?] for help
[swscaler @ 0x1066bd0] deprecated pixel format used, make sure you did set range correctly
[libx264 @ 0x1035a80] using SAR=1/1
[libx264 @ 0x1035a80] using cpu capabilities: ARMv6 NEON
[libx264 @ 0x1035a80] profile High, level 3.0
[libx264 @ 0x1035a80] 264 - core 155 r2917 0a84d98 - H.264/MPEG-4 AVC codec - Copyleft 2003-2018 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to '/var/www/html/time-lapse.mp4':
  Metadata:
    encoder         : Lavf58.20.100
    Stream #0:0: Video: h264 (libx264) (avc1 / 0x31637661), yuv420p, 640x480 [SAR 1:1 DAR 4:3], q=-1--1, 30 fps, 15360 tbn, 30 tbc
    Metadata:
      encoder         : Lavc58.35.100 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
frame=   28 fps=6.6 q=-1.0 Lsize=     161kB time=00:00:00.83 bitrate=1581.1kbits/s speed=0.197x
video:160kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.696945%
[libx264 @ 0x1035a80] frame I:2     Avg QP:24.20  size: 13077
[libx264 @ 0x1035a80] frame P:10    Avg QP:26.02  size:  6315
[libx264 @ 0x1035a80] frame B:16    Avg QP:26.26  size:  4599
[libx264 @ 0x1035a80] consecutive B-frames: 17.9%  0.0% 53.6% 28.6%
[libx264 @ 0x1035a80] mb I  I16..4: 15.8% 77.8%  6.4%
[libx264 @ 0x1035a80] mb P  I16..4:  8.3% 22.7%  1.7%  P16..4: 53.3%  7.0%  2.8%  0.0%  0.0%    skip: 4.2%
[libx264 @ 0x1035a80] mb B  I16..4:  1.5%  5.0%  0.5%  B16..8: 43.9%  9.1%  1.2%  direct:15.5%  skip:23.3%  L0:49.3% L1:48.0% BI: 2.7%
[libx264 @ 0x1035a80] 8x8 transform intra:72.5% inter:87.3%
[libx264 @ 0x1035a80] coded y,uvDC,uvAC intra: 52.4% 78.6% 45.6% inter: 29.6% 59.7% 2.1%
[libx264 @ 0x1035a80] i16 v,h,dc,p: 13% 25% 10% 52%
[libx264 @ 0x1035a80] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 15% 16% 31%  7%  7%  7%  5%  7%  6%
[libx264 @ 0x1035a80] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 19% 19% 17%  7%  9% 10%  5%  9%  6%
[libx264 @ 0x1035a80] i8c dc,h,v,p: 63% 19% 16%  3%
[libx264 @ 0x1035a80] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x1035a80] ref P L0: 42.1%  4.6% 26.2% 27.1%
[libx264 @ 0x1035a80] ref B L0: 62.7% 26.0% 11.4%
[libx264 @ 0x1035a80] ref B L1: 93.2%  6.8%
[libx264 @ 0x1035a80] kb/s:1396.13

-- 4. cleanup...

上記の例で出力されたファイルは、STEP 3: SORACOM Napter で Raspberry Pi を Web カメラとして使う で表示された URL (https://xxx-xxx-xxx-xxx.napter.soracom.io:yyyyy) に パス /time-lapse.mp4 を加えた https://xxx-xxx-xxx-xxx.napter.soracom.io:yyyyy/time-lapse.mp4 でアクセスできます。USB ドングルを挿しているか今一度確認してください。動画再生には大きな通信量がかかりますので注意してください。

タイムラプス動画サンプル

動画をストリーミングする

パッケージのインストール

動画の撮影・ストリーミングには motion というプログラムを利用しますので、下記のコマンドでパッケージをインストールしてユください。非常に多くのパッケージをダウンロードしますので、少し時間がかかります。3G 接続を切って有線接続でインストールした方がよいかもしれません。3G 接続を切るには USB ドングルを抜きます。再度 USB ドングルを挿せば 3G 接続が有効になります。インストール後は、ストリーミング再生ができるように設定を変更します。

$ sudo apt install -y motion
$ sudo sed -i -e 's/ffmpeg_video_codec mkv/ffmpeg_video_codec mp4/g' /etc/motion/motion.conf
$ sudo sed -i -e 's/^ffmpeg_output_movies on/ffmpeg_output_movies off/g' /etc/motion/motion.conf
$ sudo sed -i -e 's/stream_localhost on/stream_localhost off/g' /etc/motion/motion.conf

Apache 設定の追加

ストリーミング動画へアクセスするパスを設定するために Apache に mod_proxy 設定を追加します。以下の例では cat コマンドで追記していますが、vi や nano などのエディタを利用してもよいです。適用するためにサービスを再起動します。

$ sudo su -
$ cat >> /etc/apache2/apache2.conf
# add proxy config for streaming by motion
$ LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
$ LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so
$ ProxyRequests Off
$ ProxyPass /stream http://127.0.0.1:8081

(Ctrl+D を 2 回押します)

$ sudo service apache2 restart

ストリーミングの実行

以下のコマンドでストリーミングを開始します。

$ sudo motion

STEP 3: SORACOM Napter で Raspberry Pi を Web カメラとして使う で表示された URL (https://xxx-xxx-xxx-xxx.napter.soracom.io:yyyyy) に パス /stream を加えた下記の URL にアクセスしてストリーミング動画を見ることができます。ストリーミング動画では大きな通信量が発生するのでご注意ください。

https://xxx-xxx-xxx-xxx.napter.soracom.io:yyyyy/stream

ストリーミングを終了するときは Raspberry Pi のウィンドウで Ctrl+C を押してください。

なお、ストリーミング動画では通信速度が必要となります。IoT SIM の速度クラスを s1.fast に変更してください。詳しくは、IoT SIM の速度クラスを変更する を参照してください。

なお 3G 回線のため、SORACOM 側で最高速度に設定しても動画がリアルタイムに再生されないことがあります。リアルタイムな再生が重要であれば、SORACOM IoT ストア で LTE 対応の USB ドングルの購入をご検討ください。

おめでとうございます!皆さんは、IoT 体験キット 〜簡易監視カメラ〜を完了しました。SORACOM を使ったハンズオンを楽しんで頂けましたでしょうか?

さらに SORACOM に興味を持っていただいた方は、ガイドドキュメント をぜひご参照ください。