Node.jsを利用して喋れるようになったRaspberry Piですが、機能を追加してYouTubeを再生出来るようにしてみました。

合成音声の発話で試したのと同様にNPM(ノード・パッケージ・マネージャー)を利用します。

パッケージを利用することでプログラムの記述は必要最低限(それも主にドキュメントを記述するだけ)で実装出来ました。方法を紹介します。

Raspberry Piの動画再生

最初は、Chromium(Chromeの開発版)を入れて、それで再生すれば良いかな。などと思っていたのですがスムーズな再生は出来ませんでした。

Raspberry Piで動画再生をするのはブラウザを使わずにパッケージソフトomxplayerを利用して再生するのが良いと思われます。

Macで例えるなら、動画再生をブラウザのChromeなどで再生せずに同梱アプリのQuick Time Playerを使って再生するようなものですね。

youtube-dl

youtube-dl - npm

linux系のコマンドラインツールでYoutubeダウンローダーと言えば youtube-dl というツールが広く利用されています。これはPythonという言語で書かれています。

このコマンドラインツールをJavaScriptで実行してくれるパッケージソフトがこの youtube-dl (npm版) です。

任意のディレクトリにインストールします。

1
$ npm install youtube-dl

YouTubeをダウンロードするドキュメントはこのように書かれています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var fs = require('fs');
var youtubedl = require('youtube-dl');
var video = youtubedl('http://www.youtube.com/watch?v=90AiXO1pAiA',
// Optional arguments passed to youtube-dl.
['--format=18'],
// Additional options can be given for calling `child_process.execFile()`.
{ cwd: __dirname });
// Will be called when the download starts.
video.on('info', function(info) {
console.log('Download started');
console.log('filename: ' + info.filename);
console.log('size: ' + info.size);
});
video.pipe(fs.createWriteStream('myvideo.mp4'));

YouTubeのアドレスを指定してダウンロードします。

その後Node.jsの fs メソッドを利用して任意の場所に保存することが可能になります。

node-omxplayer

node-omxplayer - npm

Raspberry Piで動画再生する場合、コマンドラインツールのomxplayer を利用するのが一般的です。

処理速度も速くフルHD動画もスムーズに再生が出来る様です。

npmで検索するとこのomxplayer をJavaScriptでコントロール出来るパッケージが公開されていました。

インストールから。

1
$ npm install node-omxplayer

ドキュメントはシンプルです。

1
2
3
4
5
// Import the module.
var Omx = require('node-omxplayer');
// Create an instance of the player with the source.
var player = Omx('my-video.mp4');

モジュールを読み込んで、ファイルを指定するだけで再生されます。

やってみる

モジュールと同じ階層に pontube.js というファイルを作りこんな風に記述しました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//youtube-dlを呼び出します。
var fs = require('fs');
var youtubedl = require('youtube-dl');
//ここで読み込みURLを指定します
var video = youtubedl('https://www.youtube.com/watch?v=c0LBi1MHoaU',
['--format=18'],
{ cwd: __dirname });
video.on('info', function(info) {
console.log('Download started');
console.log('filename: ' + info.filename);
console.log('size: ' + info.size);
});
video.pipe(fs.createWriteStream('./samuel.mp4'));
video.on('end', function(){
console.log('Download end');
console.log('Play start');
//node-omxplayerを呼び出します
var Omx = require('node-omxplayer');
var player = Omx('samuel.mp4');
});

Raspberry Piからはこんな実行コマンド一発でダウンロード後に再生されます。

1
$ node pontube.js

試しにYouTubeより「 Every Samuel L. Jackson “Motherf*cker”…Ever - YouTube
のアドレスを入力し、Raspberry PiをHDMI接続で居間のテレビにつないでみました。

SSHでNode.jsの実行コマンドを入力。

無事再生されました。

USBスピーカーを使う

このomxplayerを利用すれば動画関連はほぼいけそうなのですが、残念な事に出力先がHDMIか3.5mmプラグにしか対応していません。

USBスピーカーから出力出来ないか調べてみました。

simple-mplayer

simple-mplayer - npm

omxplayerと同様にコマンドラインから動画を再生できる MPlayer というlinux系パッケージソフトがあります。

検索で調べたところ、Raspberry PiでMPlayerを利用して動画再生すると動画にカクつきがあるようで動画再生はomxplayerをするのが良さそうです。

しかしながら、このMPlayer はUSBスピーカー出力に対応しているので、音声再生だけならどうだろうかと思い試してみました。

NPMよりJavaScript用のパッケージが複数公開されています。一番シンプルなものを選んでインストールしてみました。

1
$ npm install simple-mplayer

ドキュメントはシンプルです。

1
2
3
4
5
var Sound = require('simple-mplayer');
// with ability to pause/resume/stop:
var music = new Sound('./trumpet.wav');
music.play({loop: 0}); // send "-loop 0" to MPlayer to loop the soundtrack forever

パッケージを読み込み、ファイルを指定して再生させることが出来ます。

やってみる

先程と同様に配置します。JavaScriptも同様に記述します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//youtube-dlを呼び出します。
var fs = require('fs');
var youtubedl = require('youtube-dl');
//ここで読み込みURLを指定します
var video = youtubedl('https://www.youtube.com/watch?v=c0LBi1MHoaU',
['--format=18'],
{ cwd: __dirname });
video.on('info', function(info) {
console.log('Download started');
console.log('filename: ' + info.filename);
console.log('size: ' + info.size);
});
video.pipe(fs.createWriteStream('./samuel.mp4'));
video.on('end', function(){
console.log('Download end');
console.log('Play start');
 //simple-mplayerを呼び出します
var Sound = require('simple-mplayer');
var music = new Sound('samuel.mp4');
music.play();
//node-omxplayerを呼び出します
//var Omx = require('node-omxplayer');
//var player = Omx('samuel.mp4');
});

実行コマンド。

1
$ node pontube.js

ダウンロード後、再生されます。

敬愛するサミュエル・L・ジャクソンのキレのある「Mother F*cker」をRaspberry Piで聞くことが出来ました。

まとめ

検索プログラムと上手く組み合わせれば検索から再生も可能です。Raspberry Piらしく音声で検索出来るといいなと思います。

楽しみはつきませんが、ではまた。