映像分配するには

解決


VB.NET初心者  2011-07-29 03:57:15  No: 147346

DirectshowでカメラのLIVE映像を分配するのに「Infinite Pin Tee Filter」を使うところまでは分かったのですが、どの様にしたらいいのか分からず困っております。
分かる方が居られましたら教えて頂けませんでしょうか。
よろしく、お願いいたします。
---  環境  ---
VS2010
WIN7
DirectShowLib-2005.dll


YAS  2011-07-29 06:02:51  No: 147347

カメラをInfinitePinTeeフィルタの入力ピンに接続し,InfinitePinTeeフィルタの空いている出力ピンを探して下流のフィルタと接続します。
なお,分配がキャプチャ用とプレビュー用の2つに分けるという意味なら,Smart Teeフィルタを使うという方法もあります。


VB.NET初心者  2011-07-29 19:40:28  No: 147348

YASさん回答ありがとうございます。

graphedtでは存在するのですが、DirectShowリファレンスのインターフェイスの中には無い様なのです。
もしかして、InfinitePinTeeフィルタとはIBaseFilterフィルタの事でしょうか。

それとgraphedtで確認したのですが、Smart Teeフィルタを使うとLIVE映像がコマ飛びしてしまうようです。


YAS  2011-07-30 04:50:56  No: 147349

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


VB.NET初心者  2011-07-31 03:33:32  No: 147350

ありがとうございます。
とても参考になりました。


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

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






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