Hatena::ブログ(Diary)

被爆少女の唇は屍体性愛《ネクロフィリア》の夢を囁く このページをアンテナに追加 RSSフィード Twitter

2011-01-27

水槽にライブカメラを付けてみた。(ストリーミング配信編)

前回の記事で、UVC 対応の安物 USB カメラを使った撮影画像の配信を行なったが、今度は動画としてストリーミング配信を行う事にした。

利用したのは、ffmpeg と ffserver。ffmpeg は言わずと知れた高機能動画エンコーダで、ffserver はエンコードした動画を配信する為のサーバだ。

ffmpeg をインストールすると、ffserver も同時にインストールされるようで、自分のシステムには既に入っていた。

まずは、ffserver の設定から行う。設定ファイルは、例に漏れず /etc/ffserver.conf だ。

# ffserver の基本的な設定
Port                8090
BindAddress         0.0.0.0
MaxClients          1000
MaxBandwidth        10000
CustomLog           -

# サーバへの入力設定
# フィード(送られてくるストリーミング動画データを受け取るモノ)
<Feed feed1.ffm>
    File            /tmp/feed1.ffm
    FileMaxSize     2000K
    ACL             allow 127.0.0.1
</Feed>

# サーバからの出力設定
# この場合は、aqua120.swf という Flash ファイル。
# Flash のストリーミングプレイヤーも ffserver が生成してくれる。
<Stream aqua120.swf>
    Feed            feed1.ffm
    Format          swf
    VideoBitRate    512
    VideoBufferSize 256
    VideoFrameRate  30
    VideoSize       320x240
    VideoGopSize    15
    NoAudio
    VideoQMin       3
    VideoQMax       31
    Preroll         0
</Stream>

# サーバステータスページの設定。
<Stream stat.html>
    Format          status
    ACL             allow localhost
    ACL             allow 192.168.0.0 192.168.255.255
</Stream>

# http://example.com:XXXX/index.html にアクセスがあった場合、
# ffmpeg の公式ページにでもリダイレクトしておく。
# これはデフォルト設定で、必須ではない。
<Redirect index.html>
    URL             http://www.ffmpeg.org/
</Redirect>

ブラウザでも見れるように、と、上記のよう Flash プレイヤーによるストリーミング動画配信を行う設定にした。その後、ffserver を起動する。

$ sudo ffserver

次に、ffmpeg で USB カメラの映像をエンコードしながら、サーバに渡してやる。

$ ffmpeg -f video4linux2 -s 320x240 -r 15 -b 512 -an -i /dev/video0 http://localhost:8090/feed1.ffm
# video4linux2 … UVC ビデオの映像を扱う為のビデオフォーマットライブラリを指定。
# feed1.ffm … ffserver.conf で設定したフィード名を指定。

エンコードを開始したら、http://127.0.0.1:8090/stat.htmlウェブブラウザで表示する。ここで、ffserver のステータス、配信情報などが確認出来る。

設定ファイルで、swf ファイル名を aqua120.swf としたので、映像をブラウザから見るには、http://127.0.0.1:8090/aqua120.swf を開けば良い。

映像の確認が出来たら、一度 ffmpeg と ffserver を停止した。

ffserver、ffmpeg の両者とも、バックグラウンド実行をしていても、やたら STDOUT を汚す。

また、ffmpeg はバックグラウンドに追いやると、エンコードをストップさせるみたいだったので、以下のような stream.sh を書いた。

#!/bin/sh
case $1 in
    start)
        ffserver  >/dev/null 2>&1 &
        pid_ffs=$!
        ffmpeg -f video4linux2 -s 320x240 -r 15 -b 256 -an \
            -i /dev/video0 http://localhost:8090/feed1.ffm >/dev/null 2>&1 &
        pid_ffm=$!
        ;;
    stop)
        # kiken!
        killall -9 ffmpeg
        killall -9 ffserver
        ;;
    *)
        echo "stream.sh stop|start"
        ;;
esac

メッセージは null デバイスに捨て、それぞれバックグラウンド実行。

stop 時に、他の ffmpeg/ffserver までぶっ殺してしまう危ないスクリプトなのだけれども、特に気にしない。あとは、root になって

$ su
パスワード:
# ./stream.sh start
# exit
$

とすれば、バックグラウンド実行をしてくれる。

うちの水槽の場合、夜間は完全に消灯しているので、画面は真っ暗で何も映らなくなる。

そこで節約の為に、crontab に以下のような記述を追加し、「あさ8時から夕方6時まで絶賛放送中!!!」みたいな事をしてみた。

00       8      *    *   * root sh /dir/path/stream.sh start
00      18      *    *   * root sh /dir/path/stream.sh stop

以下の URL で実際に稼働中のストリーミング動画を見る事が出来る。

http://sasebo.ddo.jp/~dyama/aqua/

f:id:dyama:20110210094434p:image

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

リンク元