🍆

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

2021/08/11に公開

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 で同じ操作をすると再生できるのに…
後でわかったが GPU 用のメモリが 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 にノイズが表示されて

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

Discussion