以前の記事で、omxplayer の操作(一時停止、再生)をbashコマンドからできることが分かった。FIFO経由でコマンドを流し込んでやれば動く。
さらに前回記事では、RaspberryPi3を(HDMIで)繋いだテレビのリモコンで押したキー信号(上下左右、PAUSE等)を捕捉できることが分かった。
これを組み合わせれば、テレビリモコンで押したキー信号(上下左右、PAUSE等)を捕捉しその内容に応じてomxplayerを操作できるようになる。
<流れ>
① あらかじめRaspberryPiで FIFOを作って動画(gakki.mp4)のinputとして待機させる
$ mkfifo /tmp/cmd &
$ omxplayer gakki.mp4 < /tmp/cmd &
② リモコンを押すと
③ RaspberryPi3 がその信号を捕捉する
$ cec-client | grep --line-buffered -Po '(?<=key pressed: )\w+(?= \(\d, \d\)$)'
④ 捕捉したボタン信号をFIFO経由でomxplayerに送り込む。例えば
「left」なら
巻き戻しされる。
「right」なら
早送りになる。
今回はこの④の部分を作る。
このサイトにあるスクリプト「omxp-with-cec.sh」が最高だったので、そのまま使わせてもらう。
$ vim omxp-with-cec.sh
例えば
30行目 KEYS_LEFT=$'\e'[D で固定された値 '\e'[D が
41行目の関数onleft()における echo -ne $KEYS_LEFT > /tmp/cmd によって
FIFO(/tmp/cmd)に流し込まれている。
このFIFOから値 '\e'[D を受け取った omxplayerは、それを(キーボードからの打鍵と同じものと)解釈して、巻き戻しや早送りの動作をする(上記④)。
94行目ではリモコンからの信号を捕捉し(上記③)
98行目で、信号に応じてomxplayerに '\e'[D を送り込む関数を呼んでいる
一連の流れを通しで実行してみる。
$ rm /tmp/cmd
$ mkfifo /tmp/cmd
$ omxplayer gakki.mp4 < /tmp/cmd &
$ ./omxp-with-cec.sh
リモコンで見事に操作できた。本当に素晴らしい。
あとは①の手順(あらかじめFIFO作成して待機させる)が面倒くさいので、①から④までをコマンド一つでできるように alias に書いてしまう。
$ vim ~/.bashrc
(omxplayer gakki.mp4 < /tmp/cmd &) & とカッコ書きにしてバックグラウンド実行させているところがミソ。
cdPT3 や cdsh とあるのは、特定のフォルダにcdしてるだけの自作コマンド。
あらかじめタスクをkillしておかないと、複数あがって動きがおかしくなる。自作コマンド KILLALL もaliasしておく。
コピペ用
alias myomxp="KILLALL && \
echo ' \
mkfifo /tmp/cmd' && \
echo 'cdPT3 && omxplayer gakki.mp4 < /tmp/cmd(FIFOから入力)& (bg再生)' && \
echo 'cdsh && ./omxp-with-cec.sh(リモコンからのcecを受け取ってFIFOに流す)' && \
echo 'リモコン押してみて' && \
mkfifo /tmp/cmd; cdPT3 && (omxplayer gakki.mp4 < /tmp/cmd &) & cdsh && (./omxp-with-cec.sh &) & echo -ne p > /tmp/cmd"
#mkfifo /tmp/cmd; cdPT3 && (omxplayer gakki.mp4 < /tmp/cmd &) & echo -ne p
> /tmp/cmd & cdsh && ./omxp-with-cec.sh &"
alias KILLALL=' \
echo "KILLALLが呼ばれました" && \
echo "KILL前プロセス" && \
ps aux | grep -v grep | grep "omxplayer" && \
ps aux | grep -v grep | grep "mplayer" && \
ps aux | grep -v grep | grep "cec" ; \
for i in $(ps aux | grep -v grep | grep omxplayer | awk '\''{print $2}'\''); do echo "$i"; sudo kill -9 "$i"; done ; \
for i in $(ps aux | grep -v grep | grep mplayer | awk '\''{print $2}'\''); do echo "$i"; sudo kill -9 "$i"; done ; \
for i in $(ps aux | grep -v grep | grep cec-client | awk '\''{print $2}'\''); do echo "$i"; sudo kill -9 "$i"; done ; \
for i in $(ps aux | grep -v grep | grep omxp-with-cec.sh | awk '\''{print $2}'\''); do echo "$i"; sudo kill -9 "$i"; done; \
echo "KILL後プロセス" && \
ps aux | grep -v grep | grep "omxplayer" && \
ps aux | grep -v grep | grep "mplayer" && \
ps aux | grep -v grep | grep "cec"'
次回は FIFO に流す動画(上記①)を引数で取ってこれるように改造する。