BEER Media Server 2を64ビットでコンパイルしてみよう

最近のテレビは後ろを見るとLANの端子が付いていますよね。これを使ってパソコンにある動画ファイルをテレビのリモコンだけで自由に見る方法があります。その方法の一つにパソコンでDLNAサーバープログラムを動かすというのがあります。

そんなプログラムの一つがmalcome氏による"BEER Media Server 2"(BMS2)というのです。
私もBMS2をレグザとビエラで使えるようにするスクリプトを公開してきました。(BMS2用Luaスクリプト

BMS2はmalcome氏の開発が止まってからかなり時間が経ちました。500個を超える動画ファイルがあるフォルダで動作が止まったりする不具合も残っています。64bit版のffmpegでトランスコードを試してみたいとも思っていました。BMS2の利用者も少なく情報も途絶え気味です。

という事でここはひとつBMS2の自前コンパイルを試して見ようと思います。できればデバッグを進めたいですし、BMS2の利用者も増えるといいなぁ。

私はFree Pascalを全く知らないため間違った事を書いているかもしれません。お気づきの点があればコメントいただけると嬉しいです。


Free Pascal開発環境Lazarus をインストールする

Lazarusのバージョンを選ぶ

Free Pascalの開発環境の一つであるLazarusをインストールします。
これはFree Pascalで書かれたソースコードをコンパイルするために使います。BEER Media ServerはLazarusで作られたようですので同じ環境をできるだけ使います。

Lazarus(http://www.lazarus-ide.org/)からダウンロードしてインストールします。
http://sourceforge.net/projects/lazarus/files/から自分のパソコンに合ったものをダウンロードします。

今回、私は64bitのWindows 10で64bitのコードを動かしたいので"Lazarus Windows 64 bits"フォルダを選びます。
このフォルダを開くと何やらたくさんフォルダが表示されます。どれを選べばいいんだろう?となりますね。基本的には日付の新しいものを選びます。しかし、フォルダ名の最後の方にRC1とかRC2とか付いているのは開発途上のものなので避けた方が良いでしょう。RCと付いていないのは安定版と呼ばれます。ということで、この記事を書いた時点での最新版Lazarus 1.4.4を選びたいです。

が、そのフォルダ内のReadMeファイルを読むと、Lazarus 1.4.4までのバージョンでは32ビット版の使用が推奨されています。32bit版でもAdd-Onを追加することで64bitのコードを作れるようですが、64bitのコードを作るのも推奨されていません。Free Pascal Compilerが64bitに正式に対応していないバージョンを使うためです。
そのため今回は"Lazarus 1.6RC2"を選択します。その中の"lazarus-1.6RC2-fpc-3.0.0-win64.exe"をダウンロードします。これは64bitのWindowsで64bitのコードを作るものです。もしも32bitのコードも作りたい場合は"lazarus-1.6RC2-fpc-3.0.0-cross-i386-win32-win64"もダウンロードします。

Lazarusをインストールする

ダウンロードしたファイルを実行します。すると最近のWindowsならすぐに警告メッセージが表示されるでしょう。


最近はセキュリティ対策で良くわからないプログラムを実行しないようになっています。こんな表示をされたら不安になってしまいます。まぁ、ここから先は自己責任です。私も責任持てません。
ということで、警告メッセージの詳細情報をクリックします。すると実行ボタンが表示されますので実行します。

セットアップは特に変更する場所もなくNextを押していくだけでよいでしょう。

セットアップが終わったら実行してみましょう。



何やら初期設定画面が出てきます。良くわからないので右下の"Start IDE"ボタンを押します。するとウインドウがたくさん開くでしょう。

今のところ動くのを確認するだけです。閉じてしまいましょう。

BEER Media Serverのソースコードを入手する

コンパイル環境をインストールしたので次はBEER Media Server 2(BMS2)のソースコードを入手します。BMS2のプロジェクトは
https://code.google.com/p/beer-media-server2/
にあります。Google Codeにて公開されています。

Google Codeではコードの管理にApache Subversion(SVN)というバージョン管理システムが使われています。SVNではリポジトリと呼ぶ場所でコードが管理・保管されています。Google Codeのプロジェクトにはリポジトリのアドレスが表示されているのでそこへアクセスすればソースコードを入手することができます。

その前にSVNの通信を行うプログラムをインストールしなくてはなりません。たくさんプログラムがあるようですが"TortoiseSVN"というのをインストールしてみます。

TortoiseSVNをインストールする

TortoiseSVNは https://tortoisesvn.net/ にあります。
Downloadから落としてきましょう。
落として来たらインストールします。そのまま進めれば良いでしょう。

インストールが終わったら実行してみます。"TortoiseSVN"を実行します。


いきなりなんでしょう? TortoiseSVNは単独のプログラムではありません。エクスプローラーのShell Extensionに機能が追加されます。普通にファイルやフォルダをエクスプローラで表示させ右クリックでSVNの機能を呼び出します。

BMS2のリポジトリを登録する

それではリポジトリを登録してBMS2のソースを入手しましょう。今まで必要なプログラムをインストールしましたが基本的に日本語に対応していないものばかりです。こういったプログラムを使うときは日本語のフォルダ名を使った場所を避けると後々面倒が生じません。ドキュメントフォルダにソースコードを置いておきたいところですがドライブのルートフォルダに英文字だけのフォルダを作りそこにコードを置くことにします。
今回は"c:\GoogleCode"というフォルダにしました。

ファイルエクスプローラで"c:\GoogleCode"フォルダを開きます。まだ何も入っていませんね。
BMS2用のフォルダを新規作成しましょう。そして"C:\GoogleCode\BMS2"を開きここで右クリックをするとメニューに"SVN Checkout..."というウインドウが表示されます。
次にBMS2のプロジェクトページで"Source"タブをクリックしてリポジトリのアドレスを確認します。



このようにそのアドレスを一番上に貼り付けます。Revisionは最新版を持ってくるので"HEAD revision"です。
"OK"を押してみましょう。



アドレスを間違えていなければこのように表示され、フォルダにファイルがダウンロードされているはずです。

BMS2のプロジェクトファイルを開いてみる

ファイルの入手ができたので早速プロジェクトファイルを開いてみましょう。



Lazarusがインストールされているのでファイル"BMS.lpr"はLazarusに関連付けされているでしょう。ダブルクリックしてみましょう。
"Start IDE"をクリックすると何やらコードが表示されるでしょう。
早速コンパイルしてみます。"Run"メニューの"Compile"を押してみます。

いきなりエラーメッセージが表示されます。blcksockなんて知らないよと言っています。何のことでしょうか?
どうやらネットワークの通信する"Synapse ライブラリ"というのが必要なようです。初めての言語の環境なので何のことやら判りませんね。多分ここで挫折してしまう方も多いと思います。

synapse4lazarusを入手する

さてBMS2のプロジェクトページを眺めてどうしたら良いか悩みます。何も書いてないなぁ・・・とあきらめてしまいそうですがこういう時は開発者の他のプロジェクトがないかなぁと見ると良いことがあるでしょう。
BMS2のプロジェクトでMembersのところにある"malcome...@gmail.com"をクリックします。こんな表示だとメーラーが動きそうでクリックしないでしょうに・・・
するとmalcome氏の他のプロジェクトが表示されます。そこに"synapse4lazarus"というプロジェクトがあります。もう名前からして関係ありそうです。

それでは"c:\GoogleCode\synapse4lazarus"というフォルダにリポジトリからダウンロードしてみましょう。先ほどと同じようにsynapse4lazarusのリポジトリアドレスを入れてchekoutします。

ファイルを入手したのは良いですが、このファイルをどうしたら良いかわかりません。BMS2のプロジェクトをLazarusで開いてプロジェクトのオプションを見てみます。Shift+Ctrl+F11を押します。
左側でCompiler OptionのPathを見ると"Synapse"というフォルダが指定されています。しかしそんなフォルダは存在していません。そこでBMS2のファイルがあるフォルダに"Synapse"というフォルダを作りsynapse4lazarusから入手したファイルをコピーして置いてみましょう。

あるいはArarat Synapse からダウンロードして解凍ファイルの"source\lib"の中身をコピーしても良いようです。

コンパイルしてみましょう。ctrl+F9でコンパイルできるようです。
するとメッセージが変わりました。たくさんの警告と一つのエラーが出ています。


型変換のエラーのようです。64bitでやろうとしているからでしょうね。警告は無視してエラーを少し調べます。
こちらの情報が参考になりそうです。

Topic: Is any difference, problems of porting 32-bit app to 64-bit?

When i replace integer() to PtrInt() - the same error:
OldWProc  := Windows.WNDPROC(SetWindowLong(Handle, GWL_WNDPROC,  PtrInt(@MyWndProc)));
Error: Illegal type conversion: "LongInt" to "<procedure variable type of function(QWord,LongWord,Int64,Int64):Int64;StdCall>"

When i replace SetWindowLong to SetWindowLongPtr it compiles:
OldWProc  := Windows.WNDPROC(SetWindowLongPtr(Handle, GWL_WNDPROC,  PtrInt(@MyWndProc)));

ということで、BMS2のUnit1の774行目を次のように変更してみます。
PrevWndProc:= {%H-}Windows.WNDPROC(SetWindowLongPtr(Widgetset.AppHandle, GWL_WNDPROC,{%H-}PtrInt(@WndCallback)));

コンパイルしてみます。
警告が65個も出ますがエラー表示はなくなりました。

これでもう動くのでしょうか?実行してみましょう。
LazarusのRunメニューからRunをクリックするかF9キーを押します。しばらくすると・・・


gdb.exeがありませんと言われましても・・・続行すると


Lua52.DLLが無いというエラーがでます。OKを押すとさらに


MediaInfo.DLLがないと怒られました。

BMS2のプロジェクトフォルダの中にそれらしいファイルは見当たりません。次はどうすればよいのかな。

lua4lazarusを入手する

先ほどsynapse4lazarusを入手する際に気づいたかもしれませんがmalcome氏の他のプロジェクトにはlua4lazarusというのがあります。どう見てもLua用のプロジェクトですよね。入手してみましょう。
lua4lazarus (//code.google.com/p/lua4lazarus/
新たに"C:\GoogleCode\lua4lazarus"というフォルダを作ってSVNでチェックアウトしましょう。

ファイルを入手しましたがこれをどのようにBMS2のプロジェクトへ入れれば良いのでしょうか?よく知らない開発環境ではこういった事に戸惑います。

synapse4lazarusと同じようにPathで教えてやれば良いはずです。先ほどはファイルをコピーしてきましたが、今回はlua4lazarusのフォルダパスをInclude filesへ追加してみましょう。
Shift+Ctrl+F11を押してプロジェクトのオプション設定画面を出しましょう。そしてPathsを選択します。Include filesのところで右端の"..."を押します。



lua4lazarusへのパスを指定してAddしましょう。
【追記16/1/18: これはいらないようです】

どうやらこれで良い感じがします。実行してみます。
前と同じエラーが出ますね。

そうです。そもそもDLLファイルがlua4lazarusにも入っていないのです。

DLLファイルはコンパイルされた関数が入ったライブラリです。コードのビルドとは別に入手しても良いのです。そもそも、64bit版としてコンパイルしようとしているので、LuaもMediaInfoも64bitで動くDLLを用意する必要があります。

32ビットならばこれらのDLLはBMS2の実行ファイルからもらってきましょう。
beer-media-server2のGoogle CodeからDownloadをクリックして最新の実行ファイルをダウンロードすればよいでしょう。

64bit版Lua52.DLLを入手する

64bitのLua52.DLLを手に入れなくてはなりません。Luaも自前でビルドすれば良いのですが、そんな手順を説明したらこの記事でどこまで書けばいいか終わりが見えなくなります。
幸いバイナリを配布するプロジェクトがありますのでそこから頂ます。
sourceforgeに
LuaBinaries (http://sourceforge.net/projects/luabinaries/)というプロジェクトがあります。ここでLuaの実行ファイルがダウンロードできます。
Filesをクリックするとバージョン毎の一覧が表示されます。最新版を試したいところですがいきなりそんな変更までやって問題を抱え込むのは得策ではありません。一つ一つやってみましょう。

Lua52.DLLを使うのでバージョンは5.2だと思われますので5.2をクリックします。Tools Executablesに実行ファイルがあるのでクリックします。lua-5.2_Win64_bin.zipがWindowsの64bit版ですのでクリックしてダウンロードします。
ダウンロードが終わったら解凍してlua52.dllをBMS2のフォルダへコピーします。今回の例では"C:\GoogleCode\BMS2"ですね。

コピーしたらBMS2を実行してみましょう。
Luaのエラーメッセージが表示されなくなったら成功です。次は同じようにMediaInfoのDLLを入手します。

64bit版のMediaInfoを入手する

http://mediaarea.net/ja/MediaInfo で実行ファイルをダウンロードします。IEで開くと"これは安全でないことが報告されているWebサイトです。"なんて出てしまいます。これから先は自己責任です。ご自身の責任で"無視して実行"するとたどり着きます。

Downloadをクリックします。するとOSの一覧が表示されるでしょう。WindowsのOfficial releasesをクリックします。Windows 8の64bitでDLLの項目without installerをクリックしてをダウンロードします。

ダウンロードしたファイルを解凍しMediaInfo.dllをBMS2のフォルダへコピーしましょう。

それではBMS2を実行してみましょう。LazarusでF9を押します。
エラーが表示されなくなりましたか?

エラーは表示されなくなってもまだプログラムが動かないでしょう。

その他必要ファイルを用意する

まだBMS2が動きません。ここでも挫折しそうになりますね。ここまでの設定でコンパイルは成功しているはずです。用意したDLLの32bitと64bitを間違えると実行時にエラーが表示されるでしょう。
しかし、正しく設定ができた場合は実行しても何も画面に表示されずにプログラムは終了してしまうでしょう。

それは必要なファイルがまだ足りないからです。足りないファイルを追加しましょう。
BMS2の実行ファイルをダウンロードしてください。解凍するとdataフォルダがあります。これを"C:\GoogleCode\BMS2"にコピーしましょう。

そして、bms.iniファイルも必要です。bms.ini.txtファイルを"C:\GoogleCode\BMS2"にコピーして名前を"bms.ini"に変更します。

これで実行すると動き出すはずです。正しく動けば注意メッセージが表示されるはずです。
"[MediaDirs]が未設定です。"みたいなのです。これはbms.iniを設定していけば良い話なので今回のビルドの記事では説明をしません。


正しく動けば上のような画面が表示されると思います。ネットワークにDLNAクライアントが見つかるとそれとの通信の様子が表示されます。
"Quit"を押すと終了します。"SAYONARA"とメッセージが出るでしょう。

ここまで動けばコンパイルは成功でしょう。あとは実際にメディアファイルを使ってテレビなどで表示できるか試していくことになります。

32bitのクロスコンパイラAdd-onをインストールすれば当然32ビット版もコンパイルできます。

コンパイルをいろいろ試しすぎて元のファイルに戻したいときは、リポジトリからのファイルを置いているBMS2フォルダにある".svn"フォルダを残して他を削除しましょう。その後、SVN Updateを選べばファイルを取り直してくれます。

なぜかVIERAでBMS2が表示されない

レグザで64bit版のffmpegを使ってトランスコード再生ができるようになったのでコンパイルの初期目標は達成したなと思ったら・・・

なぜかビエラではBMS2が表示されません。BMS2の表示を見るとビエラとの通信をしていません。まだ何か問題があるのか・・・

今回の記事はコンパイルが目的なのでここまでにします。ビエラの件は今後追々探っていきます。どなたか情報をお持ちの方はぜひコメントください。

























コメント

  1. コンパイル済みファイルほしいです。。。

    返信削除
    返信
    1. 64bitのコンパイルをしてみましたが動作は32bitより遅くなってしまいました。32bitをお薦めします。
      malcome様はGitHubへ移行されないようですね。残念です。
      実行コードはアーカイブでまだ手に入りますよ。
      https://code.google.com/archive/p/beer-media-server2/

      削除

コメントを投稿

最近のコメント

Threaded Recent Comments will be here.