RaspberryPiで高画質ライブ配信 Jessie with PIXEL版

提供: ディーズガレージ wiki
2017年4月30日 (日) 03:29時点におけるShogooda (トーク | 投稿記録)による版 (開発環境)

(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
移動先: 案内検索

超低電力・超低負荷・高品質ライブ放送機器、LiveBot3作ってみます。
ハードウエアエンコーダーでH.264映像ストリームを生成。同時にソフトウエアエンコーダーでAAC音声ストリームを生成。H.264とAACでFLVを作りローカルのRTMPサーバに送信。RTMPサーバがデータパケットを感知し外部の各ライブ配信サイトにプッシュする仕組みです。

開発環境

ボード Raspberry Pi3 ModelB or Raspberry Pi2 ModelB
OS Raspbian Jessie with PIXEL 2017-01-11
microSDHC SanDisk Ultra microSDHC Class10 8GB
カメラ Raspberry Pi Camera Modules V2
LAN 標準搭載のWiFi
マイク BUFFALO BSHSAU01BK
audio-technica AT-HA2
audio-technica AT9941
ボード Raspberry Pi Zero
OS Raspbian Jessie with PIXEL 2017-01-11
microSDHC SanDisk Ultra microSDHC Class10 8GB
カメラ Raspberry Pi Camera Modules V2
LAN BUFFALO WLI-UC-GNM2
マイク なし

動作検証

USTREAM

LiveBot3
LiveBot3.jpg

LiveBot3 - 機能制限版 - 用意しました。配信機能を削除してますのでご自由にお試しください。

機器の具合

機器 CPU使用量 (フルHD 30FPS の場合)
Raspberry Pi3 5%程度
Raspberry Pi Zero 40%程度

ファームウェア更新

$ sudo rpi-update

再起動

$ sudo reboot

最新状態にアップデート

$ sudo apt-get update
$ sudo apt-get upgrade

再起動

$ sudo reboot

アップデートの自動化

インストール

$ sudo apt-get install unattended-upgrades
$ sudo dpkg-reconfigure -plow unattended-upgrades
GUIがでるので「はい」を選択

設定

$ sudo leafpad /etc/apt/apt.conf.d/50unattended-upgrades

変更箇所(セキュリティーアップデートのみ自動アップデート設定)

//      "o=Raspbian,a=stable";"o=Raspbian,a=stable";
に

//Unattended-Upgrade::Automatic-Reboot "false";
を
Unattended-Upgrade::Automatic-Reboot "true";
に

//Unattended-Upgrade::Automatic-Reboot-Time "02:00";
を
Unattended-Upgrade::Automatic-Reboot-Time "03:00";

再起動

$ sudo reboot

ホスト名

ホスト名 http://livebot3.local でアクセスできるようにします。
Microsoft Edgeで失敗するように見えます。
Microsoft Edge mDNS .local辺りで検索すると解決策はあるように見えます。
ホスト名変更

$ sudo leafpad /etc/hostname

変更

livebot3

ホスト名変更

$ sudo leafpad /etc/hosts

変更

127.0.1.1 livebot3

再起動

$ sudo reboot

IP固定

ホスト名でアクセスする場合IPを固定する必要はありません。

$ sudo leafpad /etc/dhcpcd.conf

Raspberry Pi3の場合
末尾に追記(設定内容は各ネットワーク環境により異なります。「Raspberry Pi Jessie IP固定」などで検索してみてください。)

interface eth0
static ip_address=192.168.1.184/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1

Raspberry Pi3のWiFiも固定IPにしてしまう場合

interface eth0
static ip_address=192.168.1.184/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1

interface wlan0
static ip_address=192.168.1.185/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1

再起動

$ sudo reboot

マイクセッティング

マイクを使わない場合は設定の必要ありません

USBマイクが認識されてるか確認

$ lsusb
Bus 001 Device 004: ID 0d8c:013c C-Media Electronics, Inc. CM108 Audio Controller
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

優先度の確認

$ cat /proc/asound/modules
0 snd_bcm2835
1 snd_usb_audio

優先順位をRaspberryPi内臓マイクからUSBマイクに変更

$ sudo leafpad /etc/modprobe.d/alsa-base.conf

コピー&ペースト

options snd slots=snd_usb_audio,snd_bcm2835
options snd_usb_audio index=0
options snd_bcm2835 index=1

再起動

$ sudo reboot

優先度の確認

$ cat /proc/asound/modules
0 snd_usb_audio
1 snd_bcm2835

録音ボリューム

$ alsamixer
F6で0 USB PnP Audio Deviceを選びF4でボリューム50程度に設定しEscで設定終了

録音テスト

$ arecord -D plughw:0,0 -f cd test.wav
エラーが出なければOK
Ctrl+Cで停止

再生テスト

$ aplay test.wav
再生中 WAVE 'test.wav' : Signed 16 bit Little Endian, レート 44100 Hz, ステレオ

カメラセッティング

参考: Getting started with picamera | Raspberry Pi Learning Resources
以降の遠隔操作設定をしてネットワーク先のパソコンからカメラ映像見ようとしても、そのモニターには映りません。
(RaspberryPi直結のモニターには映ります。)
遠隔操作設定の前にカメラセッティングをしておきます。

Menu→設定→RaspberryPiの設定→インターフェイスタブ→カメラ有効→OK→再起動

CPUよりGPUが重要なので配分を変更しておきます。

Menu→設定→RaspberryPiの設定→パフォーマンスタブ→GPUメモリ 256程度に変更

表示テスト

$ sudo leafpad camera.py

コピー&ペースト

from picamera import PiCamera
from time import sleep

camera = PiCamera()

#camera.rotation = 180
camera.start_preview()
sleep(10)
camera.stop_preview()

起動

$ python camera.py

10秒間画面一杯に映像が表示されればOK 再起動

$ sudo reboot

遠隔操作

運用にはモニター、マウス、キーボードは必要ないので、この段階で遠隔操作にしてしまいます。
Raspbian Jessie with PIXEL にはRealVNCが標準で入ってます。これを使用してみます。

デフォルトで有効になってないので

Menu→設定→RaspberryPiの設定→インターフェイスタブ→VNC有効→OK→再起動

何も考えずディスプレイを取り外しVNCに接続すると画面サイズが656x416となってしまいます。おまじないがあるようなので設定しておきます。

$ sudo leafpad /boot/config.txt
#hdmi_mode=1の下に以下を追加
hdmi_ignore_edid=0xa5000080
hdmi_group=2
hdmi_mode=47

参考: config.txt - Raspberry Pi Documentation

RaspberryPiをシャットダウン

モニター、マウス、キーボードを取り外して電源入れ直し

VNCクライアントから接続してみる
ホスト名で接続する場合、クライアントパソコンにはavahiかBonjourがインストールされている必要があります。
Windowsパソコンだけ問題になりやすく、簡単な方法はiTunesをインストールすることです。
ネット検索で「Raspberry avahi Bonjour」辺りで調べると詳しい事情が出てきます。

RealVNC Viewerの場合
VNC Server: livebot3.local
Username: pi
Password: raspberry
Confirm: raspberry

成功していれば、以降はVNCクライアントの窓の中で作業できます。

nginx-rtmpのインストール

インストール

$ sudo apt-get update
$ sudo apt-get install build-essential libssl-dev libpcre3-dev
$ mkdir nginx-rtmp
$ cd nginx-rtmp
$ wget http://nginx.org/download/nginx-1.9.5.tar.gz
$ wget https://github.com/arut/nginx-rtmp-module/archive/master.zip
$ tar -zxvf nginx-1.9.5.tar.gz
$ unzip master.zip
$ cd nginx-1.9.5
$ ./configure --with-http_ssl_module --add-module=../nginx-rtmp-module-master
$ make
$ sudo make install

自動起動設定

$ cd ~
$ sudo wget https://raw.githubusercontent.com/JasonGiedymin/nginx-init-ubuntu/master/nginx -O /etc/init.d/nginx
$ sudo chmod +x /etc/init.d/nginx
$ sudo update-rc.d nginx defaults

動きません(汗)。起動順の調整が必要に思います。
暫定対応

$ sudo leafpad /etc/init.d/nginx
209行辺りstart() {の下に一行追加して
sleep 10
追記

再起動

$ sudo reboot

動作確認

http://livebot3.local

php5-fpmのインストール

インストール

$ sudo apt-get install php5-fpm

パーミッションエラー回避

$ sudo leafpad /etc/php5/fpm/pool.d/www.conf

変更部分 49行目

listen.owner = www-data
listen.group = www-data
;listen.mode = 0660
を
listen.owner = www-data
listen.group = www-data
listen.mode = 0666

再起動

$ sudo reboot

GStreamerのインストール

インストール

$ sudo apt-get install gstreamer1.0-*

途中エラーで停止

処理中にエラーが発生しました:
 /var/cache/apt/archives/gnome-packagekit-data_3.14.0-1_all.deb
 /var/cache/apt/archives/gnome-packagekit-session_3.14.0-1+b1_armhf.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)

もう一度インストールを繰り返してみます。

$ sudo apt-get install gstreamer1.0-*

完了するので以降進めてみます。

確認

$ gst-inspect-1.0

gst-rpicamsrcのインストール

参考: gst-rpicamsrc
GStreamerにRaspberryPiカメラモジュール映像を取り込むために必要になります。
インストール

$ sudo apt-get install libgstreamer1.0-dev  libgstreamer-plugins-base1.0-dev
$ git clone https://github.com/thaytan/gst-rpicamsrc.git
$ cd gst-rpicamsrc
$ ./autogen.sh --prefix=/usr --libdir=/usr/lib/arm-linux-gnueabihf/
$ make
$ sudo make install

確認

$ gst-inspect-1.0 | grep rpicamsrc

配信テスト

nginx-rtmpの設定

$ cd ~
$ sudo cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.back
$ sudo leafpad /usr/local/nginx/conf/nginx.conf
UstreamのURLとStreamKey
Youtube LiveのURLとStreamKey

コピー&ペーストで上書き
配信サイトの#pushのコメント(#)を消すと有効になります。
URLとStreamKeyを設定。
USTREAMとYoutube Live両方設定するとマルチ配信になります。

#user nobody;
worker_processes 4;

events {
    worker_connections 1024;
}

http {
    include mime.types;
    default_type application/octet-stream;
    sendfile on;
    keepalive_timeout 65;

    server {
        listen 80;
        server_name localhost;

        location / {
            root html;
            index index.php index.html index.htm;
        }
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root html;
        }
        location ~ \.php$ {
            fastcgi_pass  unix:/var/run/php5-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param SCRIPT_NAME     $fastcgi_script_name;
            fastcgi_param PATH_INFO       $fastcgi_script_name;
            include /usr/local/nginx/conf/fastcgi_params;
        }
    }
}

rtmp {
    server {
        listen 1935;

        ping 30s;
        ping_timeout 10s;
        drop_idle_publisher 15s;

        application live {
            live on;
            record off;

            #USTREAM
            #push rtmp://1.2345678.fme.ustream.tv app=ustreamVideo/123456789 playpath=ABCDEFGHIJKLMNOPQRSTUVWXYZ012345;

            #YouTube
            #push rtmp://a.rtmp.youtube.com/live2/abcd-efgh-ijkl-mnop;

            #Other
            #push rtmp://XXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;
        }
    }
}

再起動

$ sudo reboot

php5-fpmの動作確認

新規作成

$ sudo leafpad /usr/local/nginx/html/info.php

コピーペースト

<?php
    phpinfo();
?>

動作確認

http://livebot3.local/info.php

liveスクリプトの設定

新規作成

$ sudo leafpad live

コピーペースト
※マイクのサンプリングレート、ビットレートがハードの規格に合わないとエラーになります。
※YoutubeLiveの推奨値、映像ビットレート4500Kbps、音声ビットレート128Kbpsで設定しています。

#!/bin/sh

# SETTING ###############################

# VIDEO

WIDTH=1920 # 解像度(幅)
HEIGHT=1080 # 解像度(高)
FRAMERATE=30 # フレームレート(fps)
PROFILE="high" # プロファイル baseline , main , high
BITRATE=4500000 # ビットレート(bps) (0-25000000) 0 for VBR using quantisation-parameter 規定値:17000000
VFLIP=false # 上下反転 規定値:false
HFLIP=false # 左右反転 規定値:false
ROTATION=0 # 回転(0,90,180,270) 規定値:0

EXPOSUREMODE=1 # 露出モード (0-12) 0:off 1:auto 2-12:etc. 規定値:1
EXPOSURECOMP=0 # 露出補正(-10-10) 規定値:0
WHITEBALANCE=1 # ホワイトバランス 0:off 1:auto 2-9:etc. 規定値:1
REDBALANCE=0 # AWB Gain for red channel when WHITEBALANCE=off (0-8) 規定値:0
BLUEBALANCE=0 # AWB Gain for blue channel when WHITEBALANCE=off (0-8) 規定値:0
SHUTTERSPEED=0 # シャッタースピード (0-6000000) 0:auto 規定値:0
ISO=0 # ISO感度 (0-3200) 0:auto 規定値:0
METERING=0 # 測光モード(0-3) 0:average 1:spot 2:backlist 3:matrix 規定値:0
STABILIZATION=false # 画像安定化 規定値:false

TIMESTAMP=true # タイムスタンプ 規定値:false
KEYINTERVAL=-1 # キーフレームインターバル (-1-2147483647) -1=automatic, 0=single-keyframe 規定値:-1
QUANTISATION=0 # 量子化パラメータ (0-2147483647) approx 10-40 with bitrate=0 for VBR encoding. 0=off 規定値:0
BLOCKSIZE=-1 # ブロックサイズ (0-4294967295) 規定値:4096(-1=default)
INTRATYPE=-1 # 周期的イントラ更新 -1:none 0:cyclic 1:adaptive 2:both 2130706433:cyclic-rows 規定値:-1
SENSORMODE=0 # センサーモード(0-7) 0:automatic 1-7:etc. 規定値:0

BRIGHTNESS=50 # 明るさ (0-100) ステップ1  規定値:50
CONTRAST=0 # コントラスト (-100-100) ステップ1  規定値:0
SATURATION=0 # 彩度 (-100-100) ステップ1 規定値:0
SHARPNESS=0 # シャープネス (-100-100) ステップ1 規定値:0
DYNAMICRANGE=0 # ダイナミックレンジ 0:off 1:low 2:medium 3:high 規定値:0
IMAGEEFFECT=0 # VFXイメージエッフェクト (0-22) 規定値:0

# AUDIO

VOLUME=0.5 # ボリューム(0-1.0)
CHANNEL=1 # チャンネル 1:mono  2:stereo
ASAMPLE=44100 # サンプリングレート(Hz)
ABITRATE=128000 # ビットレート(bps)
FORMAT=S16LE # フォーマット

# EXECUTE ###############################

CMD="gst-launch-1.0 \
rpicamsrc preview=false blocksize=$BLOCKSIZE bitrate=$BITRATE do-timestamp=$TIMESTAMP keyframe-interval=$KEYINTERVAL intra-refresh-type=$INTRATYPE hflip=$HFLIP vflip=$VFLIP rotation=$ROTATION iso=$ISO brightness=$BRIGHTNESS contrast=$CONTRAST saturation=$SATURATION sharpness=$SHARPNESS exposure-mode=$EXPOSUREMODE exposure-compensation=$EXPOSURECOMP image-effect=$IMAGEEFFECT quantisation-parameter=$QUANTISATION shutter-speed=$SHUTTERSPEED sensor-mode=$SENSORMODE drc=$DYNAMICRANGE video-stabilisation=$STABILIZATION metering-mode=$METERING awb-mode=$WHITEBALANCE awb-gain-red=$REDBALANCE awb-gain-blue=$BLUEBALANCE ! \
queue ! \
video/x-h264, width=$WIDTH, height=$HEIGHT, framerate=$FRAMERATE/1, profile=$PROFILE ! \
h264parse ! \
flvmux name=mux streamable=true alsasrc device=hw:0 ! \
queue ! \
volume volume=$VOLUME ! \
audio/x-raw, format=$FORMAT, rate=$ASAMPLE, channels=$CHANNEL ! \
voaacenc bitrate=$ABITRATE ! \
queue ! \
mux. mux. ! \
rtmpsink location='rtmp://localhost/live/stream'"

$CMD

マイクなしの場合

# EXECUTE ###############################

CMD="gst-launch-1.0 \
rpicamsrc preview=false blocksize=$BLOCKSIZE bitrate=$BITRATE do-timestamp=$TIMESTAMP keyframe-interval=$KEYINTERVAL intra-refresh-type=$INTRATYPE hflip=$HFLIP vflip=$VFLIP rotation=$ROTATION iso=$ISO brightness=$BRIGHTNESS contrast=$CONTRAST saturation=$SATURATION sharpness=$SHARPNESS exposure-mode=$EXPOSUREMODE exposure-compensation=$EXPOSURECOMP image-effect=$IMAGEEFFECT quantisation-parameter=$QUANTISATION shutter-speed=$SHUTTERSPEED sensor-mode=$SENSORMODE drc=$DYNAMICRANGE video-stabilisation=$STABILIZATION metering-mode=$METERING awb-mode=$WHITEBALANCE awb-gain-red=$REDBALANCE awb-gain-blue=$BLUEBALANCE ! \
queue ! \
video/x-h264, width=$WIDTH, height=$HEIGHT, framerate=$FRAMERATE/1, profile=$PROFILE ! \
h264parse ! \
flvmux ! \
rtmpsink location='rtmp://localhost/live/stream'"

$CMD

実行権限

$ sudo chmod +x live

動作確認

liveスクリプトを起動すると配信を開始します。

起動

$ ./live

nginxの設定で公開設定にしてるサイトで正常に配信されてるか確認

停止

Ctrl+C または端末を閉じる

インターフェイスの用意

LiveBot3
cssフォルダ index.php(インターフェイス)用
jsフォルダ index.php(インターフェイス)用
cron.php インターフェイス無し、cronから起動
index.php インターフェイス
save.php インターフェイス無し、index.phpから起動
save.txt 全ての設定値記録
nginx.conf nginx-rtmp配信設定、index.phpのON/OFF設定から判断
liveスクリプト GStreamer配信設定、save.txtの設定値読み込み

index.phpはリセット用のデフォルト値を全ての項目で持ちつつsave.txtを読み込みます。
save.txtは全ての項目で設定値を記録してます。
index.phpは設定を終え保存するとsave.phpがsave.txtに全ての設定値を記録しURLだけはnginx.confを書き換えし再起動します。
再起動後はliveスクリプトが自動起動しsave.txtを読み込み、設定された内容で自動配信します。
カメラモジュールの夜間高感度性能を最大限引き出すために、24時間配信の場合日中と夜間で自動的に設定を変える項目を用意してます。cronで10分毎に起動するcron.phpが緯度経度を元に現在時刻、日の出時刻、日の入時刻の相互関係をチェック。現在時刻が日の出日の入時刻と交差する時だけsave.txtの昼夜の設定を書き換え再起動し継続して自動配信します。

ダウンロード version0.5

$ wget http://dz.plala.jp/wiki_data/livebot3v0.5.zip
$ unzip livebot3v0.5.zip

登録

$ sudo mv /usr/local/nginx/html/index.html /usr/local/nginx/html/index.html.back
$ sudo mv /usr/local/nginx/html/50x.html /usr/local/nginx/html/50x.html.back
$ sudo mv /usr/local/nginx/html/info.php /usr/local/nginx/html/info.php.back
$ sudo cp -R livebot3v0.5/. /usr/local/nginx/html/

パーミッション変更

$ sudo chmod 0666 /usr/local/nginx/conf/nginx.conf
$ sudo chmod 0666 /usr/local/nginx/html/save.txt

日本以外ではphpに記述したタイムゾーンの変更が必要
List of Supported Timezones

$ sudo leafpad /usr/local/nginx/html/save.php
38行目 date_default_timezone_set('Asia/Tokyo');
$ sudo leafpad /usr/local/nginx/html/cron.php
8行目 date_default_timezone_set('Asia/Tokyo');

cronに登録(crontabの使い方は省略)

$ crontab -e

末尾に追加(最終行は改行のみの行を入れること)

*/10 * * * * php /usr/local/nginx/html/cron.php

liveスクリプト書き換え

$ sudo leafpad live

上書き

#!/bin/sh

# ARRAY #################################

IFS_BACKUP=$IFS
IFS=$'\n'
i=0
for L in `cat /usr/local/nginx/html/save.txt`
do
  i=`expr $i + 1`
  ARY=("${ARY[@]}" "$L")
done
IFS=$IFS_BACKUP

IFS=$'x'
i=0
for L in ${ARY[0]}
do
  i=`expr $i + 1`
  ARY2=("${ARY2[@]}" "$L")
done
IFS=$IFS_BACKUP

ARY3=()
unset ARY3[@]
ARY3=${ARY[3]}000

ARY4=()
unset ARY4[@]
ARY4=${ARY[11]}000

ARY5=()
unset ARY5[@]
if [ ${ARY[6]} = "stereo" ]; then
  ARY5="2"
else
  ARY5="1"
fi

# SETTING ###############################

# VIDEO

WIDTH=${ARY2[0]}
HEIGHT=${ARY2[1]}
FRAMERATE=${ARY[1]}
PROFILE="${ARY[2]}"
BITRATE=${ARY3[0]}
VFLIP=${ARY[4]}
HFLIP=${ARY[5]}
ROTATION=${ARY[6]}

EXPOSUREMODE=${ARY[12]}
EXPOSURECOMP=${ARY[13]}
WHITEBALANCE=${ARY[14]}
REDBALANCE=${ARY[15]}
BLUEBALANCE=${ARY[16]}
SHUTTERSPEED=${ARY[17]}
ISO=${ARY[18]}
METERING=${ARY[19]}
STABILIZATION=${ARY[20]}

TIMESTAMP=${ARY[21]}
KEYINTERVAL=${ARY[22]}
QUANTISATION=${ARY[25]}
BLOCKSIZE=${ARY[24]}
INTRATYPE=${ARY[23]}
SENSORMODE=0

BRIGHTNESS=${ARY[26]}
CONTRAST=${ARY[27]}
SATURATION=${ARY[28]}
SHARPNESS=${ARY[29]}
DYNAMICRANGE=${ARY[30]}
IMAGEEFFECT=${ARY[31]}

# AUDIO

VOLUME=${ARY[8]}
CHANNEL=${ARY5[0]}
ASAMPLE=${ARY[10]}
ABITRATE=${ARY4[0]}
FORMAT=S16LE

# EXECUTE ###############################

CMD="gst-launch-1.0 \
rpicamsrc preview=false blocksize=$BLOCKSIZE bitrate=$BITRATE do-timestamp=$TIMESTAMP keyframe-interval=$KEYINTERVAL intra-refresh-type=$INTRATYPE hflip=$HFLIP vflip=$VFLIP rotation=$ROTATION iso=$ISO brightness=$BRIGHTNESS contrast=$CONTRAST saturation=$SATURATION sharpness=$SHARPNESS exposure-mode=$EXPOSUREMODE exposure-compensation=$EXPOSURECOMP image-effect=$IMAGEEFFECT quantisation-parameter=$QUANTISATION shutter-speed=$SHUTTERSPEED sensor-mode=$SENSORMODE drc=$DYNAMICRANGE video-stabilisation=$STABILIZATION metering-mode=$METERING awb-mode=$WHITEBALANCE awb-gain-red=$REDBALANCE awb-gain-blue=$BLUEBALANCE ! \
queue ! \
video/x-h264, width=$WIDTH, height=$HEIGHT, framerate=$FRAMERATE/1, profile=$PROFILE ! \
h264parse ! \
flvmux name=mux streamable=true alsasrc device=hw:0 ! \
queue ! \
volume volume=$VOLUME ! \
audio/x-raw, format=$FORMAT, rate=$ASAMPLE, channels=$CHANNEL ! \
voaacenc bitrate=$ABITRATE ! \
queue ! \
mux. mux. ! \
rtmpsink location='rtmp://localhost/live/stream'"

$CMD

マイクなしの場合

# EXECUTE ###############################

CMD="gst-launch-1.0 \
rpicamsrc preview=false blocksize=$BLOCKSIZE bitrate=$BITRATE do-timestamp=$TIMESTAMP keyframe-interval=$KEYINTERVAL intra-refresh-type=$INTRATYPE hflip=$HFLIP vflip=$VFLIP rotation=$ROTATION iso=$ISO brightness=$BRIGHTNESS contrast=$CONTRAST saturation=$SATURATION sharpness=$SHARPNESS exposure-mode=$EXPOSUREMODE exposure-compensation=$EXPOSURECOMP image-effect=$IMAGEEFFECT quantisation-parameter=$QUANTISATION shutter-speed=$SHUTTERSPEED sensor-mode=$SENSORMODE drc=$DYNAMICRANGE video-stabilisation=$STABILIZATION metering-mode=$METERING awb-mode=$WHITEBALANCE awb-gain-red=$REDBALANCE awb-gain-blue=$BLUEBALANCE ! \
queue ! \
video/x-h264, width=$WIDTH, height=$HEIGHT, framerate=$FRAMERATE/1, profile=$PROFILE ! \
h264parse ! \
flvmux ! \
rtmpsink location='rtmp://localhost/live/stream'"

$CMD

liveスクリプト自動起動設定

$ sudo leafpad /etc/rc.local

末尾のexit 0手前に追記

sleep 20;bash /home/pi/live

phpからamixerとrebootができるように設定

$ sudo leafpad /etc/sudoers

末尾に追記

www-data ALL=(ALL) NOPASSWD: /usr/bin/amixer, NOPASSWD: /sbin/shutdown

再起動

$ sudo reboot

動作確認

http://livebot3.local

インターフェイスのメモ

  • 配信時の再起動は無駄と思います。アップデートの機会に見直します。
  • 1920x1080はクロップまたはズームされてると思われます。1296x730が正しい描画範囲と思います。原因調べてます。
    公式では部分FOVとフルFOVという名称で制限してるようです。3240x2464が最大で理屈はクロップのようです。
    厄介なことですが以下イメージ画像のような変則的な画角を理解して使うことになりそうです。

Sensor area 2.png
引用 Picamera

  • 640x480は2x2+スキップビニング、1296x972と1296x730は2x2ビニング、1920x1080以上は無し。となってます。「ビニングは複数のピクセルをまとめて1つのピクセルを生成すること。2x2ビニングは、4ピクセルを1つの大きなピクセルにし、全体のピクセル数を減らす。ビニングは、解像度と引き換えにノイズの影響を軽減する」だそうです。ビニングの影響で各解像度FOVエリアが変則になってしまってるように見えます。
  • roi-x、roi-y、roi-w、roi-hでクロップできるようです。アップデートの機会に見直します。
  • ダイナミックレンジはHDRの処理ではないようです。公式では「暗い領域の範囲を広げ、明るい領域を減少させることによって画像を変更します。 これにより、明るい場所では画像が改善されます。」とあります。
  • ロジクールC920同等の夜間高感度性能を試す場合、露出とISOを自動にしシャッタースピードを200000μs辺りに設定。理論値で5FPS程度となるのでC920同等の高感度性能を持ち合わせていないように見えます。
  • フォトンが電荷になる具合は、シャッタースピード>ISO>露出の順で、シャッタースピードは効果がよく見え、露出には大きい期待が持てないように見えます。
  • ShutterSpeed変更 ISO=auto Exposure=auto
  • ShutterSpeed変更 ISO=3200 Exposure=auto
  • 夜間の高感度を期待しシャッタースピードを設定すると日中は真っ白になります。シャッタースピード=0はオートで日中いい具合に働きます。昼夜の設定をスムーズに調整できる方法が見当たらず、日の出・日の入りのタイミングでシャッタースピードとISOを切り替える設定を追加しました。夜間は露光時間を稼ぎ見た目FPSを犠牲にします。
  • 情報収集してみるとnginx-rtmpとgstreamerを切り離し、nginx-rtmp単体で映像配信ハブ的な使い方されてる方がいらっしゃいました。nginx-rtmpは入力待機してくれるのですごく面白い使い方と思います。業務用の信頼性はないでしょうが、ライブスタジオに例えるならnginx-rtmpは配信機材、gstreamerは撮影機材。となると、スイッチャーは?調べるとありました。gstreamerの仕様上何でもありですがRTSP、RTMP辺りのネットワークカメラの入力対応してるものはCombiTech VidBlasterXNewTek TriCasterLivestream StudioTelestream Wirecast。ライブスタジオが超格安でできそうです。

参考

Raspberry Pi Camera Module

変更履歴

  • 2017.03.08 Pi Zero で動作確認しました
  • 2017.01.23 24時間配信対応に書き直しました
  • 2017.01.13 公開