Rasbperry Piのomxplayerでのウィンドウ表示&複数表示

展示でRaspberry Piのでぅくトップを賑やかにしたいなと思い,livestreamerでストリーミングを表示したら良さそうと思ったのですが,Raspberry Piのomxplayerだと基本的に全画面です.
man(1)を見ると—​winというものを使うとウィンドウ表示が使えそう.

               --win ´x1 y1 x2 y2´     Set position of video window
               --win x1,y1,x2,y2       Set position of video window

現在の解像度を確認します.1366×768でした.

$ xdpyinfo | grep dimensions
  dimensions:    1366x768 pixels (361x203 millimeters)

livestreamer から omxplayer を呼び出すようにするとうまく行きました.
この例では右下1/4がlivestreamerで取得したストリーミング動画で埋まります.
直接描画されるのでX関係なくXの上に描画されます.

$ /usr/local/bin/livestreamer --player "omxplayer --win '684 387 1366 768'" --fifo http://www.ustream.tv/channel/iss-hdev-payload --default-stream best

以下のように同時に4枚表示とかも行けました.試してませんが9枚も行けるかも.

$ omxplayer --win '0 0 684 387' 2016-06-07.ts | \
omxplayer --win '683 0 1366 387' 2016-06-07.ts | \
omxplayer --win '0 386 684 768' 2016-06-07.ts | \
omxplayer --win '684 387 1366 768' 2016-06-07.ts


Rasbperry Piのomxplayerでのウィンドウ表示&複数表示

展示でRaspberry Piのでぅくトップを賑やかにしたいなと思い,livestreamerでストリーミングを表示したら良さそうと思ったのですが,Raspberry Piのomxplayerだと基本的に全画面です.
man(1)を見ると—​winというものを使うとウィンドウ表示が使えそう.

               --win ´x1 y1 x2 y2´     Set position of video window
               --win x1,y1,x2,y2       Set position of video window

現在の解像度を確認します.1366×768でした.

$ xdpyinfo | grep dimensions
  dimensions:    1366x768 pixels (361x203 millimeters)

livestreamer から omxplayer を呼び出すようにするとうまく行きました.
この例では右下1/4がlivestreamerで取得したストリーミング動画で埋まります.
直接描画されるのでX関係なくXの上に描画されます.

$ /usr/local/bin/livestreamer --player "omxplayer --win '684 387 1366 768'" --fifo http://www.ustream.tv/channel/iss-hdev-payload --default-stream best

以下のように同時に4枚表示とかも行けました.試してませんが9枚も行けるかも.

$ omxplayer --win '0 0 684 387' 2016-06-07.ts | \
omxplayer --win '683 0 1366 387' 2016-06-07.ts | \
omxplayer --win '0 386 684 768' 2016-06-07.ts | \
omxplayer --win '684 387 1366 768' 2016-06-07.ts

RaspbianでUVCデバイスが認識できなくて困る

昨日の話なのですが,Rasbianの入ったRaspberry PiでUVCのWebCam(logitech c270)が認識しなくて困りました.
接続してdmesgやlsusbには該当のvid/pidは出てきます.でも/dev/video?などは出てこず.
手動でomdule を読みこませようとするとこんなエラー.

$ sudo modprobe uvcvideo
modprobe: ERROR: ../libkmod/libkmod.c:557 kmod_search_moddep() could not open moddep file '/lib/modules/4.4.9-v7+/modules.dep.bin'

apt update && apt upgradeでkernel更新したけど再起動して反映していない&Raspbianでは古いmoduleはupgraed時に消されるということだったようです.
再起動して新しいKernelにして解決でした.
通常のDebian等では残ってるのでちょっと嵌まりましたorz

Raspbian jessieでもhiptextを試す

さっき

というのを書きましたが,なんとなくRaspberry Pi B+ の Raspbian jessie lite でも`hiptext`を試してみました.

$ sudo apt install build-essential libpng12-dev libjpeg-dev     libfreetype6-dev libgif-dev ragel libavformat-dev libavcodec-dev     libswscale-dev libgflags-dev libgoogle-glog-dev git
$ git clone https://github.com/jart/hiptext.git
$ cd hiptext
$ time make
   :
real    22m7.443s
user    21m53.190s
sys     0m8.910s

て感じでほぼREADMEのままmake一発でした.違ったのは導入パッケージに`git`が必要だったくらいです.
思いの外makeに時間が掛かりましたがRaspberry Pi B+で試しているので2Bや3Bだともっと速いでしょう.
Balls.pngやObama.jpgはうまく行き,さっきうまく行かなかったTux.pngは同じようにコケたので同じ動きのようです.

恐らく Debian jessie でも同様だと思います.

27293516472 deedbe97a4

Radikoを自動的に録音してPodcast化してくれるradicastを試す

Radikoを自動的に録音してPodcast化してくれるradicastというものを見つけました.

昔はこんな感じで録音したりしていましたが仕様が変わって録音できなくなって対応というのが面倒で最近は録音していませんでした.たまに聞くときはAndroidのRazikoを使っています.でもradicastならお手軽に動かせてPodcastとして扱えるので便利そうということで試してみました.

試した環境はUbuntu 14.04 amd64/Debian stretch testing amd64/Rasbian jessieですが,Ubuntu環境では録音開始時に以下のようにコアダンプしてしまうようでうまく行っていません :-(

2016/03/09 05:20:00 [radiko] start record
2016/03/09 05:20:00 [radiko] GET http://radiko.jp/player/swf/player_3.0.0.01.swf
2016/03/09 05:20:04 [radiko] POST https://radiko.jp/v2/api/auth1_fms
Segmentation fault (コアダンプ)

dockerでも動きますが,今回は実機で動かしています.

必要なpkgの導入

$ sudo apt install libav-tools swftools rtmpdump golang-go

※Debian stretchの場合はlibav-toolsの代わりにffmpegを導入.

go getで導入

$ GOPATH=~/usr/local/go go get github.com/soh335/radicast

オプションはこんな感じでした.

$ ~/usr/local/go/bin/radicast -h
Usage of /home/mk/usr/local/go/bin/radicast:
  -bitrate string
        bitrate (default "64k")
  -buffer int
        buffer for recording (default 60)
  -config string
        path of config.json (default "config.json")
  -converter string
        ffmpeg or avconv. If not set this option, radicast search its automatically.
  -host string
        host (default "0.0.0.0")
  -output string
        output (default "output")
  -port string
        port (default "3355")
  -setup
        initialize json configuration
  -title string
        title (default "radicast")

設定ファイル作成

--setupオプションでスケルトンを作成して,

$ ~/usr/local/go/bin/radicast --setup > ~/usr/local/go/etc/radicast.json
$ cat ~/usr/local/go/etc/radicast.json
{
  "HOUSOU-DAIGAKU": [],
  "MBC": [],
  "RN1": [],
  "RN2": []
}

次のページを参考にcron形式で設定します.crontabと違い秒単位まで指定できるようです.

例えば"0 0 7 * * MON-FRI" だと月曜から金曜の07:00:00の番組を録音となります.
録音停止は自動的にされるようです.

$ cat ~/usr/local/go/etc/radicast.json
{
  "HOUSOU-DAIGAKU": [],
  "MBC": [
    "0 0 5 * * MON-FRI",
    "0 10 5 * * MON-FRI",
    "0 0 7 * * MON-FRI"
  ],
  "RN1": [],
  "RN2": []
}

実行

設定ファイルを指定して実行します.

$ ~/usr/local/go/bin/radicast -config=$HOME/usr/local/go/etc/radicast.json
2016/03/09 05:00:12 [radicast] station:MBC spec:0 0 5 * * MON-FRI
2016/03/09 05:00:12 [radicast] station:MBC spec:0 10 5 * * MON-FRI
2016/03/09 05:00:12 [radicast] station:MBC spec:0 0 7 * * MON-FRI
2016/03/09 05:00:12 [radicast] start new cron
2016/03/09 05:00:12 [server] start 0.0.0.0:3355

指定時刻になると,番組情報を取得して録音が始まり,番組終了時に録音が終了して次のジョブまで待機します.

2016/03/09 06:30:00 [radiko] start record
2016/03/09 06:30:00 [radiko] GET http://radiko.jp/player/swf/player_3.0.0.01.swf
2016/03/09 06:30:04 [radiko] POST https://radiko.jp/v2/api/auth1_fms
2016/03/09 06:30:05 [radiko] POST https://radiko.jp/v2/api/auth2_fms
2016/03/09 06:30:06 [radiko] GET http://radiko.jp/v2/api/program/today?area_id=JP46
2016/03/09 06:30:07 [radiko] start recording モーニング・スマイル
2016/03/09 06:30:07 [radiko] rtmpdump command: /usr/bin/rtmpdump --live --quiet -r rtmpe://f-radiko.smartstream.ne.jp --playpath simul-stream.stream --app MBC/_definst_ -W http://radiko.jp/player/swf/player_3.0.0.01.swf -C S:"" -C S:"" -C S:"" -C S:J_Rb9kLWN2Cb5XlcGqQjfw --stop 1853 -o -
2016/03/09 06:30:07 [radiko] converter command: /usr/bin/ffmpeg -y -i - -vn -acodec libmp3lame -ar 44100 -ab 64k -ac 2 /tmp/radiko240330221/radiko_0.mp3

データは以下のようにoutput以下に保存されています.

$ find output -ls
  6724248      0 drwxr-xr-x   1 mk       mk             36  3月  9 05:55 output
  6724778      0 drwxr-xr-x   1 mk       mk             44  3月  9 05:55 output/20160309053000_MBC
  6724327  10168 -rw-r--r--   1 mk       mk       10409132  3月  9 05:55 output/20160309053000_MBC/podcast.mp3
  6724779      4 -rw-r--r--   1 mk       mk            650  3月  9 05:55 output/20160309053000_MBC/podcast.xml

録音中のテンポラリファイルは/tmp以下に作られます.

$ ls -lA /tmp/radiko077215706/
合計 5184
-rw-r--r-- 1 mk mk 5223512  3月  9 07:10 radiko_0.mp3

録音したデータはPodcastとして配信されます.このURLは規定値ではlocalhostからしかアクセスできません.このURLをPodcast Aggregatorに指定してあげると普通にPodcastとして扱えます :)

$ xmllint http://localhost:3355/rss
<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0">
    <channel>
        <title>radicast</title>
        <itunes:owner/>
        <itunes:image/>
        <itunes:category/>
        <item>
            <title>生島ヒロシのおはよう一直線 (2016-03-09 05:30:00 +0900 JST)</title>
            <itunes:author>生島ヒロシ</itunes:author>
            <itunes:summary> &lt;br /&gt;&lt;A href="http://www.mbc.co.jp/radio/" target="_blank"&gt;&lt;img src="http://www.mbc.co.jp/radio/radiko/bn/mbcradio_pr1410.png" alt="MBCradio" /&gt;&lt;/A&gt;&lt;br /&gt;&lt;br /&gt;twitterハッシュタグは「&lt;a href="http://twitter.com/#!/search/%23mbc1107"&gt;#mbc1107&lt;/a&gt;」</itunes:summary>
            <itunes:image/>
            <enclosure url="http://localhost:3355/podcast/20160309053000_MBC.mp3" length="10409132" type="audio/mpeg"/>
            <pubDate>Wed, 9 Mar 2016 05:55:45 +0900</pubDate>
        </item>
    </channel>
</rss>

Podcast Aggregatorとこのサーバが別の場合以下のように-hostオプションを指定してインターフェイスに割り当てたipを指定するとそのネットワークからアクセスできるようになります.

$ ~/usr/local/go/bin/radicast -config=$HOME/usr/local/go/etc/radicast.json -host 192.168.2.203
  :
2016/03/09 07:42:34 [server] start 192.168.2.203:3355

proxy

は使えない感じかな?

$ w3m -dump http://radiko.jp/area
document.write('<span class="JP46">KAGOSHIMA JAPAN</span>');
$ tsocks w3m -dump http://radiko.jp/area
document.write('<span class="JP13">TOKYO JAPAN</span>');
$ ALL_PROXY=socks5h://localhost:8080 ~/usr/local/go/bin/radicast -setup
2016/03/09 07:56:00 [radiko] GET http://radiko.jp/player/swf/player_3.0.0.01.swf
2016/03/09 07:56:01 [radiko] POST https://radiko.jp/v2/api/auth1_fms
2016/03/09 07:56:02 [radiko] POST https://radiko.jp/v2/api/auth2_fms
2016/03/09 07:56:02 [radiko] GET http://radiko.jp/v2/api/program/today?area_id=JP46
{
  "HOUSOU-DAIGAKU": [],
  "MBC": [],
  "RN1": [],
  "RN2": []
}
$ tsocks ~/usr/local/go/bin/radicast -setup
   :
  "MBC": [],
   :
$ tsocks ~/usr/local/go/bin/radicast -setup
   :
  "MBC": [],
   :
$ ALL_PROXY=http://localhost:8080 ~/usr/local/go/bin/radicast -setup
   :
  "MBC": [],
   :

ストリーミング配信補助ソフトのCastawesomeを試す

3/5はOpenDataDayでした.
去年までは鹿児島市で募ってMapCafeと称してOSMする集まりをしていたのですが人が集まらないので今年は家で地図を書こうかと.そしてそのデスクトップをストリーミングしてみようかなと.

ということデスクトップストリーミングの話です.

いつものようにffmpegでRTMP配信なのですが,今回はCastawesomeというGUIの皮を見つけたので試してみました.これを使うとオプションなどがGUIで入力するだけで埋まっていくので便利です.

導入はcloneした後makeするだけ.システムに導入したいならmake installも.(Raspberry Piでも動きました.)
ffmpeg or avconvとPython 3, GTK-3ライブラリなどが必要です.(make時に足りないものがある場合DEPENDSが参考になります)

$ git clone -b 0.16.0 https://github.com/TheSamsai/Castawesome.git
$ cd Castawesome
$ make

の後

$ ./castawesome.py

or

$ sudo make install

してスタートメニューから実行.

こんな画面が出てきてフォームを埋めていくだけでOKです.
配信先はTwitch/YouTube/Hitbox/Pocarto/Local/Customに対応.多分Customを使えばUstream.tvも行けますね.

20160305_22:03:24-21661

ただ,細かい設定は苦手だったりエラーチェックも甘く配信されないことも多いのでそういう場合にはターミナルから起動して配信(「録画」ボタン)した時の以下のようなログを利用してffmpegで配信するようにするのが良さそうです.

ffmpeg -f x11grab -show_region 0 -s 1366x768 -framerate " 8" -i :0.0+0,0 -f pulse -ac 1 -i  -vcodec h264 -s 798x449 -preset medium -acodec mp3 -ar 44100 -threads 4
-qscale 3 -b:a 128k -b:v 300k -minrate 300k -g 16 -pix_fmt yuv420p -f flv "rtmp://a.rtmp.youtube.com/live2/<_stream_key_>"

設定ファイルは~/.config/castawesome以下に保存されます.keyはYouTubeのものを設定しても.twitch_keyというファイルに保存されていました.

$ ls -A ~/.config/castawesome/
.twitch_key  config.txt

よし,これで配信準備出来たと思ったのですが体調悪くスクリーンセーバーを垂れ流しながら寝落ちしてしまっていましたorz

Raspberry Pi 4周年とRaspberry Pi 3の発売

祝4周年!
そして新しいRaspberry Pi 3 Bが発売になりました.

4年あっという間でしたね当初はなかなか入手出来ませんでしたが今は大分改善されて買いやすくなっていいですね.
そしてRaspberry Pi 3 BRaspberry Pi 3 B.(A+の基板で無線内蔵も出たら良さそう).新たにWi-Fi/Bluetoothが内蔵されました.CPUもARM64になったのでそっちを試してみたい場合も良さそうです.ケースは流用できそうですがLED位置が変更になってるので LEDが見えなくなる場合もありそう.無線があるってことで日本では技適が通ってなくて使えない……と良くなるのですが,未だ通ってないけど近日中に取れるみたいです!

しかし電源が2.5Aというのがかなりきつい気がします.家にある一番大きな電流を流せるmicroUSB B Cableでも2.4Aですから…….
私はとりあえず手持ちに5V 3AのACアダプタがあったのでこれをGPIO経由で流し込むようにしたら行けそうかなと思っています.通販サイトを見ると2.5A対応のACアダプタも併売されているのでそれを買ったほうが無難そうですね.

なお,技適は通る見込みだから英国などから次回に買おうという人向けに注意が.

ということで国外で買った電源は電力安全法の検査通ってないので電源は国内で買いましょう.PSEマークの付いたものを.

ところでUSB電源の規格ですが,多分こんな感じです.

USB 2.0
- 500mA
USB 3.0
- 900mA
USB Battery Charging 1.2
- 1.5A
USB Power Delivery Specification( http://www.usb.org/developers/powerdelivery/ )
- 12V/3A (36W)
- 12V/5A (60W)
- 20V/3A (60W)
- 20V/5A (100W)
※microUSBでは3A迄

Raspberry Pi 3 Bの5V 2.5Aは範囲外な感じがします.USB PDは3AまであるけどUSB Cの規格みたいですし.火を噴いたりしないかちょっと不安です.

OSの方ですが,Rasbian jessie/Ubuntu MATEが新しくなっているようです.(既存環境はupgradeするだけでok)そしてちょっと前からRasbian wheezyが居なくなっています(ftp siteにはアーカイブが残っていますけど).wheezyはjessieより軽いので初代を使うときとか用途によってはいいんですけどね.Raspberry Pi 3 Bでwheezyが動かせるかも気になります.
#そういえばRabianのサポートはどうなっているんだろう?Debianと同じならいいけどこの感じだともっと速くに打ち切られそうで怖い.

しかし久々に新製品を追いかける楽しみを味わいました.
あ,Raspberry Pi古いのが余っちゃったよって方はください.




rc-gui最新版のビルドメモ(20160226)

Rasbian jessieのGUIな設定ツールのrc-guiの言語ファイルの項目が増えているみたいなので試してみました.

Wi-FiのCountry Code辺りが増えてるみたいなんだけど画面上に見当たらないです.
対応デバイス繋がないと出ないのかな?

20160226_00:02:02-20553

訳はこんな感じ?

20160226_01:02:13-6226

とりあえずrc-guiはビルドに必要なパッケージ増えてたのでメモしておきます.
controlには未だ載ってないよう.

$ sudo apt-get build-dep rc-gui
$ git pull
$ ./configure --prefix=/opt/local
   :
configure: error: Package requirements ( gtk+-2.0 >= 2.18.0              libxml-2.0) were not met:
 
No package 'libxml-2.0' found
   :
$ sudo apt install libxml2-dev
$ ./configure --prefix=/opt/local
$ make
$ sudo make install

Raspberry Pi向けNetBSDオープンソースカンファレンス2016東京春版イメージを動かす

ということで恒例のOSC合わせNetBSDイメージを試してみます.このページを読むより観光ガイドを読んだほうがいいかもしれません.

イメージとチェックサムファイルの入手と確認

$ wget ftp://ftp.netbsd.org/pub/NetBSD/misc/jun/raspberry-pi/2016-02-27-earmv6hf/2016-02-27-netbsd-raspi-earmv6hf.img.gz ftp://ftp.netbsd.org/pub/NetBSD/misc/jun/raspberry-pi/2016-02-27-earmv6hf/MD5

チェックサムの確認.
MD5の中のファイル名が間違ってるぽいです.

$ md5sum -c MD5
md5sum: 2016-02-24-netbsd-raspi-earmv6hf.img.gz: そのようなファイルやディレクトリはありません
2016-02-24-netbsd-raspi-earmv6hf.img.gz: オープンまたは読み込みに失敗しました
md5sum: libfreetype.so.17.4.11: そのようなファイルやディレクトリはありません
libfreetype.so.17.4.11: オープンまたは読み込みに失敗しました
md5sum: 警告: 一覧にある 2 個のファイルが読み込めませんでした
$ cat MD5
MD5 (2016-02-24-netbsd-raspi-earmv6hf.img.gz) = 1a669c2637a8861b7d383adba1de41ca
MD5 (libfreetype.so.17.4.11) = 936a15d6416c9b99176956151b4ef4df
$ md5sum 2016-02-27-netbsd-raspi-earmv6hf.img.gz
1a669c2637a8861b7d383adba1de41ca  2016-02-27-netbsd-raspi-earmv6hf.img.gz

Twitterで報告したのですぐ治ると思います.
直ってます :)

念のため直ったファイルで再確認

$ wget -O - ftp://ftp.netbsd.org/pub/NetBSD/misc/jun/raspberry-pi/2016-02-27-earmv6hf/MD5 | md5sum -c
2016-02-27-netbsd-raspi-earmv6hf.img.gz: 完了
md5sum: libfreetype.so.17.4.11: そのようなファイルやディレクトリはありません
libfreetype.so.17.4.11: オープンまたは読み込みに失敗しました
md5sum: 警告: 一覧にある 1 個のファイルが読み込めませんでした

イメージの書き込み

SD Cardのパーティション情報をwipefsで削除してイメージを書き込みます.2GB以上の容量が必要です.初回起動時にパーティションのリサイズが走るのですが,あまり大きな容量のCardだとこの処理にとても時間がかかるので程々の容量で.

$ sudo wipefs /dev/sdb -a
/dev/sdb: 2 bytes were erased at offset 0x000001fe (dos): 55 aa
/dev/sdb: calling ioctl to re-read partition table: 成功です
$ zcat 2016-02-27-netbsd-raspi-earmv6hf.img.gz | pv | sudo dd of=/dev/sdb bs=4096
1.82GiB 0:01:42 [18.2MiB/s] [     <=>                                                                                                                                  ]
476672+0 レコード入力
476672+0 レコード出力
1952448512 バイト (2.0 GB) コピーされました、 124.862 秒、 15.6 MB/秒

起動

起動してちょっと設定

英語キーボードを使っているので/etc/wscons.conf

encoding jp

を以下のように変更

encoding us

/.xinitrcの以下の行を削除

setxkbmap -model jp106 jp

再起動して設定反映.そしてstartx……画面が崩れます.

PIZEROで試した時と同じなのでもしかしてモニタが悪い?でもうちには1枚しかHDMIモニタが無いので確認できてません.
Ctrl+Alt+F1で端末に戻れます.そこでCtrl+CでXを終了させられます.

てことで幾つかモードを試してみましたがやはりダメそう.

<追記>
HDMI-VGAアダプタ経由で別のVGAモニタに繋いだら綺麗に表示されました.やっぱりなんかモニタがおかしいのかも.ちなみに問題のモニタはOn-Lap 2501MでRasbianやChromecast,PCで特に問題無さそうなもの.
</追記>

とりあえずX転送で試します.

適当にユーザを登録して,
/etc/ssh/sshd_configでX転送を有効に

X11Forwarding yes

sshdを再起動

# /etc/rc.d/sshd restart

PCからssh -Xで接続してmikutterを起動します.ちなみに-Cオプションも付けるとRaspberry PiのCPUを50~60%食うのでやめたほうが良さそう.(-C無いと5~15%前後)

fossilも試してみます.

$ fossil init sample-repo
$ fossil server sample-repo -P 12345 &

PC側のブラウザでアクセス

Unnamed Fossil Project
 
Home
Login
Home Timeline Files Branches Tags Tickets Wiki
 
This is a stub home-page for the project. To fill in this page, first go to setup
/config and establish a "Project Name". Then create a wiki page with that name.
The content of that wiki page will be displayed in place of this message.
 
This page was generated in about 0.067s by Fossil version [62dcb00e68] 2015-11-02
17:35:44

今度はパッケージの導入を試してみます.
今回はgawkを導入.

# /usr/sbin/pkg_add gawk
$ gawk -V|head -1
GNU Awk 4.1.3, API: 1.1 (GNU MPFR 3.1.3, GNU MP 6.1.0)

awkasterを動かしてみます.

$ wget https://raw.githubusercontent.com/TheMozg/awk-raycaster/master/awkaster.awk
$ gawk -f ./awkaster.awk

普通に遊べます :)

動画再生ソフトのomxplayerとlivestreamerも入れてみます.

# /usr/sbin/pkg_add omxplayer
# /usr/sbin/pkg_add py27-pip
# pip2.7 install livestreamer

これを使って国際宇宙ステーションからの地球を見てみます.(Ustream.tv)

# livestreamer --player omxplayer --fifo --yes-run-as-root http://www.ustream.tv/channel/17074538 --default-stream best

nicovideo-dlを利用してニコニコ動画を視聴することも出来ます.

# python2.7 nicovideo-dl-0.0.20120212/nicovideo-dl -u 'ユーザ名' -p 'パスワード' -q -o omxpipe http://www.nicovideo.jp/watch/1452050246 &
# omxplayer -o hdmi omxpipe

-o hdmiが効かないような気がします.付けても内蔵の3.5mmから音が出る.
##id/passwordは~/.netrcに書けます(-n option)

そんなこんなで色々遊べます :)

自分で導入するのがめんどくさいという人は明日明後日に開催されるオープンソースカンファレンス2016 Tokyo/Springに行くと現物が触れると思います.ステッカーももらえるしRaspberry JAMもあります.是非参加しましょう.

雑なPadcastサーバを少しましにする

先日作ったPodcastサーバですがあれからずっと動かしていますが安定して動いているようです.雑さをましにするために少し修正しました.

プレイヤー部分はこんな感じで少し変わりました.

@reboot while true; do cvlc --ignore-config --extraintf=http --http-port=8081 --http-password='raspberry' ~/podcasts/todayspodcast.m3u --play-and-exit --norm-max-level=2.0 --sout='#transcode{acodec=mp3,ab=64,channels=1}:standard{access=http,mux=ts,dst=:8080}' ; done
40 * * * *      podracer ; cd ~/podcasts ; find . -mmin -1440 -type f -print0 | xargs -0n1 file | grep -i audio | cut -f1 -d: | xargs ls -1tr > ~/podcasts/todayspodcast.m3u
10 0 * * *  rm -rf ~/podcasts/`date --date '1 weeks ago' +\%F`
  • killせずに1周毎にVLCを呼ぶようにしてプレイリスト更新
  • Podcast取得を1時間に1度に変更
  • ボリュームのノーマライズ
  • ビットレートを64kにリアルタイムエンコーディング
  • プレイリストの作成も1時間に一度
  • プレイリストの順序を時間順にソート
  • プレイリストの内容はプレイリスト作成時から過去1日分(1440分)
  • 音泉の番組に対応(RSS化してpodracerに登録.簡単だけど公開すると怒られそうな気がする)

VLCのオプション

  • --ignore-config
    設定を読み込みません
  • --extraintf=http
    ウェブコントローラーを有効に
  • --http-port=8081
    ウェブコントローラーの待ち受けポートを8081番に
  • --http-password='raspberry'
    ウェブコントローラーの認証パスワードをraspberry
  • ~/podcasts/todayspodcast.m3u
    再生ファイル(プレイリストを指定)
  • --play-and-exit
    再生後終了する.これがないとプレイリストを再生後も起動しっぱなしになって次の周に入らない.(vlc://quitでも大丈夫だが,vlc://quitだとプレイリストにも表示される)
  • --norm-max-level=2.0
    ボリュームのノーマライズ.この値はもう少しいじったほうがいいかも?
  • --sout='#transcode{acodec=mp3,ab=64,channels=1}
    モノラル64kのmp3に変換している.Podcastを調べると殆どの番組が64kで一部40,96,128,160が混じっている.1日試したが32kでも大丈夫そう.
  • standard{access=http,mux=ts,dst=:8080}
    8080番ポートでHTTPライブストリーミング配信

VLCのオプションはmanにはあまり載ってなくて困っていたのですが,vlc -Hに大量のオプションが載っているのに気づいてからはかどりました.

$ vlc -h| tail -1
網羅的なヘルプを表示するためには、'-H'オプションを指定してください。
$ vlc -h | wc -l
372
$ vlc -H | wc -l
5674

その他細かいところで

  • 設置場所の変更
  • DNSに名前を登録して固定IPに(Androidでも名前でアクセス可能に)
  • 合わせてプレイリスト等のurlを名前に
  • hostnameの変更
  • sshd設定
  • iptable設定
  • OSの自動更新設定
  • watch dogの設定

といった辺りも設定しましたがこの辺は何時もの設定なので今回は省略.

と,こんな感じでだいたいやりたいことは出来たかなーという感じですが,VLCでなくMPD辺りで曲管理して再生,配信はまた別アプリでやったほうがいいような気もしてきました.VLCは1つで何でもできるしウェブコントローラーもあっていいのですが,MPDの方がリモート管理がしやすそうなので気が向いたらそっちも組むかもです.

今100円ショップのイヤホンを使って聞いているのでその部分が一番ストレスな感じです.