moOde audio 4.3 pulseaudio Server (Radiko)

通常moOde audioにはアンプとスピーカーが接続されていると思います。当サイトではmoOde audioをpulseaudio Serverとして運用しています。
ピュアなオーディオ再生を目的とする場合にはpulseaudioは不要と思いますが一般の音楽(音声)再生、また技術的な興味に於いてもこれらを利用するメリットはあると思います。

moOde audioのmpdとpulseaudioは同じデバイスを同時に使用することはできないのでpulseaudio使用時はmpdを停止する必要があります。(逆も同様)

クライアント側はraspberry pi + raspbianで動作を確認しています。今回はできるだけシンプルに構成、検討してみたいと思います。

ロケールの設定

最初にraspi-configからロケールの設定をしておきます。(ja_JP.UTF-8追加)

# raspi-config
4 Localisation Options - I1 Change Locale
[*] ja_JP.UTF-8 UTF-8

Pulse Audioの導入

moOde audioにpulseaudioをインストール

# apt install pulseaudio

user(pi)でpulseaudioスタート

$ pulseaudio --start

~/.config/pulseが作成されます。client.conf新規作成

~/.config/pulse/client.conf
autospawn = no
daemon-binary = /bin/true

カードを調べる。PulseAudio/サンプル 当サイトのカード(ES9023-DAC)は次のように出力

$ pacmd list-sources | grep -e 'index:' -e device.string -e 'name:'
  * index: 0
        name: <alsa_output.platform-soc_sound.analog-stereo.monitor>
        device.string = "0"

$ pacmd list-sinks | grep -e 'name:' -e 'index:'
  * index: 0
        name: <alsa_output.platform-soc_sound.analog-stereo>

/etc/pulse/default.pa 末尾に追記(ネットワーク帯は自環境で)

/etc/pulse/default.pa
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.0.0/24 auth-anonymous=1
set-default-source alsa_output.platform-soc_sound.analog-stereo.monitor
set-default-sink alsa_output.platform-soc_sound.analog-stereo

前回はユーザー(~/.config/pulse/default.pa)でpulse serverを設定していたのですがシステム(/etc/pulse/default.pa)に記述したほうが明らかに効率が良いようです。

pulseaudioコマンドはstartしたuserがkillすることができます。
unixコマンド($sudo killall pulseaudio)からは可能です。
rootでは基本(デフォルト)startすることができません。

クライアント(raspberry pi)の設定(raspbian desktop)

pavucontrolのインストール

# apt install pavucontrol

クライアント側にはサーバー(moode audio)のIPアドレスを指定

~/.config/pulse/client.conf
autospawn = no
daemon-binary = /bin/true
default-server = 192.168.0.111

再生する

クライアントのraspberry pi3はpavucontrolを起動しておきます。
pulseサーバー(moode audio)にログイン pulseaudioスタート

$ pulseaudio --kill
$ pulseaudio --start

デバイス(カード)が見えればOK
音量はpavucontrolで制御します。最初の音量に注意
pulseaudioはアクセスが無いと自動(約1分位か)でkillします。pavucontrolが起動していれば勝手にkillすることはありません。
GUIなアプリケーションはほとんどpulseaudioに対応していると思います。コマンドラインからはmplayer,mpvなどがOK

moode audioから再生する

radiko関連パッケージのインストール

# apt install mpv mplayer swftools libxml2-utils rtmpdump

moode audio自身からpulseaudio経由で再生するにはuserの~/.config/pulse/client.confに次の1行を追記します。

default-server = 127.0.0.1

但しこの設定を加えるとuser(pi)はpulseaudioをスタートできなくなります。

$ pulseaudio --start
N: [pulseaudio] main.c: ユーザーが設定したサーバー 127.0.0.1 は start/autospawn を拒否しています。

したがってrootからはpulseaudioをstartできないことからuser piでpulseaudioをスタート、rootに設定を加えて実行してみます。(コマンドラインでの実行はpulseaudioをstartしていないと音量100%で出力します。pi3からpavucontrolでモニタ、音量の確認が必要です)

実験には以前のとおりradikoスクリプト再生環境を構築してみます。
必要なパッケージをインストールradikoスクリプトを実行
radikoスクリプトの再生プレーヤーにmplayerを指定すると数分後にRTMP廻りでエラーが発生、停止してしまいます。

# ./radiko.sh -p FMT
--------
AO: [pulse] 48000Hz 2ch floatle (4 bytes per sample)
Video: no video
Starting playback...
292.083 kB / 47.96 sec (unknown) 18.2% 
Caught signal: 13, cleaning up, just a second...
ERROR: WriteN, RTMP send error 32 (42 bytes)
ERROR: RTMP_ReadPacket, failed to read RTMP packet header
316.538 kB / 51.92 sec
Download may be incomplete (downloaded about 0.00%), try resuming
A:  51.7 (51.7) of 0.0 (unknown) 18.2%

Exiting... (End of file)

これは以前より発生している現象で使っていると改善することもあります。Pi1B + moode audio特有の現象かもしれません。
いろいろ試してみるとmpvでは正常に再生することがわかりました。
欠点は再生開始までの時間がmplayerの8秒からmpvでは12秒ほどになります。(mplayerの8秒も長い)
安定して再生できればいいので以前のとおりmoode audio + pulseaudio + radiko(mpv)で環境を構築してみたいと思います。

#pulseaudioはデフォルト設定にネットワークとカード情報を設定しただけなので設定次第で挙動は違ってくると思います。

今回はできるだけシンプルにpulseaudioコントロール、radiko環境を構築してみたいと思います。

www-dataからpulseaudioをスタート

実用的にはユーザーwww-dataを利用してpulseaudioをコントロールするのが簡単そうです。

moode audioのwww-dataはデフォルトでsudoersに記載されています。(編集する際はvisudo)

www-data ALL=(ALL) NOPASSWD: ALL

www-dataにホームディレクトリを作成、ユーザーwww-dataでpulseaudio –start
~/.config/pulse/client.confを新規作成

# gpasswd -a www-data audio
ユーザ www-data をグループ audio に追加
# systemctl stop nginx php7.0-fpm
# mkdir /var/www-data
# usermod -s /bin/bash www-data -d /var/www-data
# cd /var
# chown www-data:www-data www-data
# su www-data
$ pulseaudio --start
$ cd ~/.config/pulse
/var/www-data/.config/pulse/client.conf
autospawn = no
daemon-binary = /bin/true
$ exit
# systemctl start nginx php7.0-fpm

# ユーザ www-dataからpulseaudioをスタートできますが同時に再生もwww-dataとして実行できます。pulseaudioの仕様なのかはわかっていません。

pulseaudioコントロール(radiko)

moode4.3では/var/wwwのsquashfsはoptionalとなっているためmoodeのwebサーバー(nginx)を利用します。
skyblue.cssの導入
SkyBlue CSS Frameworkをダウンロード、展開したskyblue-gh-pagesをhtmlにディレクトリ名変更

# cd /var/www
# wget https://github.com/Stanko/skyblue/archive/gh-pages.zip
# unzip gh-pages.zip
# mv skyblue-gh-pages html

/var/www/htmlにメインのphpファイルを置きます。(radiko_s.php)

# mkdir /var/www/html/bin
# cd /var/www/html/bin
# touch broad.txt
# chown www-data:www-data broad.txt
# chmod 755 killall.sh
# chmod 755 moode.sh
# chmod 755 radiko.sh

/var/www/html/binに必要なスクリプトを置きました。(再生プレーヤーは使う可能性のあるものを書き込んでおきます)
/var/www/html/bin/killall.sh

#!/bin/sh
sudo killall -q mplayer
sudo killall -q mpv
sudo killall -q ffplay
mpc stop > /dev/null 2>&1

/var/www/html/bin/moode.sh

#!/bin/sh
sudo killall -q mplayer
sudo killall -q mpv
sudo killall -q ffplay
sudo killall -q pulseaudio

/var/www/html/bin

-rw-r--r-- 1 www-data www-data   17 10月 18 20:26 broad.txt
-rwxr-xr-x 1 root     root      103 10月 18 19:06 killall.sh
-rwxr-xr-x 1 root     root      104 10月 18 19:08 moode.sh
-rwxr-xr-x 1 root     root     7700 10月  9 22:46 radiko.sh

ブラウザから実行 http://moode/html/radiko_s.php

phpファイルは以前作成したものを手直ししています。
ボリューム値の取得についてはこちら
radiko_s.phpファイル
radiko.shスクリプトは頂戴したものを直しながら使用(radikoは聴取エリアがあります)
個別設定
30行目 デフォルト音量
61行目 mute
231行目 volume Limit


起動時の画面
当サイトでは以前ビルドしたsurf2ブラウザを340×100サイズで起動しています。
moodeボタン mpd再生開始(pulseaudio –kill)


STOPボタンまたは中央の音量表示ボタンクリックでpulseaudioスタート(mpd停止)
pulseaudioスタート後中央のボタンは音量デフォルト設定ボタンとして機能


選局はスクロールまたはウインドウを引き伸ばしてクリック
pulseaudioスタートしていない状態からもOK
mボタン mute

mpd〜pulseaudioは1クリックで切り替えが可能です。但しラジオの再生開始は10数秒を要します。(pi1B)
音量は基本出力装置タブ側に反映されます。再生タブ(入力)も適当に変化します。
pavucontrolで変更した値(出力装置タブ)はタイトル左の文字(moOde)をクリック(画面リロード)することで反映します。

サーバー自身(moode audio)からの再生(radiko)は必ずpulseaudioがスタートしている必要があります。
初期設定時はpavucontrolでモニタ、適切なデバイス及び音量を確認テスト後アンプのスイッチを入れるようにします。


moodeからradiko再生、クライアントからmp4再生、オーディオプレーヤー再生の出力はpulseaudioでミキシングして再生されます。(通常の音楽、映像再生用途ではこんな使い方はあまりしないと思いますが)
moode player以外にも音楽(音声)の中枢として活躍しています。

moOde audio 4.3 Radioを登録する

mpdはhttpストリーミングも対応しています。

Moodeフォーラムに’Moodeにロゴ付きラジオ局を追加する’こんな投稿があります。

現在のNHKラジオはhttpsで配信しています。


$ mpd -V すると対応するフォーマットなど情報を表示します。
Protocolsの項をみるとhttps://ありますね。
moOde audioのmpdは独自のビルドなのでmmsはコンパイルオプションに入ってないようです。


以前より再生可能なことはわかっていたのですがフォーラムにあるとおりデータベースに登録しない限り再起動やplaylistに登録、読み込みをするとこんな表示になってしまいます。

plsファイルの作成

以降moodeにログインしたらroot権限で編集が必要です。
放送局は地域によって適切なURLを記載します。
らじるらじる m3u8 を ffmpeg で録音する(8放送局)2017/9 以降対応

$ ssh moode
$ sudo su
# cd /var/lib/mpd/music/RADIO
# cp Jazz24.pls "NHK FM.pls"

変更箇所はURLとTitle1
ファイル名とTitle1=NHK FMは一致したほうが間違いが無いと思います。

"/var/lib/mpd/music/RADIO/NHK FM.pls"
[playlist]
numberofentries=1
File1=https://nhkradiohkfm-i.akamaihd.net/hls/live/512076/1-fm/1-fm-01.m3u8
Title1=NHK FM
Length1=-1
version=2


完了したらRADIOのデバイスアイコンをクリックして、”Update this folder”をクリック
RADIOのリストには載っているはずです。ここからplayすれば聴取可能です。

画像ファイルを用意

画像ファイル名も正確に一致する必要があります。

$ mv NHK-FM.jpg "NHK FM.jpg"

画像は適当に転送、sshで送ってみます。

$ scp NHK* moode:/tmp
pi@moode's password
NHK FM.jpg                                    100%   16KB 872.3KB/s   00:00    
NHK R1.jpg                                    100%   16KB 862.8KB/s   00:00    
NHK R2.jpg                                    100%   15KB 947.4KB/s   00:00

moodeにログイン

# cp /tmp/NHK* /var/www/images/radio-logos
# cd /var/www/images/radio-logos
# chmod 777 NHK*
# ls
# cp NHK* ./thumbs

ロゴ画像はwebから拾って300×300で適当に作成

データベース登録


フォーラムの手順どおり実行していくとradioの登録idは185まであります。
186から入力していきます。
id,’station url’,’station name’を入力
‘station url’,’station name’は作成したplsに合わせて
データベースはバックアップを取って自己責任で!

# cd /var/local/www/db
# cp moode-sqlite3.db moode-sqlite3.db.bak
# sqlite3 moode-sqlite3.db
SQLite version 3.16.2 2017-01-06 16:32:41
Enter ".help" for usage hints.
sqlite> .headers on
sqlite> select * from cfg_radio;
----
185|http://lb.zenfm.be/zenfm.mp3|Zen FM||local
sqlite>
sqlite> insert into cfg_radio VALUES(186,'https://nhkradiohkfm-i.akamaihd.net/hls/live/512076/1-fm/1-fm-01.m3u8','NHK FM','if exists:permalink otherwise:empty','local');
sqlite> insert into cfg_radio VALUES(187,'https://nhkradiohkr1-i.akamaihd.net/hls/live/512075/1-r1/1-r1-01.m3u8','NHK R1','if exists:permalink otherwise:empty','local');
sqlite> insert into cfg_radio VALUES(188,'https://nhkradioakr2-i.akamaihd.net/hls/live/511929/1-r2/1-r2-01.m3u8','NHK R2','if exists:permalink otherwise:empty','local');
sqlite> .exit


再度確認 登録されていますね。

ここでリブート


サムネイルは/var/www/images/radio-logos/thumbsの画像が使われます。
パーミッションを777にしておけばmoode側で作ってくれると思いますが一応前の段階でコピーしています。
画像関連はブラウザのキャッシュが効いているのでクリア、再読込が必要です。


ちょっとロゴが派手な感じもしますがこんなもんでしょう。
(かっこいいロゴは作れない)
画像はファイル名を合わせれば変更可能です。
Streaming sourceとしか表示しませんが配信元の仕様と思います。

playlistからステーション名がいつも表示してくれればやっと常用する気になります。

moOde audio 4.3 インストール

ちょっとmoOde audioのページを覗いたらmoOde audio 4.3がリリースされています。

早速ダウンロードしてみると ん! かなり大きいですね。

展開してみると今回はバイナリイメージで配布されています。

最初はchromium-browserからダウンロードしたらなぜか失敗していました。ダウンロードボタンを右クリックしてURLを取得、wgetでダウンロード。無事落とせました。

$ wget https://github.com/moode-player/moode/releases/download/r43prod/moode-r43.zip
$ md5sum moode-r43.zip
5a3f3bf85fd191372625e0101763b818  moode-r43.zip
$ unzip moode-r43.zip
Archive:  moode-r43.zip
  inflating: moode-r43.img

作業はいつもの通りRaspberry pi 3

$ lsblk
カードは8GB /dev/sdaで認識しています。

# dd if=moode-r43.img of=/dev/sda bs=1M


古いカードなので書き込み速度が遅い


3GBのイメージに約2GB使われているのでほぼフルイメージで作成されていると思います。
bootにはsshの空ファイルを作成しておきます。
wifi接続の際はこの時点で/etc/wpa_supplicant/wpa_supplicant.confに接続情報を書き込んでおくといいかもしれません。あとはdhcpで取得してくれます。(要root)


sshは pi moodeaudio


最初の画面はこんな感じ


中央上部にまたひとつタブが増えています。


ブラウザはキャッシュのクリアが必要です。
時間と音量の枠は色の指定をするとすぐ変わるのですが文字がなかなか変わりません。
やはりキャッシュのクリアが必要でした。

当サイトではPi1Bにmoode audioを搭載しています。
必要最低限の設定箇所以外はほとんどデフォルトで運用してしています。
ロースペックなPi1Bでもなんら問題なく頑張っています。

派手さはありませんが変わらぬ基本スタイルと着実なグレードアップ、やはりmoode audioは最高ですね。今回の配布形式で一段と導入に対する敷居が下がってファンも増えるものと思います。

Raspberry Pi ZERO(W) Raspbian stretch lite Docker

Raspberry Pi ZERO(W) on Alpine Linux(3.8.1)ではdockerの動作に不具合がみられました。

今回は本家Raspbian stretch liteの環境でdockerを試してみたいと思います。

テスト環境

ZERO(W)ではeth0が無いとdockerはうまく走ってくれないのでAlpine Linuxで試したときと同様に以前試したジャンクなエレコム LD-USB/Tをぶら下げます。LANケーブルなしwifi接続です。
10Mタイプと遅いのですがwifi接続も相応に遅くなる感じがします。
ssh接続でのコマンド操作には特に問題がないのでOK

stretch liteインストール

インストールは8GBのカードで2018-06-27-raspbian-stretch-lite.imgをddしています。
通常通りddしたあとパーテーションエディタ(gparted)で未使用の領域に新たにパーテーションを切ります。
ホスト側には最低限の使いやすいツールとdocker関連をインストール

画像は今回の全てのインストールが終了の状態
Alpine Linuxのときと同様にmmcblk0p3をdockerに割り当てています
マウントはインストール後動作確認してから
パーテーションを切り直した時はPTUUIDが変わるので注意

raspbianコンテナ

今回もnginx + phpを作成してみます。
nginxはaptからパッケージをインストールしてみました。

$ docker pull schachr/raspbian-stretch
$ docker container run --privileged -d -p 80:80 --name nginx_raspbian schachr/raspbian-stretch /bin/systemd
$ docker container exec -it nginx_raspbian /bin/bash
コンテナに入って
# apt update
# apt install -y vim less nginx php7.0-fpm
# nginx -v
nginx version: nginx/1.10.3

nginx,php7.0-fpm設定

/etc/nginx/sites-available/default
    # Add index.php to the list if you are using PHP
    index index.php index.html index.htm index.nginx-debian.html;

    # pass PHP scripts to FastCGI server
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
    }
/var/www/html/phpinfo.php
<?php
phpinfo();
?>
# systemctl enable nginx
# systemctl enable php7.0-fpm
# systemctl start nginx
# systemctl start php7.0-fpm

alpineコンテナ

alpineコンテナの作成は前回と全く同じです。

$ docker pull alpine
$ docker container run --privileged -d -p80:80 --name nginx_alpine alpine /sbin/init
$ docker container exec -it nginx_alpine /bin/sh
コンテナに入って
# apk update
# apk add openrc bash nginx php7-fpm


各設定ファイル編集
コンテナスタート時デーモン起動
コンテナをリスタート

commitしてイメージサイス確認

raspbianコンテナのnginxはパッケージから導入したので若干サイズが違いますがalpineコンテナは全く同じになっています。
流石にホストOSとしてのraspbianは伊達にイメージサイズが大きい訳ではありませんね。テストの範囲ではどちらも問題なく動作します。

Raspberry Piシリーズで走るdockerのホストOS(raspbian,alpine)、コンテナの傾向が大体わかってきました。alpineもまだライブラリが不足している部分があるのでraspbianコンテナが正常に停止してくれるといいのですがいずれ改善されていくものと思います。

# tips
/etc/motdのアスキー文字はText to ASCII Art Generator (TAAG) – patorjk.comで簡単に作成してくれます。
たまにログイン先を間違えて編集しようとします。
味気ないログイン画面が少しだけハッピー!

Raspberry Pi 2 Alpine Linux(3.8.1) - TEST

学習用に構築したRaspberry Pi 2 on Alpine Linux(3.8.1) + dockerで簡単なテストをしてみたいと思います。

Alpineの公式イメージにnginx + phpをインストールして動作を確認してみます。

コンテナの作成

Alpineの公式イメージ

# docker pull alpine


ちょっと確認してみるとrcコマンドが入ってないようです。
イメージサイズも4.01MBとあって初期インストールパッケージも少ないですね。

新たにnginxコンテナ作成

# docker container run --privileged -d -p80:80 --name nginx_alpine alpine /sbin/init
# docker container exec -it nginx_alpine /bin/sh

コンテナに入ってbashをインストール後はdocker cpで.bashrcをコピー /bin/bashで入り直しています。

# apk update
# apk add openrc bash

nginxインストール

# apk add nginx
# nginx -v
nginx version: nginx/1.14.0
# rc-update add nginx
# rc-service nginx start

rc-service nginx startを実行するとネットワーク関連でエラーが出てしまいます。
dockerコンテナ内ではinterfaces設定が必要ないので/etc/init.d/nginxのネット項目をコメントアウトします。

/etc/init.d/nginx
#depend() {
#   need net
#   use dns logger netmount
#}


一旦exitしてコンテナを再スタート
# docker container restart nginx_alpine
無事動き出しました。

php7インストール

# apk add php7-fpm

nginx同様/etc/init.d/php-fpm7もネットをコメントアウト

/etc/init.d/php-fpm7
#depend() {                                              
#       need net                                         
#       use apache2 lighttpd nginx                       
#}

/etc/php7/php-fpm.d/www.confの編集

/etc/php7/php-fpm.d/www.conf
user = nginx
group = nginx

listen.owner = nginx
listen.group = nginx
# rc-update add php-fpm7
# rc-service php-fpm7 start


php-fpm7も無事動きました。

nginx default.conf設定
apkでインストールされるnginxにはhtml関連ファイルは一切入ってないので頑張って編集するかコピーしなければいけません。ファイルの置き場所は/usr/share/nginx/htmlです。
phpは以下の設定で動きました。

/etc/nginx/conf.d/default.conf
server {
    listen       80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.php index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        root   /usr/share/nginx/html;
        fastcgi_index  index.php;
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
        include        fastcgi_params;
    }
}
# rc-service nginx restart
# rc-service php-fpm7 restart

raspbianコンテナを作成

Alpine Linuxからraspbianベースイメージを使ってコンテナを作成してみました。
作成方法は前回の記事と一緒です。スタートすると問題なく動くのですが再スタートすると以下のようなエラーが出てしまいます。Webるとこの手のエラーはいろいろ報告されていますがdiskless Alpineでの有効な対策はいまのところ見つかっていません。回復するにはOSのリブートをする必要があります。

# docker container start nginx_alpine
Error response from daemon: cgroups: cannot find cgroup mount destination: unknown
Error: failed to start containers: nginx_alpine


今回作成したコンテナをcommitしてみました。比較するとAlpineベースは圧倒的に小さいですね。小さいコンテナを積み上げていくという概念がよくわかると思います。

dockerの基本的な使い方は目的にあった信頼できるイメージがあればコンテナ外から設定ファイルを付け加えていくという方法のようです。いずれそんな使い方ができるかもしれません。(?)

Top