本サイトの「映像分配するには」のスレッドを参考に、DirectShowの「Infteeフィルタ」を使って1つの動画ファイルをマルチモニタで複数表示したいと思っています。
・画面1:プレビューモニタ(Forms.Panel)
・画面2〜4:フルスクリーンモニタ
画面1と「ActiveMovieWindow」という画面が3つ表示されるところまでは出来ましたが、そのActiveMovieWindowをマルチモニタ上の座標へフルスクリーンで表示する方法が見つからずつまずいています。
どなたかご教授頂けると有難いです。
よろしくお願いいたします。
〜環境〜
VS2010
WIN7
DirectShowLib-2005.dll
基本的にビデオレンダラから IVideoWindow を取得して位置を設定すれば良い。
手軽に実現したいならば、使用するビデオレンダラをこちらで用意しておいてソイツを使わせようにする(ビデオレンダラを探す手間が無くなる)
以下 http://madia.world.coocan.jp/cgi-bin/vbnet/wwwlng.cgi?print+201107/11070004.txt をベースにしたサンプル
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim GraphBuilder As IGraphBuilder = DirectCast(comFilterGraph, IGraphBuilder)
'フィルタをグラフに追加する
'(追加)欲しいウィンドウ数分ビデオレンダラを用意
Dim renderer() As IBaseFilter = { _
DirectCast(New VideoRenderer, IBaseFilter), _
DirectCast(New VideoRenderer, IBaseFilter), _
DirectCast(New VideoRenderer, IBaseFilter), _
DirectCast(New VideoRenderer, IBaseFilter), _
DirectCast(New VideoRenderer, IBaseFilter) _
}
For Each r In renderer
GraphBuilder.AddFilter(r, Nothing)
Next
'カメラとInfinitePinTeeを接続する
'InfinitePinTeeの出力をレンダリングする
'(追加)ウィンドウの位置を設定
For i As Integer = 0 To renderer.GetUpperBound(0)
With DirectCast(renderer(i), IVideoWindow)
.put_Left(240 * i)
.put_Top(100)
End With
Next
DirectCast(comFilterGraph, IMediaControl).Run()
End Sub
↑方法では使用するビデオレンダラをプログラム内で指定してしまっている。それが嫌ならば
「'InfinitePinTeeの出力をレンダリングする」でレンダリング後、「comInfTeeOut」から ConnectedTo() + QueryPinInfo() で
ビデオレンダラまで自力で辿り着き IVideoWindow を得て位置を設定すれば良いかと。
ツイート | ![]() |