Raspberry Pi USB webcamera 動画ストリーミング配信(オマケで音声も配信)

mjpg-streamer寝ている赤ちゃんやラヴリィな愛玩動物、さらには徘徊する御老人等々を見守るために、ラズベリーパイとUSB webcamを使いWifiで画像と音声のストリーミング配信をする実験を行いました。
いろいろ試してみたのですが、なかなか動作が安定せず現在も試行錯誤の段階です。その過程でまた新たに512MB RAMのRPiを買ってしまいました。

スペックです。

Raspberry Pi Model B
Downloaded image: 2012-12-16-wheezy-raspbian.zip
uname -a output: 3.2.27+ #250 PREEMPT Thu Oct 18 19:03:02 BST 2012 armv6l GNU/Linux

Webcam : Logitech C270
Wireless adapter: BUFFALO WLI-UC-GNM2

lsusb output:
Bus 001 Device 004: ID 0411:01ee BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNM2 Wireless LAN Adapter [Ralink RT3070]
Bus 001 Device 005: ID 046d:0825 Logitech, Inc. Webcam C270

cat /proc/cpuinfo

Hardware : BCM2708
Revision : 000f

電源は 5V 2A

まず動画の配信ですが、ffmpeg ffserverを使う方法やMotion, MJPG-Streamerなど何種類かを色々なサイトを参考にして実験してみました。

Motion(http://www.lavrsen.dk/foswiki/bin/view/Motion/WebHome) は apt-get で簡単にインストールでき、コンフィグ設定が簡単、しかも多機能なのでとても良いのですが、Raspberry Piの処理速度に起因してか最大で352×288 pixel の画像しか見ることができません。さらに問題なのは、私の環境では起動から数時間経過するとuvcvideo関係のエラーで動作が止まってしまう事でした。

しかしMotionは、玄箱HG(KURO-BOX HG) + C270 webcam + Debian squeeze + 640×480(画像)に設定して安定して動いていた経験があります。RPiでのこのエラー原因は、現versionのRaspbianの実装の問題か、またはwebcamとの相性なのか、良くわかりません。(ちなみに archlinux-hf-2012-09-18.zip でも試してみましたが、結果は同じでした)

結局、現在はディレイが少なく画像も640×480 pixelを軽快に再生できるMjpg-streamerを使っています。webcamは家電量販店で安く売っていたELECOM UCAM-DLD200BAも試してみたのですが、私の場合Logitech C270との方が相性が良いみたいです。ちなみにこの組み合わせで1280×960 pixelの再生も可能でした。でも、動画再生の様子ははカクカクという感じです。これは無線LANの通信速度にも大きく依存すると思います。

Mjpg-streamerのインストールについては多くの方が書かれているのですが、私はSLB Labs さんのサイト(http://www.slblabs.com/2012/09/26/rpi-webcam-stream/)を参考にさせていただきました。

作業手順は上記サイトに記載されている通りです。Raspbianインストール後、初期設定を行った後に、まずアップデートしておきました

# apt-get update
# apt-get upgrade

そして、こちらからmjpg-streamer-r63.tar.gzをダウンロード

任意のディレクトリで解凍
# tar xvzf mjpg-streamer-r63.tar.gz

コンパイルするためにlibjpeg8-devをインストール
# apt-get install libjpeg8-dev

シンボリックリンクを作成
# ln -s /usr/include/linux/videodev2.h /usr/include/linux/videodev.h

コンパイル
# cd mjpg-streamer-r63
# CFLAGS+=”-O2 -march=armv6 -mfpu=vfp -mfloat-abi=hard” make

/etc/rc.localファイルの# By default this script does nothing.の下あたりに下記を追記するとブート時に自動起動します。

cd /'ファイル パス'/mjpg-streamer-r63/
export LD_LIBRARY_PATH=.
./mjpg_streamer -i './input_uvc.so -d /dev/video0 -r 320x240 -f 3' -o './output_http.so -w www -p 8080'

(2013/02/24 -r -f の値を変更しました。 thanks D.K )

クライアントPCのブラウザで
http://ラズベリーパイのip address:8080
にアクセスすると、FirefoxやChomeさらに IEでもjavascriptを利用して動画を見ることができます。

また、スカイの社長日記さんのサイト(http://skysh.kyo2.jp/e391120.html) を参考にさせていただき、

/boot/cmdline.txt に smsc95xx.turbo_mode=N を追加 ===> (2013/02/03追記へ)

# raspi-config にて

overclock –> Turbo 1000MHz ARM, 500MHz core, 600MHz SDRAM, 6 overvolt
memory_split –> 16

にしてあります。また無線LANの設定は前回のエントリー(修正アリ)の通りに設定しました。

さて、C270 webcamにはマイクも付いていますので音声も同時ストリーミングに挑戦してみました。

こちら pruperさんのサイト (http://prupert.wordpress.com/2010/08/02/stream-live-audio-from-a-microphone-in-near-real-time-in-ubuntu/)や

こちらのサイト (http://ffmpeg.org/trac/ffmpeg/wiki/Capturing%20audio%20with%20FFmpeg%20and%20ALSA) を参考にしました。

まずffmpeg と lame をインストールします

# apt-get install ffmpeg lame

# arecord -l で Audio Input device を表示させます

**** List of CAPTURE Hardware Devices ****
card 1: U0x46d0x825 [USB Device 0x46d:0x825], device 0: USB Audio [USB Audio]
Subdevices: 0/1
Subdevice #0: subdevice #0

C270 webcamの音声(Microphone on the USB web cam)は上記の通り card 1 ですので ffmpeg の -i オプションで指示する値を hw:1 にします。

# ffmpeg -f alsa -ac 1 -i hw:1 -acodec libmp3lame -ab 32k -re -f rtp rtp://239.5.5.5:1234 >/dev/null 2>&1 &

上記を実行した後にクライアントPCから VLC mdedia player を起動して

メディア (Media)- ネットワークストリームを開く(Open Network Stream) – ネットワークURL欄に rtp://239.5.5.5:1234 – 再生 (Play)

の順にすすめば音声も聞くことができます。

【映像・音声の遅延について】
ネットワークの通信速度にもよるのでしょうが、私の実験では映像に1秒-3秒くらいのディレイがあります。さらに遅れて音声が届くという感じです。

【CPU等の使用率: topの抜粋です】

画像のみの時 (Mjpg-streamer)

top - 21:03:22 up 2 min,  1 user,  load average: 0.37, 0.26, 0.11
Tasks:  60 total,   1 running,  59 sleeping,   0 stopped,   0 zombie
%Cpu(s):  4.1 us, 10.7 sy,  0.0 ni, 85.2 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:    497764 total,    68868 used,   428896 free,     8976 buffers
KiB Swap:   102396 total,        0 used,   102396 free,    39144 cached

  PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND
 2187 root      20   0 45760 1652 1468 S   5.2  0.3   0:02.35 mjpg_streamer

画像+音声 (Mjpg-streamer + ffmpeg)

top - 20:59:27 up 33 min,  1 user,  load average: 1.04, 1.12, 0.82
Tasks:  63 total,   2 running,  61 sleeping,   0 stopped,   0 zombie
%Cpu(s): 59.2 us, 15.4 sy,  0.0 ni, 25.4 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:    497764 total,    99988 used,   397776 free,    12920 buffers
KiB Swap:   102396 total,        0 used,   102396 free,    57880 cached

  PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND
15352 root      20   0 37268  10m 4380 R  56.7  2.1   7:56.70 ffmpeg
 2170 root      20   0 53952 1840 1468 S   5.5  0.4   1:43.38 mjpg_streamer

ffmpeg はCPUの使用率が高いです。

調子良く運用できそうだったのですが、やはりエラーメッセージを出して止まってしまいます。 (涙)

Jan 30 17:51:35 raspberrypi MJPG-streamer [2209]: Error grabbing frames
Jan 30 17:51:35 raspberrypi kernel: [12810.889315] uvcvideo: Non-zero status (-5) in video completion handler.

この方法で音声も送るのには無理があるのでしょうか?今後の課題です。

キャプチャ

(2013/02/03 追記)

残念ながらしばらく動かしていると止まってしまい安定しません。どうやらUSB webcamだけでなくUSB無線アダプタの方も安定しないみたいです。smsc95xx問題関係かと思い対策方法を検索してみたところ、次の記事が目に留まりました。

http://www.raspberrypi.org/phpBB3/viewtopic.php?t=21963&p=259518

bgirardot さんがdevelopment firmwarenへのアップデートについて記載されていたので、カーネルパラメータに追記する方法に変えて試してみました。参照先にもかかれているように一度開発版のファームウエアにアップデートすると、元に戻すのはとても難しいので注意が必要です。(bgirardotさんはSDメモリカードのコピーを勧めています)

https://github.com/Hexxeh/rpi-update へアクセスしてこちらに書かれている通りに作業しました。(スパーユーザーの権限で行います)

■ [preparaitons(準備作業)]
私にはこの作業は必要なかったですが、行うとすれば

# apt-get update

# apt-get install ntpdate

# ntpdate -u ntp.nict.jp

# apt-get install ca-certificates

■ [rpi-update コマンドのインストール]

# wget http://goo.gl/1BOfJ -O /usr/bin/rpi-update && sudo chmod +x /usr/bin/rpi-update

# apt-get install git-core

■ [rpi-update の実行]

# rpi-update

# reboot

■ [上記コマンド実行の結果]

# uname -a の表示です。

Linux raspberrypi 3.6.11+ #366 PREEMPT Wed Jan 30 12:59:10 GMT 2013 armv6l GNU/Linux

まだ、長時間テストしているわけではないのですが安定性は良いみたいです。ただ、mjpg-streamerを実行した時の再生スピードが遅くなってしまったような感じがします(バラツキがある)。

(2013/02/05 さらに追記) 残念ながら上記設定でも長時間運用していると下記のエラーを出して動画配信が止まってしまいました。安定的に連続で動かせるようになるには、しばらくかかりそうです。

Feb 5 05:19:23 raspberrypi kernel: [78477.340097] uvcvideo: Non-zero status (-5) in video completion handler.