raspberry piにカメラをつけて、motionをインストールして
WindowsやiPhoneのブラウザで見ている。
motionの場合は、クライアントからraspberry piへアクセスする必要がある。
raspberry piは家にある。家はフレッツ回線でインターネット接続している。
フレッツのルータのポートフォワーディング(「静的IPマスカレード」)設定により、フレッツで割り当てられているグローバルIPアドレス宛にアクセスして、ルータによりLAN内のraspberry piに転送されている。
グローバルIPアドレスは変更されることもあるし、そもそも外部から自宅のネットワーク内にアクセスさせていることはあまりよくない。
台風が来た時にyoutubeにライブ映像がたくさんあるのを見て、
きっと簡単にできるに違いないと思いしらべてみると、
ffmpegを使うという情報がたくさん出てきた。
ところが、公開されている情報のとおりにやってみようとしてもなかなかうまくいかない。
ffmpegの基本的な動作から確認していこうと思う。
ffmpeg -f v4l2 -i /dev/video0 -c:v h264_omx -c:a aac -f matroska out.mkv
これはできた。
カメラの画像を.mkv形式の動画ファイルとして出力するものだ。
-i /dev/video0 は動画の入力デバイス。
out.mkv は出力ファイル名。
-c:v はビデオコーデック、 -c:a はオーディオコーデックか。
最初の -f v4l2 は、入力フォーマット、v4l2は Video for Linux version2
後ろの -f matroska は出力フォーマット
コマンドを実行すると、以下のように表示される。
(色や太字などはわかりやすいように変えた)
pi:~ $ ffmpeg -f v4l2 -i /dev/video0 -c:v h264_omx -c:a aac -f matroska out.mkv
ffmpeg version 3.2.14-1~deb9u1+rpt1 Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 6.3.0 (Raspbian 6.3.0-18+rpi1+deb9u1) 20170516
configuration: --prefix=/usr --extra-version='1~deb9u1+rpt1' --toolchain=hardened --libdir=/usr/lib/arm-linux-gnueabihf --incdir=/usr/include/arm-linux-gnueabihf --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libebur128 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-omx-rpi --enable-mmal --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libiec61883 --arch=armhf --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
libavutil 55. 34.101 / 55. 34.101
libavcodec 57. 64.101 / 57. 64.101
libavformat 57. 56.101 / 57. 56.101
libavdevice 57. 1.100 / 57. 1.100
libavfilter 6. 65.100 / 6. 65.100
libavresample 3. 1. 0 / 3. 1. 0
libswscale 4. 2.100 / 4. 2.100
libswresample 2. 3.100 / 2. 3.100
libpostproc 54. 1.100 / 54. 1.100
Input #0, video4linux2,v4l2, from '/dev/video0':
Duration: N/A, start: 1487.474279, bitrate: 283115 kb/s
Stream #0:0: Video: rawvideo (I420 / 0x30323449), yuv420p, 1024x768, 283115 kb/s, 30 fps, 30 tbr, 1000k tbn, 1000k tbc
[h264_omx @ 0x1215bb0] Using OMX.broadcom.video_encode
Output #0, matroska, to 'out2.mkv':
Metadata:
encoder : Lavf57.56.101
Stream #0:0: Video: h264 (h264_omx) (H264 / 0x34363248), yuv420p, 1024x768, q=2-31, 200 kb/s, 30 fps, 1k tbn, 30 tbc
Metadata:
encoder : Lavc57.64.101 h264_omx
Stream mapping:
Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (h264_omx))
Press [q] to stop, [?] for help
frame= 16 fps=2.6 q=-0.0 Lsize= 13kB time=00:00:06.16 bitrate= 17.9kbits/s speed=0.989x
最後の行(緑色)は時間の経過とともに更新されて、q を押すと停止する。
video:13kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 7.172307%
このpiにはマイクがないので、オーディオは録音されない。
出力された out.mkvをマウントしているWindowsの共有フォルダにコピーし、
vlcメディアプレイヤーで動画が再生できた。
ffmpegにはたくさんのパラメータがあって、出力をファイルではなくストリーミングにすることができるのである。
そんなに難しいことはないはず......