忍者ブログ

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

にわかもすなるIoTといふものを(その4)

前回の続きのようなもの。

さてさてラジーパイ3Bを入手したが何に使おうか、ということで。
あ、皆が皆ラジーパイにWordPressを入れたがるのはどういう理由付けなのか個人的に理解できないのでパス。C言語学習でのHello Worldみたいなものなのかね。

とりあえずはオンボードH.264エンコードエンジン活用も兼ねてIPカメラ化を。
公式カメラモジュールや適当なUSBカメラを接続してLANまたはインターネット越しにライブ画像を眺める。用意するソフトは、
nginx
おなじみ軽量HTTP(など)サーバー。公式ダウンロードページからMainlineなりStableなりのtarballを拾ってくる。
nginx-rtmp-module
nginxでRTMPを扱うアドオン。公式GitHubからCloneするなりzipでダウンロードするなりする。
FFmpeg
おなじみマルチメディア十徳ナイフ(笑)。これも公式GitHub(ミラー)あたりを同上。まあFFmpegは毎日がエブリデイ更新状態なのでgit clone/pullしておくのも悪くはない。
ビルドはお好みでどうぞ…と書いても記事にならないので参考までに。
  1. まずはビルドの前提になるものを…
    sudo apt-get install \
     libpcre3-dev libssl-dev \
     libasound2-dev libfontconfig1-dev librtmp-dev libx264-dev libsdl2-dev
  2. nginx w/RTMP…
    ./configure \
     --conf-path=/etc/nginx/nginx.conf \
     --error-log-path=/var/log/nginx/error.log \
     --pid-path=/var/run/nginx.pid \
     --lock-path=/var/lock/nginx.lock \
     --http-log-path=/var/log/nginx/access.log \
     --http-client-body-temp-path=/var/cache/nginx/body \
     --http-proxy-temp-path=/var/cache/nginx/proxy \
     --http-fastcgi-temp-path=/var/cache/nginx/fastcgi \
     --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
     --http-scgi-temp-path=/var/cache/nginx/scgi_temp \
     --with-http_ssl_module \
     --add-module=../nginx-rtmp-module
  3. FFmpeg w/RPi OMX…
    ./configure \
     --prefix=/usr/local/ffmpeg \
     --enable-gpl \
     --enable-version3 \
     --enable-fontconfig \
     --enable-libfreetype \
     --enable-librtmp \
     --enable-libx264 \
     --enable-mmal \
     --enable-omx-rpi \
     --extra-libs=-ldl
    かつてはラジーパイ実機でFFmpegビルドとか重すぎ(苦笑)だったらしいのだが今は昔。make -j4とかすればどんどん捗る(要強制冷却)。
  4. nginxをsystemd配下で稼動させる設定ファイル(nginx.service)…
    [Unit]
    Description=The NGINX HTTP and reverse proxy server
    After=syslog.target network.target remote-fs.target nss-lookup.target
    
    [Service]
    Type=forking
    PIDFile=/var/run/nginx.pid
    ExecStartPre=/usr/local/nginx/sbin/nginx -t
    ExecStart=/usr/local/nginx/sbin/nginx
    ExecReload=/bin/kill -s HUP $MAINPID
    ExecStop=/bin/kill -s QUIT $MAINPID
    PrivateTmp=true
    Nice=-10
    
    [Install]
    WantedBy=multi-user.target
  5. nginx自体の設定ファイル(/etc/nginx/nginx.conf)…
    #
    worker_processes 1;
    user root staff;
    events {
        worker_connections 128;
    }
    rtmp {
        server {
            listen 1935;
            chunk_size 16384;
            buflen 1000ms;
            exec_kill_signal term;
            allow publish 127.0.0.0/8;
            allow publish 192.168.0.0/16;
            deny publish all;
            allow play 127.0.0.0/8;
            allow play 192.168.0.0/16;
            deny play all;
            application webcam {
                live on;
                exec_pull /usr/local/webcamhelper/nginx_rtmp_exec_pull_wrapper '$app' '$name';
            }
        }
    }
  6. rtmp://{ラジーパイのアドレス}/webcam/* に接続した際に呼ばれるシェルスクリプト(/usr/local/webcamhelper/nginx_rtmp_exec_pull_wrapper)…
    #!/bin/bash
    
    FFMPEG=/usr/local/ffmpeg/bin/ffmpeg
    on_TERM(){
     pkill -TERM -P $$
    }
    trap 'on_TERM' TERM
    STEM=$(dirname $0)/rtmp
    DEVICE=$(readlink -f $(cat "$STEM.$1.$2.device"))
    $STEM.$1.$2.init $DEVICE
    $FFMPEG -hide_banner $(cat $STEM.$1.$2.ffmpeg_arg0) -i $DEVICE $(cat $STEM.$1.$2.ffmpeg_arg1) -f flv "rtmp://localhost:1935/$1/$2" &
    wait
  7. nginx_rtmp_exec_pull_wrapper と同じ場所に rtmp.{$app}.{$name}.device という名前で使用するカメラを識別するデバイスパスを、
    /dev/v4l/by-id/*
    rtmp.{$app}.{$name}.init という名前で最初の接続の際)に呼ばれるシェルスクリプト(主にカメラ初期化用)を、
    #!/bin/bash
    
    uvcdynctrl -d $1 -s Brightness *
    uvcdynctrl -d $1 -s Contrast *
    ...
    rtmp.{$app}.{$name}.ffmpeg_arg0 / rtmp.{$app}.{$name}.ffmpeg_arg1 という名前でFFMpegに渡すパラメータを書いておく。
    -loglevel error
    -fflags nobuffer -rtbufsize *M
    -f v4l2 -video_size *x* -input_format rawvideo -framerate *
    -filter_complex hqdn3d=3,drawtext=text=%{localtime}:fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSansCondensed-Bold.ttf:fontsize=32:fontcolor=white@1.0:shadowcolor=black@0.8:shadowx=3:shadowy=3:x=(w-text_w)/2:y=16,fps=*
    -c:v h264_omx -b:v *M -g * -zerocopy 1
    {$app} は上記の例だと webcam に、{$name} はわかりやすい名称や番号とかにする。あとアスタリスクになっているところは実際の機材や環境に合わせて適当に。
これで rtmp://{ラジーパイのアドレス}/{$app}/{$name} をアクセスすると初期化スクリプトやFFmpegが勝手に起動して指定のカメラ動画をネット越しに取れるようになる。 単にカメラ動画取れました、おしまい…ではなくてカメラの種類や台数に変更があっても系統だって対応できるように仕立ててあるのでよかったら参考に。

拍手[0回]

PR

コメント

お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード Vodafone絵文字 i-mode絵文字 Ezweb絵文字

カレンダー

04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

フリーエリア

最新コメント

プロフィール

HN:
jjsuwa
性別:
非公開

バーコード

ブログ内検索

P R