min117の日記

初期desireもち。趣味Mac,メインFedora,仕事xp。

RaspberryPi3 テレビリモコンから omxplayer を操作する(mkfifo /tmp/cmd → omxp-with-cec.sh)

以前の記事で、omxplayer の操作(一時停止、再生)をbashコマンドからできることが分かった。FIFO経由でコマンドを流し込んでやれば動く。

min117.hatenablog.com

 

さらに前回記事では、RaspberryPi3を(HDMIで)繋いだテレビのリモコンで押したキー信号(上下左右、PAUSE等)を捕捉できることが分かった。

min117.hatenablog.com

 

これを組み合わせれば、テレビリモコンで押したキー信号(上下左右、PAUSE等)を捕捉しその内容に応じてomxplayerを操作できるようになる。

 

 

 

<流れ>

① あらかじめRaspberryPiで FIFOを作って動画(gakki.mp4)のinputとして待機させる

$ mkfifo /tmp/cmd &

$ omxplayer gakki.mp4 < /tmp/cmd &

f:id:min117:20180617102837p:plain

 

② リモコンを押すと

f:id:min117:20180616150535j:plain

 

③ RaspberryPi3 がその信号を捕捉する

$ cec-client | grep --line-buffered -Po '(?<=key pressed: )\w+(?= \(\d, \d\)$)'

f:id:min117:20180616151612p:plain

 

捕捉したボタン信号をFIFO経由でomxplayerに送り込む。例えば

「left」なら

f:id:min117:20180617101037p:plain

巻き戻しされる。

f:id:min117:20180617101351j:plain

「right」なら

f:id:min117:20180617101432p:plain

早送りになる。

f:id:min117:20180617101552j:plain

 

今回はこの④の部分を作る

このサイトにあるスクリプトomxp-with-cec.sh」が最高だったので、そのまま使わせてもらう。

takuya-1st.hatenablog.jp

 

$ vim omxp-with-cec.sh

f:id:min117:20180617102424p:plain

例えば

 30行目 KEYS_LEFT=$'\e'[D で固定された値 '\e'[D 

 41行目の関数onleft()における echo -ne $KEYS_LEFT > /tmp/cmd によって

FIFO(/tmp/cmd)に流し込まれている。

このFIFOから値 '\e'[D を受け取った omxplayerは、それを(キーボードからの打鍵と同じものと)解釈して、巻き戻しや早送りの動作をする(上記④)。

f:id:min117:20180617102654p:plain

94行目ではリモコンからの信号を捕捉し(上記③)

98行目で、信号に応じてomxplayerに '\e'[D を送り込む関数を呼んでいる

f:id:min117:20180617102702p:plain

 

一連の流れを通しで実行してみる。

$ rm /tmp/cmd

$ mkfifo /tmp/cmd

$ omxplayer gakki.mp4 < /tmp/cmd &

$ ./omxp-with-cec.sh

f:id:min117:20180617110625p:plain

リモコンで見事に操作できた。本当に素晴らしい。

f:id:min117:20180617104627j:plain

 

 

あとは①の手順(あらかじめFIFO作成して待機させる)が面倒くさいので、①から④までをコマンド一つでできるように alias に書いてしまう。 

 

$ vim ~/.bashrc

f:id:min117:20180617105037p:plain

(omxplayer gakki.mp4 < /tmp/cmd &) &  カッコ書きにしてバックグラウンド実行させているところがミソ。

cdPT3 や cdsh とあるのは、特定のフォルダにcdしてるだけの自作コマンド。

 

あらかじめタスクをkillしておかないと、複数あがって動きがおかしくなる。自作コマンド KILLALL もaliasしておく。

f:id:min117:20180617105043p:plain

 

コピペ用

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 に流す動画(上記①)を引数で取ってこれるように改造する。