再生できなくなったDVD-RAMのサルベージで片っ端からDVD-RAMをリップしてHDDに入れたはいいけど、
ディスク全体で一本の動画ファイル(VR_MOVIE.VRO)になっているので雑多に録画したディスクでは見たいシーンの頭出しが困難なのが難点です。
vro2splitというソフトを使えば、クリップ単位で分割できるのですが、DVD-RW等に焼いてレコーダーで再生できるように元のファイルも取っておきたい。
両方保存するのはHDDのムダだし、その都度分割するのは時間がかかるし…
なんとかリップしたファイルだけ取っておいて、見るときはクリップ単位にバラで、って方法は無いだろうか。

いろいろ考えた結果、URLにディスク名とクリップ番号を指定すると、該当するMPEG2ファイルを切り出して返すようなApacheモジュールを作ることにしました。
HTTP疑似ストリーミングってやつですね。
リクエストヘッダのRangeに対応すれば、プレイヤーのシークにも対応できます。
Apacheモジュールを作るのは初めてなので「Apacheモジュールプログラミングガイド」という本を買いました。
ちょっと古い本でApache1.3向けに書かれており、最後のほうで2.0にも触れています。とりあえずこれで基本を勉強しました。
クリップ単位に分割するために必要なDVD-VRのIFOファイルのフォーマットは公開されていませんが、
メモwiki (主にコンピュータ関連)DVD-RAMのIFOファイル
を参考にさせていただきました。あとは現物をhexdumpで見てなんとかしました。
ものはついでなので、DVD-VRをリップしたISOイメージファイルにも対応しました。UDFについては
せんべえ焼き、もしくはコースターメーカー
がとても助かりました。
さらについでなので、DVD-Videoにも対応しました。DVD-VideoにもIFOファイルがありますが、フォーマットが違います。
DVD-Video Information
を参考にさせていただきました。
もちろん、DVD-VideoのISOイメージファイルにも対応しています。

モジュールは出来上がって、VLCのファイルメニューの「ネットワークを開く」から再生できるようになりました。
ところが、QuickTime Playerの「場所を開く」では再生できませんでした。
どうやら、MPEG2PSを切り出したファイルでは再生できず、MPEG2TSでないとダメなようです。
解決するには、その場でTSに変換するか、普通のファイルとして見える方法を考える必要があります。
検討の結果、WebDAVとしてレスポンスし、クライアントでマウントする方法を採りました。
ApacheのWebDAVモジュール、mod_dav.soの出力をまねて作ったところ、うまいことマウントでき、QuickTime Playerでも再生できるようになりました。

mod_dvd.cpp

このプログラムを使用したことによる損害については、作者はその責を負いません。

使い方

まず、DVD-Video/DVD-VRのファイルを入れたボリュームは、下記のようなディレクトリ構成にしておきます。

DVD-Videoのディレクトリ例
ディスク名1━━VIDEO_TS━┳━VTS_01_0.IFO
                 ┣━VTS_01_1.VOB
                 ┣━VTS_02_0.IFO
                 ┣━VTS_02_1.VOB
                 ┗━VTS_02_2.VOB
ディスク名2.ISO
DVD-VRのディレクトリ例
ディスク名1━━DVD_RTAV━┳━VR_MANGR.IFO
                 ┗━VR_MOVIE.VRO
ディスク名2.ISO

今回はOS X 10.9.5、Apache2.4.10を使いました。
まずApacheをビルドしてインストールします。やり方は検索すれば出てくるので省略します。
C++で書いたのでApacheインストール先のbuild/config_vars.mkのCXXのところを
CXX = c++
と書き換えます。httpd.confには
LoadModule dvd_module modules/mod_dvd.so
<Location /dvd>
	SetHandler	dvd
	VideoRoot	"/Volumes/ボリューム名/DVD-Videoのディレクトリ"
</Location>
<Location /dvdvr>
	SetHandler	dvdvr
	VideoRoot	"/Volumes/ボリューム名/DVD-VRのディレクトリ"
</Location>
のように書き加えます。Listenはとりあえず8080にしておきます。ServerNameも適当に指定しておきます。
新しくインストールしたApacheの方が実行されるようにpathを設定し、
$ apxs -g -n dvd
でひな形を作り、出来上がったdvdディレクトリの中のmod_dvd.cを消してこのページのmod_dvd.cppを入れ、
$ make reload
でビルド、インストール、Apache(再)起動まで実行します。
無事起動したら、DVD-Video/DVD-VRのファイルが入っているボリュームをマウントし、Finderの「サーバへ接続...」で
http://localhost:8080/dvdvr
としてゲストで接続すると、dvdvrボリュームがマウントされるので、あとは見たいファイルを再生するだけです。
軽くするために、Finderの「アイコンプレビューを表示」と「プレビュー欄を表示」のチェックを外しておいたほうがいいです。
プレイヤーは、普通に見るにはVLCがお勧めです。プレイリストのところにディスク単位のフォルダ、またはタイトル単位のフォルダをドロップします。
シーンを探すときはQuickTime Playerがお勧めです。開くまでに時間がかかりますが、シークバーをドラッグしたときの反映速度が素晴らしいです。