2

ウェブカメラでビデオ ソースを「コンポジット」に変更する設定を探しています。USB を抜いてから再度差し込んでコードを起動すると、空白の画面が表示されるようです。しかし、(別のプログラムで) ビデオ ソースを変更してから、戻ってコードを再度実行すると、それが表示されます。

そのため、ウェブカメラを設定する機能を備えた別のプログラムを起動しなくても、自分のアプリ内で同じことを行うために、それを変更できるものが必要です。

USB ケーブルを抜き差ししてソース コードを実行すると、アプリのピクチャ ボックスが黒くなります。

ここに画像の説明を入力

ビデオソースを変更するために使用する「他のプログラム」(画像を表示するために機能するようです): ここに画像の説明を入力

その「他のプログラム」を使用した後、ソースコードに戻って実行すると、次のようになります。 ここに画像の説明を入力

ここから dot Net Webcam Library という C# コードを使用しています: ここにリンクの説明を入力してください

ここにリンクの説明を入力してからDirectShowを使用しているようです

ソースには、さまざまな種類のビデオ設定がリストされていることに気付きました (以下の AXExtend.cs にあります)。

public enum PhysicalConnectorType
{
    Video_Tuner = 1,
    Video_Composite,
    Video_SVideo,
    Video_RGB,
    Video_YRYBY,
    Video_SerialDigital,
    Video_ParallelDigital,
    Video_SCSI,
    Video_AUX,
    Video_1394,
    Video_USB,
    Video_VideoDecoder,
    Video_VideoEncoder,
    Video_SCART,
    Video_Black,

    Audio_Tuner = 0x1000,
    Audio_Line,
    Audio_Mic,
    Audio_AESDigital,
    Audio_SPDIFDigital,
    Audio_SCSI,
    Audio_AUX,
    Audio_1394,
    Audio_USB,
    Audio_AudioDecoder,
}

しかし、ここのコードでそれを呼び出す方法がわかりません:

Device selectedDevice = device as Device;
imageCapture.Device = selectedDevice as Device;
imageCapture.PerformAutoScale();
imageCapture.Refresh();
imageCapture.Start();

それで、「Video_Composite」はそれを行うために必要なものだと思いますか?

どんな助けでも素晴らしいでしょう!!! ありがとう!

デビッド

コードの更新

foreach (Device device in Device.FindDevices())
{
   if (device.ToString() == "BackupCamera")
    {
        Device selectedDevice = device as Device;
        IGraphBuilder graphBuilder = new FilterGraph() as IGraphBuilder;
        DsDevice device1 = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice)[1]; // <<--- Your Device
        Guid baseFilterIdentifier = typeof(IBaseFilter).GUID;
        object videoSourceObject;
        device1.Mon.BindToObject(null, null, ref baseFilterIdentifier, out videoSourceObject);
        IBaseFilter videoSourceBaseFilter = videoSourceObject as IBaseFilter;
        graphBuilder.AddFilter(videoSourceBaseFilter, "Source");
        ICaptureGraphBuilder2 captureGraphBuilder = new CaptureGraphBuilder2() as ICaptureGraphBuilder2;
        captureGraphBuilder.SetFiltergraph(graphBuilder);
        object crossbarObject;
        captureGraphBuilder.FindInterface(FindDirection.UpstreamOnly, null, videoSourceBaseFilter, typeof(IAMCrossbar).GUID, out crossbarObject);
        IAMCrossbar crossbar = crossbarObject as IAMCrossbar;
        int inputPinCount, outputPinCount;
        crossbar.get_PinCounts(out inputPinCount, out outputPinCount); // <<-- In/Out Pins
        // Pin Selection: Physical Input 2 (e.g. Composite) to Capture Pin 0 
        crossbar.Route(0, 2);

        imageCapture.Device = selectedDevice as Device;
        imageCapture.PerformAutoScale();
        imageCapture.Refresh();
        imageCapture.Start();
    }
}
4

1 に答える 1

3

ファイラー グラフを実行する前に、クロスバー インターフェイスを取得する必要があります。通常、これに使用ICaptureGraphBuilder2::FindInterfaceします。これには追加のフィルターが必要であり、このFindInterface方法は特に次の理由で役立ちます。

フィルターのサポート。キャプチャ デバイスが Windows Driver Model (WDM) ドライバを使用している場合、グラフには、TV チューナー フィルタやアナログ ビデオ クロスバー フィルタなど、WDM ビデオ キャプチャ フィルタの上流に特定のフィルタが必要になる場合があります。pCategory パラメータが NULL でない場合、このメソッドは必要な WDM フィルタを自動的にグラフに挿入します

これが完了すると、IAMCrossbarインターフェースができ、IAMCrossbar::Routeメソッドは入力を切り替える方法です。

参照:クロスバー フィルターの現在の入力をコンポジットに変更する

コードスニペット:

IGraphBuilder graphBuilder = new FilterGraph() as IGraphBuilder;
DsDevice device = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice)[1]; // <<--- Your Device
Guid baseFilterIdentifier = typeof(IBaseFilter).GUID;
object videoSourceObject;
device.Mon.BindToObject(null, null, ref baseFilterIdentifier, out videoSourceObject);
IBaseFilter videoSourceBaseFilter = videoSourceObject as IBaseFilter;
graphBuilder.AddFilter(videoSourceBaseFilter, "Source");
ICaptureGraphBuilder2 captureGraphBuilder = new CaptureGraphBuilder2() as ICaptureGraphBuilder2;
captureGraphBuilder.SetFiltergraph(graphBuilder);
object crossbarObject;
captureGraphBuilder.FindInterface(FindDirection.UpstreamOnly, null, videoSourceBaseFilter, typeof(IAMCrossbar).GUID, out crossbarObject);
IAMCrossbar crossbar = crossbarObject as IAMCrossbar;
int inputPinCount, outputPinCount;
crossbar.get_PinCounts(out inputPinCount, out outputPinCount); // <<-- In/Out Pins
// Pin Selection: Physical Input 2 (e.g. Composite) to Capture Pin 0 
crossbar.Route(0, 2);
于 2013-07-17T06:36:43.507 に答える