2013年09月26日

RPi - Raspberry Pi で Google TV (スマートテレビ)!?を楽しむ方法

少し前に話題になった Google TV ってまだ覚えていらっしゃるでしょうか? Google TV は Android OS と Google Chrome ( Web ブラウザ)を組み合わせたスマートテレビのプラットフォームですが、今日は RaspberryPiTV というプロダクトを使って Raspberry Pi を Google TV ライクな端末に変えてしまう方法をご紹介します。

Google TV with Raspberry Pi
 

RaspberryPiTV のインストールと設定


RaspberryPiTV は Node.js ( V8 JavaScript Engine によるサーバーサイド JavaScript 実行環境 )を使った Web アプリケーションで、これに Chromium ウェブ・ブラウザを組み合わせることで Google TV のようなユーザ・インターフェースを使いながら YouTube 上の動画を再生することが出来るようになります。

GitHub - RaspberryPiTV


Raspberry Pi には Raspbian をインストール、最低限の設定をしておいて下さいね。

RPi - Raspberry Pi ファースト・インプレッション + 押さえておきたい初期設定


準備が出来たら端末から RaspberryPiTV で利用するアプリケーションをインストール。

$ sudo apt-get install chromium-browser
$ sudo apt-get install ttf-mscorefonts-installer
$ sudo apt-get install youtube-dl 


続いて Node.js ARM バイナリ版をダウンロード、/opt 配下に展開します。 

pi@raspberrypi ~ $ wget http://nodejs.org/dist/v0.11.6/node-v0.11.6-linux-arm-pi.tar.gz
pi@raspberrypi ~ $ tar xvzf node-v0.11.6-linux-arm-pi.tar.gz
pi@raspberrypi ~ $ sudo mv node-v0.11.6-linux-arm-pi /opt/node


node 関係のコマンドへパスを通しておきましょうか。 .bashrc をエディタで開いて、

pi@raspberrypi ~ $ vi ~/.bashrc


用意した node へのパス設定を追記します。

# for node.js
NODES_JS_HOME="/opt/node"
PATH="$NODES_JS_HOME/bin:$PATH"
export PATH


.bashrc を再ロードして node コマンドが利用できればOK。

pi@raspberrypi ~ $ source ~/.bashrc 
pi@raspberrypi ~ $ node -v
v0.11.6


この他にも npm ( Node Package Manager )を使ってアプリケーションが参照するモジュール、フレームワークをインストールしておきます。
(この後ダウンロードする RaspberryPiTV に含まれる package.json で npm install することも可能)

pi@raspberrypi ~ $ npm install express
pi@raspberrypi ~ $ npm install socket.io
pi@raspberrypi ~ $ npm install omxcontrol


さあ、これで環境周りの準備はおしまい。 GitHub から RaspberryPiTV をダウンロードしましょう。

pi@raspberrypi ~ $ git clone git://github.com/DonaldDerek/RaspberryPiTV.git
Cloning into 'RaspberryPiTV'...
remote: Counting objects: 183, done.
remote: Compressing objects: 100% (92/92), done.
remote: Total 183 (delta 95), reused 167 (delta 88)
Receiving objects: 100% (183/183), 546.17 KiB | 255 KiB/s, done.
Resolving deltas: 100% (95/95), done.


RaspberryPiTV というディレクトリが作られているはずなのでこの中に移動。

pi@raspberrypi ~ $ ls
Desktop  RaspberryPiTV

pi@raspberrypi ~ $ cd RaspberryPiTV/


最後に設定を2つ。 まず index.html をエディタで開き、

pi@raspberrypi ~/RaspberryPiTV $ vi public/index.html


io.connect の引数に設定されている URL のアドレス部分を貴方の Raspberry Pi に設定されている IP アドレスに変更します。

  - - - snip - - -
  var socket = io.connect('http://192.168.0.102:8080');
  //var socket = io.connect('http://raspberrypi.local:8080');
  socket.on('connect', function(data){
    socket.emit('screen');
    - - - snip - - -


同じく remote.html もエディタで開いて、

pi@raspberrypi ~/RaspberryPiTV $ vi public/remote.html


URL 部分の IP アドレスを変更(こちらは複数あり)。

  - - - snip - - -
  var socket = io.connect('http://192.168.0.102:8080');
  //var socket = io.connect('http://raspberrypi.local:8080/');
  socket.on('connect', function(data){
    socket.emit('remote');
    
  - - - snip - - -
  $.get('http://192.168.0.102:8080/omx/quit',function(data){
  
  - - - snip - - -
  $.get('http://192.168.0.102:8080/omx/pause',function(data){


これで準備はおしまい。 次のコマンドでアプリケーションを起動してみましょう。

pi@raspberrypi ~/RaspberryPiTV $ node app.js 
   info  - socket.io started
Express server listening on port 8080


エラー・メッセージが無ければ起動は成功ですよ。


RaspberryPiTV を使って YouTube ビデオをテレビで楽しむ


まず、 Raspberry Pi とテレビを HDMI ケーブルで接続しておきましょうね。

Raspberry Pi - connect HDMI


僕は普段デスクトップ環境を使っていないので次のコマンドで X セッションを開始。

pi@raspberrypi ~ $ startx


これでテレビにデスクトップ環境が表示されるはずです。

Raspberry Pi - startx


この状態でシェルの環境変数にディスプレイ番号を設定してから、

pi@raspberrypi ~ $ export DISPLAY=:0.0
pi@raspberrypi ~ $ echo $DISPLAY
:0.0


Chromium ブラウザを全画面モード( --kiosk )で起動、先程用意しておいた Web アプリケーションにアクセスしてみましょう。

pi@raspberrypi ~ $ chromium --kiosk http://raspberrypi:8080
[1:1:1338974511:ERROR:nss_util.cc(692)] Failed to load NSS libraries.
[4:4:1341834323:ERROR:nss_util.cc(452)] Error initializing NSS without a persistent database: 
  libsoftokn3.so: cannot open shared object file: Permission denied
[2941:2941:1345684333:ERROR:gl_surface_glx.cc(57)] glxQueryVersion failed
[2941:2941:1345711629:ERROR:gl_surface_linux.cc(58)] GLSurfaceGLX::InitializeOneOff failed.

少しだけエラーが出力されるかもしれませんが起動すれば問題無し。

RaspberryPiTV - home screen


なるほど、 Google TV ライクな UI ですね(ラジオ、ゲームのアイコンもありますがこちらはデザインのみ)。

動画の再生はこう。 スマートフォンから http://[Raspberry Pi アドレス]:8080/remote へアクセスしてキーワードを入力・検索。

RaspberryPiTV - start remote client


すると YouTube 上の動画がリストされるので好みのコンテンツで Watch ボタンをタップ。

RaspberryPiTV - remote client


暫く待つと Raspberry Pi 側で動画のキャッシュが始まり、すべてダウンロードしてから再生が始まります。

RaspberryPiTV - play movie


タイムシフトは出来ませんが、一時停止は http://[Raspberry Pi アドレス]:8080/omx/pause 、再生終了は http://[Raspberry Pi アドレス]:8080/omx/quit へアクセスすればコントロール可能。


自動起動するなら簡単なシェル・スクリプトを用意して、

#!/bin/sh

# env
. /etc/profile

# start X session
sudo -u pi startx > /dev/null 2>&1 &

# start node.js web server
cd /home/pi/RaspberryPiTV
sudo -u pi  /opt/node/bin/node app.js > /dev/null 2>&1 &

# wait for node.js service
sleep 3

# start chromium browser
export DISPLAY=:0.0
sudo -u pi chromium --kiosk http://raspberrypi:8080 > /dev/null 2>&1 &


/etc/rc.local スクリプトあたりから呼び出すのが簡単かもしれませんね。

紹介した方法で RaspberryPiTV を自動起動させているのがこの動画。



Chromium ブラウザの起動とページの初期化に時間が掛かりますがギリギリ許せる範囲。

RaspberryPiTV はまだ発展途上のプロダクトではありますが Web アプリケーション、メディア開発者に何か新しいインスピレーション、可能性を感じさせてくれるアプリケーションだと言えそうです。

それでは、より良い RPi ライフを。



Raspberry Piで遊ぼう!
Raspberry Piで遊ぼう!
posted with amazlet at 13.09.26
林 和孝
ラトルズ
売り上げランキング: 24,218

Posted by netbuffalo at 20:00│Comments(10)TrackBack(0)Raspberry Pi | 家電


この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/netbuffalo/4592632
この記事へのコメント

貴サイトを参考にしてGoogleTVの導入にチャレンジしています。
RaspberryPiTVを入手してpublic配下のindex.htmlとremote.htmlを修正しようとして開いても貴サイトで明示しているような「URL のアドレス部分」が両ファイルの中に見当たりません。
作者がそのファイルを書き換えてしまったのでしょうか?
アドバイスをお願いします。
Posted by nobby at 2014年03月30日 14:08
nobbyさん、ご質問ありがとうございます。

public/jsの下にdisplay.js、remote.jsという2つのJavascriptがあります。
この中を見るとご質問頂いたURL設定がこちらに移動しています。

var socket = io.connect(host);

また、ここで指定しているhost値(URL)ですがJavascriptで動的に取得していました。

host = document.location.origin;

ご参考:http://www.w3schools.com/jsref/prop_loc_origin.asp

以上、結論としては最新版ではURLの設定は必要無くなったようです。

もし、どうしてもうまく動かない場合にはこのjsファイルのhost値を次のように書き換えては如何でしょうか。

io.connect('http://192.168.0.102:8080');
※192.168.0.102はRaspberry PiのIPアドレスで環境により異なります。

それでは。
Posted by netbuffalo at 2014年03月31日 15:40
早速のコメント・ご回答有難うございます。アドバイスの通りまた設定を再開したいと思います。
結果はご連絡致します。

Posted by nobby at 2014年03月31日 15:46
こんにちは!

node app.jsを叩いた結果以下のエラーが出ています。

pi@raspberrypi ~/RaspberryPiTV $ node app.js
info - socket.io started
warn - error raised: Error: listen EADDRINUSE

このエラーをネットであたっていますがいまひとつ原因がわかっていません。またioconnetの引数にラズパイの固定IPとポート8080を指定してもやはり同じエラーが出ます。

私のラズパイは途中までは以下のサイトを参考に設定していたので、次回は一から貴サイトの手順に従いやってみようかと思っています。

http://blog.donaldderek.com/2013/06/build-your-own-google-tv-using-raspberrypi-nodejs-and-socket-io/
Posted by nobby at 2014年03月31日 20:29
nobbyさん、メッセージをみる限り既に8080ポートを誰かが使っているように見えます。
ブラウザでhttp://ラズベリーパイIP:8080にアクセスすると何が動いているかわかるかもしれません。
後もう少し、というところですね。頑張って下さい。
Posted by netbuffalo at 2014年04月01日 00:15
お早うございます。別サイトの既述に従い以下の設定を行っているのが原因ですね。

The ‘server.js’ file is just a simple Node.JS server which will listen on port 8080 and display ‘Hello World’ and write some output to the console. Just place the following content as ‘server.js’ file in directory ‘/home/pi/app’.

var http = require('http');

http.createServer(function(req,resp) {
resp.writeHead(200, {"Content-Type": "text/plain"});
resp.write("Hello World");
resp.end();

console.log("sample output to console");

}).listen(8080);

したがって192.168.11.20:8080をブラウザーでアクセスするとHello Worldと画面表示されます。

これらを含め一度初期状態に戻して再度貴サイトに従い導入をやってみようと思っています。有難うございました。
Posted by nobby at 2014年04月01日 06:16
度々すみません。

上記でserver.jsというファイルをapp/以下に作ってあったわけですが、
これを削除して再起動掛けてコマンドを入れたところ以下の通り起動した感じです。

pi@raspberrypi ~/RaspberryPiTV $ node app.js
info - socket.io started
Pirate TV is running on port 8080

更に進めてみますね。
Posted by nobby at 2014年04月01日 06:23
こんにちは。

スマートフォンでの動画の再生の手前まで導入は進みました。
スマートフォンからRaspberrhyPiのIP+8080/remoteへアクセスしようと
していますがアクセス出来ません。具体的にはchromeブラウザーでIpを入力すると 「192.168.11.20:8080に接続できませんでした」となります。
但しパソコンのブラウザーでアクセスするとPirate Remoteというサイトにアクセスできて、watchボタンを押すとYoutubeが再生できます。
Posted by nobby at 2014年04月02日 21:16
nobbyさん、おー!まずは無事動いたとのことおめでとうございます。
スマートフォンからのアクセスですが条件として無線LANを使って192.168.11.20と同じネットワークにつながっている必要があります。
もし、それでもダメなのであればスマートフォンの設定で何度か無線LAN(Wi-Fi)接続をON/OFFして試してみると良いかもしれません。お聞きしている限りではPi側の問題ではないと思います。
#手前味噌ですがもしテレビで動画を楽しむならRaspbmcもオススメです。
#http://netbuffalo.doorblog.jp/archives/4719708.html
それでは。
Posted by netbuffalo at 2014年04月02日 21:31
アドバイス有難うございます。
スマホのwifiでアクセスしましたがダメでした。wifiのオン・オフなど試してみます。

#手前味噌ですがもしテレビで動画を楽しむならRaspbmcもオススメです。
#http://netbuffalo.doorblog.jp/archives/4719708.html

おお、こちらもやってみたいと思います。
Posted by nobby at 2014年04月03日 12:38

コメントする

名前
URL
 
  絵文字