ActiveMovieWindowの画面位置を設定するには?


VB.NET初心者  2011-11-14 19:36:19  No: 147398

本サイトの「映像分配するには」のスレッドを参考に、DirectShowの「Infteeフィルタ」を使って1つの動画ファイルをマルチモニタで複数表示したいと思っています。
・画面1:プレビューモニタ(Forms.Panel)
・画面2〜4:フルスクリーンモニタ
画面1と「ActiveMovieWindow」という画面が3つ表示されるところまでは出来ましたが、そのActiveMovieWindowをマルチモニタ上の座標へフルスクリーンで表示する方法が見つからずつまずいています。
どなたかご教授頂けると有難いです。
よろしくお願いいたします。

〜環境〜
VS2010
WIN7
DirectShowLib-2005.dll


gak  2011-11-17 06:10:55  No: 147399

基本的にビデオレンダラから 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 を得て位置を設定すれば良いかと。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加