🗂

XのないRaspberry piで動画再生

2023/06/01に公開

ffmpegという動画変換のcui (コマンドベース)ツールを使えば gui (X-server環境)がなくても動画の再生が簡単にできます。Linuxでは画面の表示にはframe bufferというメモリー領域が使われています。そのメモリー領域に直接画像データを書き込めば動画でもなんでも表示することができるわけです。ffmpegのoutputにframe bufferを指定してやれば簡単に動画が再生されます。ffmpegのコマンドの基本形は(詳しいffmpegのコマンドについてはffmpegのホームページを参照してください。)

ffmpeg (入力に関するオプション) -i (再生したい動画ファイル) (出力に関するオプション) (出力ファイル)

ですが、この出力ファイルに /dev/fb0 を指定して、
出力に関するオプションのところに -f fbdev を指定します。fbdevというのが、出力ファイルがframe bufferだという指定です。frame bufferには /dev/fb0 から /dev/fb1, /dev/fb2, ...とあるようですが、raspberry piにあるframe bufferにどのようなものがあるか調べるには

ls /dev/fb*

とすれば分かります。私が使っているraspberry pi3 では /dev/fb0 だけでした。

user@host:~ $ ls /dev/fb*
/dev/fb0

ですので、cui環境で動画を再生する基本のコマンドは

ffmpeg (入力に関するオプション) -i (再生したい動画ファイル) (出力に関するオプション) -f fbdev /dev/fb0

pixelのformatに関してはよく知りませんが、rgb565を使うのがいいですね。画面のサイズは fbset というコマンドで調べるようです。筆者の環境では次のようになりました。

$ fbset
mode "640x480"
    geometry 640 480 640 480 16
    timings 0 0 0 0 0 0 0
    accel true
    rgba 5/11,6/5,5/0,0/0
endmode

どうやら画面のサイズは 640x480のようです。
ですのでコマンドは

ffmpeg -i 再生したい動画ファイル -s 640x480 -pix_fmt rgb565 -f fbdev /dev/fb0

ですね。
ところが大きな問題があります。ffmpegというコマンドは(まぁそれに限らずたいていのコマンドはそうなのですが)、stdout(標準出力)かstderror(標準エラー出力)のどちらか(もしくは両方?)に現在の状況を常に出力します。なので、動画を再生しながら出力の文字を上書きしてしまうわけです。なので動画がほとんど見るに堪えません。まぁしかしraspberry piのuserはたいてい sshでリモートログインしてますよね。そうです。リモートでログインしてffmpeg を使えばいいわけです。
しかしながらまだちょっとした問題があります。画面の左下あたりがなにかちかちかします。これはターミナルのプロンプトの右側にあるカーソルが点滅しているためです。これを止めないとすこし違和感がありますね。止めるには次のコマンドをroot権限で実行します。

echo -e '\033[?17;0;0c' > /dev/tty1

root権限で上のコマンドを実行するには上のコマンドを任意のファイルに書き込みます。例えば、blink_off.sh というファイルに書き込んでおいて、

user@host:~ $ chmod +x blink_off.sh
user@host:~ $ sudo ./blink_off.sh

とします。
ところでffmpegを走らせているターミナルで blink_off.shを実行するのは不可能ですよね。ffmpegをバックグラウンドで流していればいいのですが、そうでなければ無理ですよね。そういう時に威力を発揮するのが screenです。(screenについては、https://linuxjm.osdn.jp/html/GNU_screen/man1/screen.1.html を参照してください。) screenはデフォルトではインストールされていないようなので aptでinstallします。

user@host:~ $ sudo apt update
user@host:~ $ sudo apt install screen

ここでscreenを実行します。

user@host:~ $ screen

とやると次のようになります。

GNU Screen version 4.08.00 (GNU) 05-Feb-20

Copyright (c) 2018-2020 Alexander Naumov, Amadeusz Slawinski
Copyright (c) 2015-2017 Juergen Weigert, Alexander Naumov, Amadeusz Slawinski
Copyright (c) 2010-2014 Juergen Weigert, Sadrul Habib Chowdhury
Copyright (c) 2008-2009 Juergen Weigert, Michael Schroeder, Micah Cowan, Sadrul Habib Chowdhury
Copyright (c) 1993-2007 Juergen Weigert, Michael Schroeder
Copyright (c) 1987 Oliver Laumann

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either version 3, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program (see the file COPYING); if
not, see https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA  02111-1301  USA.

Send bugreports, fixes, enhancements, t-shirts, money, beer & pizza to screen-devel@gnu.org


Capabilities:
+copy +remote-detach +power-detach +multi-attach +multi-user +font +color-256 +utf8 +rxvt +builtin-telnet



                                            [Press Space or Return to end]

ここでenterを押すと普通のターミナルの画面になります。このターミナルの画面でffmpegを実行します。すると ffmpeg がメッセージをターミナルに次々と出力してきますが構わず <ctr>-aを押して d (detachの意味) を押します。これでffmpegのセッションはバックグラウンドに移動し、ターミナルは自由に使えます。その状態で blink_off.sh を実行するわけです。ffmpegはバックグラウンドのscreenのセッションで流れているのでffmpegが終了してなくてもsshからログオフできます。

まとめ

raspberry piで x-serverを入れていない環境で動画を再生するには、

  • まずsshでraspberry piのマシンに入る
  • 次に screen を使い、screenのセッションで
ffmpeg -i 再生したい動画ファイル -s 640x480 -pix_fmt rgb565 -f fbdev /dev/fb0

を実行。

  • screen を <ctrl>-a d で抜ける。
  • そのあと root権限で次のコマンドが書かれたファイルを実行する。
echo -e '\033[?17;0;0c' > /dev/tty1

蛇足

何のためにraspberry piで動画を再生しているのかというと実は別のraspberry pi の usbにusbカメラをつなぎmotionを使って監視カメラを設置しているのですが、それを今まではweb browserで見ていたわけです。古い ipadを使っても vlc playerを使えば見ることができますが、raspberry piに 小型のhtmi monitorをつけてそれで監視カメラの映像を見たかったわけです。
usbカメラを搭載したraspberry pi の ip addressが 192.168.2.39 だったとするとそれをhtmi monitorを搭載したraspberry pi(hostaということにします) で見るには hostaにsshでloginして、

user@host:~ $ffmpeg -i http://192.168.2.39:8081 -s 640x480 -pix_fmt rgb565 -f fbdev /dev/fb0

とやればいいわけです。これでrasberry piを使った監視カメラシステムの出来上がりというわけです。

Discussion