DirectshowでカメラのLIVE映像を分配するのに「Infinite Pin Tee Filter」を使うところまでは分かったのですが、どの様にしたらいいのか分からず困っております。
分かる方が居られましたら教えて頂けませんでしょうか。
よろしく、お願いいたします。
--- 環境 ---
VS2010
WIN7
DirectShowLib-2005.dll
カメラをInfinitePinTeeフィルタの入力ピンに接続し,InfinitePinTeeフィルタの空いている出力ピンを探して下流のフィルタと接続します。
なお,分配がキャプチャ用とプレビュー用の2つに分けるという意味なら,Smart Teeフィルタを使うという方法もあります。
YASさん回答ありがとうございます。
graphedtでは存在するのですが、DirectShowリファレンスのインターフェイスの中には無い様なのです。
もしかして、InfinitePinTeeフィルタとはIBaseFilterフィルタの事でしょうか。
それとgraphedtで確認したのですが、Smart Teeフィルタを使うとLIVE映像がコマ飛びしてしまうようです。
InfinitePinTeeフィルタを使ったサンプルを作りましたので,参考にしてください。
実行するとカメラの画像を5つ表示します。
なお,このサンプルはエラー処理やCOMオブジェクトの解放などの処理をしていませんので,注意してください。
Option Strict On
Option Explicit On
Imports DirectShowLib
Imports System.Runtime.InteropServices
Public Class Form1
Private Const S_OK As Integer = 0
Private comFilterGraph As New FilterGraph
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim GraphBuilder As IGraphBuilder = DirectCast(comFilterGraph, IGraphBuilder)
'フィルタをグラフに追加する
Dim comCamera As IBaseFilter = GetCameraFilter() 'カメラフィルタを取得する
Dim comInfTee As IBaseFilter = DirectCast(New InfTee, IBaseFilter)
GraphBuilder.AddFilter(comCamera, "Camera")
GraphBuilder.AddFilter(comInfTee, "InfTee")
'カメラとInfinitePinTeeを接続する
Dim comCameraCaptureOut As IPin = DsFindPin.ByCategory(comCamera, PinCategory.Capture, 0) 'カメラフィルタのキャプチャ出力ピンを取得する
Dim comInfTeeIn As IPin = DsFindPin.ByDirection(comInfTee, PinDirection.Input, 0)
GraphBuilder.Connect(comCameraCaptureOut, comInfTeeIn)
'InfinitePinTeeの出力をレンダリングする
For i As Integer = 0 To 4
Dim comInfTeeOut As IPin = Nothing
comInfTeeOut = DsFindPin.ByDirection(comInfTee, PinDirection.Output, i)
GraphBuilder.Render(comInfTeeOut)
Next
DirectCast(comFilterGraph, IMediaControl).Run()
End Sub
'カメラフィルタを取得する
Private Function GetCameraFilter() As IBaseFilter
Dim comDevEnum As ICreateDevEnum = DirectCast(New CreateDevEnum, ICreateDevEnum)
Dim EnumMoniker As ComTypes.IEnumMoniker = Nothing
Dim Moniker(0) As ComTypes.IMoniker
Dim Camera As Object = Nothing
DsError.ThrowExceptionForHR(comDevEnum.CreateClassEnumerator(FilterCategory.VideoInputDevice, EnumMoniker, CDef.None))
While EnumMoniker.Next(1, Moniker, IntPtr.Zero) = S_OK And Camera Is Nothing
Moniker(0).BindToObject(Nothing, Nothing, GetType(IBaseFilter).GUID, Camera)
End While
Return DirectCast(Camera, IBaseFilter)
End Function
End Class
ありがとうございます。
とても参考になりました。