DirectShow関係
7.DVDの再生
DirectShowではDVDの再生もサポートしています。
おかげでDVDの仕組みなんて知らなくともVBでDVDの再生が楽に行えます。
(再生だけならね^^;。メニューや再生速度の操作とかはVBだけでは無理です)
ただし、DVDは大人の都合の塊なので動作に関しては環境に依存することを心しておいて下さい。
DirectShowはDVD再生をサポートしていますが、
残念ながらDVDのコーディックデコーダは付属してません。
(ライセンスやら独禁法やら規格の広さやらの大人の都合があるんでしょう。)
というわけでDVDのデコーダをインストールしなければなりません。
これは適当なDVD再生ソフトをインストールすれば大抵OKです。
私はInterVideo社の「WinDVD4」というのを入れてます。(CD-Rドライブについてたやつです)
WindowsMediaPlayer等でDVDが再生できるようなっていれば大丈夫です。
DVD再生ソフトをインストールするんだったら、そっちで見た方がいいんじゃないかって?
そんなの当たり前です。(笑
でも少しでも自分でやるって所にロマンを感じましょうよ(^^;
DVDを再生するためのグラフは下記のようになります。
「DVD Navigator」というフィルタがソースフィルタになり、
「Video」と「SubPicture」がビデオデコーダ経由でビデオレンダラに、
「AC3」がオーディオデコーダ経由でオーディオレンダラにつながります。
ちなみに「SubPicture」とは字幕のことです。
ビデオデコーダとオーディオデコーダはよく見てもらうとわかるのですが、
InterVideo社のものです。ここはインストールしたDVD再生ソフトによって変わってくるでしょう。(他はしらん)
とりあえず上のグラフを生成して実行すればDVDが再生されます。
(ただし、メニューとかの操作はできませんので、映像特典とかは見れないかも・・・)
上記のグラフを作成するコードは以下になります。
Option Explicit
'グラフマネージャ
Private mGrp As QuartzTypeLib.FilgraphManager
'フォームロード時
Private Sub Form_Load()
'グラフの作成
Set mGrp = New QuartzTypeLib.FilgraphManager
'DVD Navigatorフィルタをグラフに追加
Dim dvdnavi As QuartzTypeLib.IFilterInfo
Set dvdnavi = AddFilter(mGrp, "DVD Navigator")
'DVD Navigatorフィルタの各ピンを接続する
Dim pp As QuartzTypeLib.IPinInfo
For Each pp In dvdnavi.Pins
pp.Render
Next
'ビデオサイズ(縦横)を取得
Dim bv As QuartzTypeLib.IBasicVideo
Dim vx&, vy&
Set bv = mGrp
bv.GetVideoSize vx, vy
'ビデオサイズに合わせてウィンドウを調整
Dim winx&, winy& 'ウィンドウの縁サイズ
Me.ScaleMode = vbTwips
winx = Me.Width - Me.ScaleWidth
winy = Me.Height - Me.ScaleHeight
Me.Width = winx + vx * Screen.TwipsPerPixelX
Me.Height = winy + vy * Screen.TwipsPerPixelY
'ウィンドウ内で動画を再生させる
Dim vw As QuartzTypeLib.IVideoWindow
Set vw = mGrp
vw.WindowStyle = &H40000000 'WS_CHILD
vw.SetWindowPosition 0, 0, vx, vy
vw.Owner = Me.hWnd
'再生
mGrp.Run
End Sub
'レジストリに登録されているフィルタをグラフに追加する
Public Function AddFilter(ByRef Grp As QuartzTypeLib.FilgraphManager, ByVal FilterName$) As IFilterInfo
Dim regflt As QuartzTypeLib.IRegFilterInfo
For Each regflt In Grp.RegFilterCollection
If regflt.Name = FilterName$ Then
regflt.Filter AddFilter
Exit Function
End If
Next
End Function
|
(他のサンプル同様に「ActiveMovie control type library」を参照設定してください。)
実行させるといきなりDVDを再生します。(実行する前にディスクを入れといてください)
順に説明します。
Option Explicit
'グラフマネージャ
Private mGrp As QuartzTypeLib.FilgraphManager
'フォームロード時
Private Sub Form_Load()
'グラフの作成
Set mGrp = New QuartzTypeLib.FilgraphManager
|
グラフマネージャオブジェクトの定義とグラフの作成を行います。
この辺は「1.動画の再生」と同じですので、そちらを参照してください。
'DVD Navigatorフィルタをグラフに追加
Dim dvdnavi As QuartzTypeLib.IFilterInfo
Set dvdnavi = AddFilter(mGrp, "DVD Navigator")
|
グラフに「DVD Navigator」フィルタを追加します。
DVD Navigatorフィルタは大変高機能なフィルタで、DVDに関するほぼ全ての操作が出来るらしいです。
(すいません、全機能を試した訳ではないのです^^;)
このフィルタがDVD-ROMからDVDの規格にしたがってファイルを読み込み、
映像、音声、字幕情報に分割してくれます。(とっても楽ですね)
'DVD Navigatorフィルタの各ピンを接続する
Dim pp As QuartzTypeLib.IPinInfo
For Each pp In dvdnavi.Pins
pp.Render
Next
|
初めに示したグラフを見てもらうとわかりますが、
DVD Navigatorフィルタは3つの出力ピンがあります。
上のコードではDVD NavigatorフィルタのPinsコレクションで全てのピンを列挙し、
それぞれのピンの下流をRenderメソッドで作ります。
(どんなフィルタが使われるかはDirectShowに任せます。)
これだけでグラフの生成は終了です。
'ビデオサイズ(縦横)を取得
Dim bv As QuartzTypeLib.IBasicVideo
Dim vx&, vy&
Set bv = mGrp
bv.GetVideoSize vx, vy
'ビデオサイズに合わせてウィンドウを調整
Dim winx&, winy& 'ウィンドウの縁サイズ
Me.ScaleMode = vbTwips
winx = Me.Width - Me.ScaleWidth
winy = Me.Height - Me.ScaleHeight
Me.Width = winx + vx * Screen.TwipsPerPixelX
Me.Height = winy + vy * Screen.TwipsPerPixelY
'ウィンドウ内で動画を再生させる
Dim vw As QuartzTypeLib.IVideoWindow
Set vw = mGrp
vw.WindowStyle = &H40000000 'WS_CHILD
vw.SetWindowPosition 0, 0, vx, vy
vw.Owner = Me.hWnd
'再生
mGrp.Run
End Sub
'レジストリに登録されているフィルタをグラフに追加する
Public Function AddFilter(ByRef Grp As QuartzTypeLib.FilgraphManager, ByVal FilterName$) As IFilterInfo
Dim regflt As QuartzTypeLib.IRegFilterInfo
For Each regflt In Grp.RegFilterCollection
If regflt.Name = FilterName$ Then
regflt.Filter AddFilter
Exit Function
End If
Next
End Function
|
以降は「1.動画の再生」と同じ様に、
フォームのサイズを動画の再生サイズに合わせてフォームの中で動画を再生させる為のコードになります。
またAddFilter関数は「2.ライブ動画の再生」で使用したものと同じで
名前によってフィルタをグラフに追加する関数です。
以上でVBからDVDの再生が行えます。
手順としてはUSBカメラの画像を表示するより簡単ですね。
自前でDVDを再生できるんなら「3.キャプチャ」でやった方法を使って
DVDの内容を簡単にDivX形式などに変換して
保存できるのではないかと考える人もいると思います。
ところがそうは大人の都合が許しません。(笑
静止画のスナップもここで紹介している方法では無理です(^^;
なぜなのか知りたい方はGraphEditでグラフを作り
レンダラ入力ピンのプロパティで形式を見て考えて見てください。
上に戻る