まどマギ叛逆の物語のDVDをコメント付きで視聴できるプレイヤーソフト、マジカルプレイヤーを作りました。

↓ソフトの紹介ページはこちら

【コメント叛逆DVDプレイヤーソフト】マジカルプレイヤーについて【Windowsアプリケーション】

本記事ではこのソフトの開発の記録について書いてみます。


経緯

叛逆の映画が公開されてから3年が経ちました。
先日のチネチッタでのリバイバル上映を観に行きましたが、コアなまどマギファンの熱気が感じられ、まだまだ根強い人気があるなあと感じました。

そのリバイバル上映も終わってしまいましたが、まだまだ叛逆で盛り上がりたい!何か方法は無いだろうかと考えてみました。
例えばニコニコみたいにみんなのコメント付きで観れるような…

そういえばニコニコではニコニコdvdというサービスをやってた事を思い出しました。
ニコニコdvdとは専用のDVDプレイヤーソフトで手持ちのアニメのDVDを再生するとコメント付きで観れて、コメントの投稿も出来るというものです。

これでいいんじゃないかと思いましたが、指定されたタイトルのアニメしか対応してないようですし、何よりすでにニコニコdvdのサービスは終了していました。

残念だな…と思いましたが、よく考えるとこれって割と簡単に作れるのではないか?
要するにコメントの取得、投稿ができるDVD再生ソフトとコメントの送受信サーバだけ作れば実現できそうです。

というわけで、作ってみる事にしました。

開発はWindows10で行いましたが、これが最大の罠だと気付くのはずっと後になっての事です。

DVDとの戦い

さしあたってDVDプレイヤー部分を作る必要がありましたが、これが地獄の始まりでした。

AVPro編

最初に、使い慣れてるUnityでDVD再生に挑戦してみました。
UnityのAVProというアセットを用いて再生を試みました。

https://www.assetstore.unity3d.com/jp/#!/content/2546

ところで、DVDのディスクの中はディレクトリ構造になっており、”AUDIO_TS”、”VIDEO_TS”というフォルダの中に、IFO,VOB,BUPファイルが入っています。
IFOファイルは動画の再生やメニューに関する情報がまとめられています。BUPファイルはIFOファイルが破損して読み込めなくなった時のためのバックアップです(IFOと同じ内容)。そしてVOBファイルに実際の動画のデータがMPEG2で詰められています。

叛逆DVDの本編に関するデータは、VTS_01_0.IFOとVTS_01_1.VOB~VTS_01_5.VOBです。

AVProではIFOファイルを開く事はできませんでしたが、VOBファイルを開いて再生できました!

やった!

と喜んだのも束の間、本来30分くらいあるはずのVOBファイルが1秒しか認識されないといったような現象が発生しました。

何故?とググッたら、どうやらVOBファイルは単なるデータ塊であって、再生に必要な情報はIFOファイルに入ってるので、VOBファイル単体では正しい再生時間などの情報がわからないそうです。

しかしAVProではIFOファイルを解析したりできないわけで、これでは上手く行きません。
AVProはDirectShowを利用して動画を再生していますので、Unityでの開発は諦めて、生のDirectShowを扱ってみる事にしました。

ちなみにUnity5.6で搭載されたVideoPlayerコンポーネントも試してみましたが、IFOもVOBも開けませんでした。

DirectShow編

どうやらDirectShowのSDKにDVDプレイヤーのサンプルがあるそうなので、DirectShowのSDKを探しました。

しかし、見つからない!

WindowsKitに同梱されてるとの事ですが、最新のWindowsKitにはDirectShowの存在は影も形も見当たりません。
何か不穏な感じがしてきました…

昔のDirectShowSDKが入ってた頃のWindowsKitをインストールしようとするとインストーラでエラーが出て失敗します。
詰んだ…

そんな時に、DirectShowを.Net(C#)で扱えるようにラップしたライブラリを発見しました。

http://directshownet.sourceforge.net/

さっそくこちらのライブラリのサンプルのDVDプレイヤーを実行してみましたが、結局エラーが出ます。
オーディオグラフをいい感じで繋いでくれるGetDvdInterface関数でコケてるようです。

何故動かないのかまったく謎ですが、心当たりがあるとすれば、そう言えばWindows10はライセンス料の関係でメディアプレイヤーでDVDが再生できなくなったのですが、もしかするとそれと関係あるのかも…

こちらのスレッドでは、他のDirectShowデコードフィルターを導入してても何故かWindows DVT-DVD filterが使用されてしまう現象について言及されています。
しかも、このWindows DVT-DVD filterは、Windows10においては有料のDVDプレイヤーアプリを購入しないと動作しないらしいのです!

タダでは絶対にDVDを再生させないというマイクロソフトの強大な意志の存在がDVDの再生を全力で妨げてる…そんな感じがしてきました…。

ちなみにDirectShowのオーディオグラフをちゃんと自力で繋げば再生できると書かれた記事もあったので、もっと頑張ればWindows10+DirectShowでDVD再生できたのかもしれません。

Windows Media Player ActiveX コントロール編

なにか他の手段でDVDを再生できないかググッてたら、MSWEBDVD.DLLというコンポーネントを使う話が出てきましたが、これはWindowsXPの頃のコンポーネントで、VISTAや7ではすでに消滅していた物らしいのでこれについては考えない事にします。

しかし、WindowsXPの頃はいとも簡単にできていたDVD再生に、Windows10の今になってここまで苦労させられているという現状に半分キレはじめてきました。

他の情報を当たると、Windows Media PlayerのActiveXコントロールをWindowsフォームに埋め込んでIFOファイルを開くと一発でDVDを再生できるという情報がでてきました。

どうせWindows10以前は。って話だろうと思いつつ試してみたら、やはりmp4など普通の動画ファイルは再生できますが、IFOファイルやVOBファイルは開けません。
まあWindows Media Playerのソフトでそもそも開けないんだから、そりゃそうですよね。

ガックシきましたが、Windows Media PlayerのActiveXコントロールの上に、VLCのActiveXコントロールを見つけました。
そういえばVLCのソフトからはDVDを開けるんですよね。一応ダメもとで試してみました。

VLC ActiveXコントロール編

VLCのActiveXの使い方はこちらの動画などで丁寧に解説されてます。

IFOファイルは開けませんがVOBファイルは開けますね!
しかし、やはりAVProと同じように動画の再生時間が正しく表示されません。

ダメか…と思いましたが、VLCではDVDを開く時は特殊なURLを指定するようです。
ファイルパスの頭に”dvd:///”を付けるという物です。これだとメニューが開くので、いきなり本編を開きたければ”dvdsimple:///”です。

試しに”dvdsimple:///(DVDドライブのドライブレター)://.”とURL指定したらDVD本編が再生されました!

おお、VLCならDVDを再生させることができるようです!
光明が見えてきました!

しかし、私はActiveXを使ったソフトを作った事が無かったので知らなかったのですが、ActiveXコントロールを使ったソフトを配布するには、単にdllを同梱するだけではダメで、何やらユーザー側でインストール作業を行ってもらう必要があるみたいです。
これでは使い勝手が悪いですね。

VideoLan DotNet編

そんな時に発見したのがVLCの.NET用ライブラリです!

http://vlcdotnet.codeplex.com/

Winowsフォーム用とWPF用の2種類あるみたいです。
使い方はこちらの記事などで解説されています。

これならdll同梱だけで簡単に実行できるソフトが作れそうです!

さっそく再生ボタンやシークバーを配置してガシガシDVDプレイヤーを作っていきました。

ちなみにVLCはGPLライセンスで提供されてます。つまりVLCを利用する(dllにリンクする)という事はGPLに感染する事を意味します…。
う~ん、まあ今回のプロジェクトについてはソース公開しても困らないのでいいか!
ちなみに今回の成果物はGPLという事でGitHubに公開してます。

https://github.com/umiyuki/MagicalPlayer

DVDプレイヤー部分が大体できたので、早速肝心のコメント表示を実装して…

あれ…ラベルの背景が透過しないぞ…?

ググッてみたらこちらのスレに衝撃の事実が書かれていました。

なんと、Windowsフォームではラベルの背景は透過色を選んでも親の背景色で塗りつぶされるだけで、本当の意味での透過は出来ないというのです!
バカな…

スレに書かれている解決法は、
1.VideoLan.NETのWPF版を使えばラベル背景を透過できる(ただし今のバージョンだと動画が強制的に最前面に来てしまう問題があるのでVer1.2が推奨)
2.他のWPFの.NET用VLCライブラリを使う(例えばMeta.Vlc)

1についてはVideoLanDotNetのVer1.2と言われてもどこ探しても見当たらなかったので、2のMeta.VlcでWPFを使って実装を試してみました。

Meta.Vlc編

結論から言うとMeta.Vlcを使う事で上の全ての問題は解決しました。

しかもよくできた動画プレイヤーのサンプルまであるのでこれをベースにコメント表示、投稿機能だけ足せば完成しそうです。
いいね!!

WPFは初めて使いましたが、結局Windowsフォームで作るのと使い勝手は大差ないと感じました。
しいて言えばラベルとかのコントロールを動的に作って動かすのは標準的なやり方じゃないようで、親コントロールからのマージン値を調整して動かすような操作になったのが特殊な感じかもしれません。

コメント送受信部分の実装

DVDプレイヤー部分がなんとかなったので、あとはコメント送受信だけ作れば完成です。

クライアント側からはGETでコメント受信、POSTでコメント送信する事にします。

サーバ側はNode.jsで実装して、POSTで受け取ったコメントを貯めておいて、GETが来たら貯めたコメントをJSONにして返せばいいでしょう。

簡単ですね。

ソースはGitHubのリポジトリを確認してください。

クライアント

さて、C#からHTTPリクエストを送るのに何をつかうべきか。
HttpWebRequestを使うのはもはや古くて、今はHttpClientを使うのがトレンドらしいです。
HttpClientの使い方の解説はこちらを参考にしました。

しかし、トレンドだけあってasyncだのTaskだのawaitだのの使った事ない新しげなキーワードが炸裂してて困惑しますね。
いわゆる非同期処理を簡単に書くための仕組みなので、HTTPリクエストみたいな非同期処理でこそ使わなくてどうする!といったところでしょうか。

ググッて調べながら書いてみると、たしかにとってもわかりやすく非同期処理が書けて便利ですね!
正直普段Unityでスレッドでどうこうしてるのがアホらしくなってきました。

コメント投稿時はPOSTでコメントの本文(comment)と動画時間(time)と、一応今後他のDVDにも対応する時のために動画の種類を識別する文字列を送っときます(video)。今回は叛逆なので決め打ちで”video : rebellion”とします。

ソフト起動時にはGETでサーバからコメントをJSONで取得します。

[
{ “time” : “100” , “comment” : “ほむほむ” },
{ “time” : “299” , “comment” : “さやさや” },

]

↑こんな感じのJSONが取れる予定です。

JSONをパースするにはJson.NETを使いました。

http://www.newtonsoft.com/json

使い方はこちらを参考にしました。

time、commentフィールドを持ってるクラスを用意すれば簡単にデシリアライズできました。

サーバー

サーバー側はNode.jsを使って書きました。
ちなみに開発環境はVisualStudio2017(RC)を使いました。VisualStudioは「Node.js Tools for Visual Studio」を導入するとなかなか便利なNode.js開発環境になります。

Node.jsについてはかなり前に使ったっきりで、ほぼ何もかも忘れてたのでドットインストールのNode.js入門で勉強し直しました。
結果的にはドットインストールの内容だけでサーバー側プログラムを実装できたので、さすがドットインストールといった感じです。

実際サーバーでやる事はシンプルです。

まず、コメント用の配列を持っておきます。
クライアントからコメントがPOSTされてきたら、querystringでパースして、コメント配列に追加します。

そして、コメントのGET要求が来たら、コメント配列をそのままJSON.stringifyでJSON化して返してあげればOKです!

ただし、サーバーが落ちた時のために、データを永続化する必要がありますので、mongodbを使ってコメントを保存しておきます。
Node.jsからmongodbを操作するのはとっても簡単です!

POSTの時にコメント配列に追加するついでにmongodbにドキュメント(行)を追加しておきます。

後はサーバーを起動した時に、mongodbからコメントを取得してコメント配列に詰めればバッチリです!

詳しい実装はソースを参照してください。

完成

そういう訳で完成しました。
お疲れさまでした。

苦労したのでよかったら是非マジカルプレイヤーを使ってみて、要望などあればお寄せください。
GPLライセンスなのでソースを改造して新しいソフトを作ってみるのもいいのではないでしょうか。

今回は試しに作った感じだし、個人情報とかは何一つ取り扱ってないので、セキュリティ周りについてまったく気を使ってないですし、異常系のテストなども不十分なので、もっと本格的なサービス化していく事になったらセッション管理とか色々やる必要がある気がします。

違法性は無かった

今回開発してて、もっともネックだったのは、DVDをそのまま再生するという部分です。
HDDの中にあるmp4ファイルを再生すればいいとかであればどれほどラクだったでしょうか…

しかし、現在の著作権法では、VOBファイルなどをHDDにコピーしただけで違反になってしまうようです。
という訳でDVDをそのままの状態で再生させる事が必須であり、それ故に苦労する事になりました。

このような法律だと、買ったDVDをスマホに移して観る事もままならないですよね。
不便さというのは法律で押し付けたところで、ハイわかりましたと今まで通りにいくとは限りません。
開発してて思ったのは、もうDVDの時代じゃ無いかもなという事です。
DVDというのはレガシーなメディアだと思います。
マイクロソフトがメディアプレイヤーでDVD見れなくしたのも、「NETFLIXで観ろや」くらいの言い分かもしれません。

今はDVDの売り上げでアニメの成功が語られたりしてますが、スマホでは観れないし、ろくにPC(Windows10)でも観れないこんな不便なメディアよりも、Amazonプライムビデオなどのオンデマンド見放題動画サービスでスマホやタブレットからサックリ視聴するようになっていってる感じがします。

とは言え合法的にアニメにコメント付けたりしてみんなで楽しむという手段となると今回みたいな形で実装するしかないのが現状です。
ですので、もしこれで反響があればもっと機能を拡充したりしていきたいと思います。

それに、今回のコメントサーバは、応用すればアニメに限らずTwitch Play Pokemonみたいな感じで、ゲームをコメントでどうこうする、みたいな仕組みにも応用できるかも知れません。
何か面白い事が思い付いたらアイデアを広げていきたいですね。