ラズパイでX Windowを動かさずにHTTPストリームを再生する

TL;DR;

以下のコマンドで可能だった。

`setterm -cursor off
ffmpeg -i http://stream-ip-or-hostname:80 -pix_fmt rgb565 -s 321:240 -f fbdev /dev/fb1
  • setterm -cursor off カーソルをOFFに。
  • ffmpeg: 標準でインストールされている。入っていなければaptで
  • -i http://〜 再生するストリームのURL
  • -pix_fmt 表示する液晶のピクセルフォーマット…わけわからないが、間違えていたらエラーメッセージ中にこれを指定しろ的なのがあるので追加しただけ。
  • -s 321:240 表示するサイズ。表示するデバイスの解像度より大きいと見切れるので指定。320x240が本来のスペックだが、右端に1pxの白いラインが出たので1px増やしてある
  • -f fbdev /dev/fb1 表示ドライバはfbdev。fbdev2 があって動くならそっちの方がよさげな動きをしていたが表示が乱れたのでfbdevを指定。 /dev/fb1 はフレームバッファのデバイス名。

自動起動周り

/etc/rc.local に上記コマンドを書けば終わり。と言いたいところだが、上手くいかなかったので、piユーザーで自動ログインにしておいて、 /home/pi/.bashrc の末尾に上記コマンドを記述することで期待する動作になった。

ここに書いてしまうと、sshで接続したときも実行されてしまうので、ttyだったら。

という判定をいれた方が良いが、そこはスルーした。

CUIログインとGUIログインの切り替え

raspi-config で可能。 System -> Boot/Login あたりで可能。

細かい蛇足

背景

この話は一つ前の続きである。

ラズパイに4DPi-32 を接続して、そこにストリーム動画(監視カメラ映像)を表示したかった。

監視カメラ映像はMotionEyeOSからのストリームである。

4DPi-32を接続したことにより /dev/fb1 が生えている。これがなんか不思議なブツで

HDMIにつないだモニタ or 4DPI-32のどちらかに出力されるという不思議。

HDMIが/dev/fb0で4DPiが/dev/fb1 というならわかるのだが。

(/dev/fb0に出力してもなんかおかしなノイズが出力されたり、HDMIに出力されたり…ほんとわからない)

フレームバッファって複数画面持てるのかなぁ。知識というか理解が足りてなかった。

正直、GUIというか映像とか動画を出すのだからXが必要だと思いこんでいた。

まだまだ知らないことばかりだなぁと思った。

上手く行かなかったこと

試したことを列挙しておく。(X11) はGUIでログインして動かしてみたものを指す。

ただし、VNCでリモート操作しているのでそれが失敗の原因の可能性もある。

VLC (X11)

X上でvlcを使った再生を最初に試した。そもそもラズパイZEROでXを動かす事自体が

割と無謀。しかも液晶は320x240なのでGUIがまともに操作できない。

また、VLCではストリームを再生することができなかった。不思議。

テストとしてmac上のVLCで同じ操作をすると再生できるのに…

後でわかったがPU用のメモリが64MB割当だとダメという書き込みがあったので128MBなら出来たかもしれない。

SMPlayer (X11)

apt install 可能。同じくストリームが再生できなかった。

cvlc(コンソール)

VLCをコンソールから動かすやつ。VLCと同じでストリームが再生できない。

このとき、MMAC ENOSPC 的なエラーがでたのでGPUメモリ割当が不足していることがわかった。

mplayer(コンソール)

割と有名な気がする。フレームバッファへの書き込みは出来てローカルのaviは再生できたが、

なぜかHDMI側に出力されてしまった。

omxplayer(コンソール)

HDMI側にしか出力できなそうだった。フレームバッファに書き込む機能がなさげ。

ラズパイ用Acceralatedプレイヤーらしいので一番期待していたのだが。

ffmpeg(コンソール)

最初に、 -f RawImage /dev/fd1 とかやったときに4DPi-32にノイズが表示されて

一気にやる気が上がったのを覚えている。えらい。