2017-11-10 11 views
0

最近DirectShowでマルチメディアプレーヤーアプリを開発しています。ウェブグラフからビデオストリームをキャプチャするためのフィルタグラフを作成できます。ビデオキャプチャを扱う際に、いくつかの新しいアナログビデオフォーマットを使用したり、新しい物理コネクタにルーティングするにはどうすればよいですか?

MSDNのDirectShowドキュメントを読んで、WDMビデオキャプチャフィルタがIAMAnalogVideoDecoderインターフェイスを公開していて、AnalogVideoStandard列挙型のアナログビデオ形式を設定できることがわかりましたが、この列挙型には720p、1080i、 1080:キャプチャカードが複数の物理的な入力があるとき

typedef /* [v1_enum] */ 
enum tagAnalogVideoStandard 
    { 
     AnalogVideo_None = 0, 
     AnalogVideo_NTSC_M = 0x1, 
     AnalogVideo_NTSC_M_J = 0x2, 
     AnalogVideo_NTSC_433 = 0x4, 
     AnalogVideo_PAL_B = 0x10, 
     AnalogVideo_PAL_D = 0x20, 
     AnalogVideo_PAL_G = 0x40, 
     AnalogVideo_PAL_H = 0x80, 
     AnalogVideo_PAL_I = 0x100, 
     AnalogVideo_PAL_M = 0x200, 
     AnalogVideo_PAL_N = 0x400, 
     AnalogVideo_PAL_60 = 0x800, 
     AnalogVideo_SECAM_B = 0x1000, 
     AnalogVideo_SECAM_D = 0x2000, 
     AnalogVideo_SECAM_G = 0x4000, 
     AnalogVideo_SECAM_H = 0x8000, 
     AnalogVideo_SECAM_K = 0x10000, 
     AnalogVideo_SECAM_K1 = 0x20000, 
     AnalogVideo_SECAM_L = 0x40000, 
     AnalogVideo_SECAM_L1 = 0x80000, 
     AnalogVideo_PAL_N_COMBO = 0x100000, 
     AnalogVideoMask_MCE_NTSC = ((((((AnalogVideo_NTSC_M | AnalogVideo_NTSC_M_J) | AnalogVideo_NTSC_433) | AnalogVideo_PAL_M) | AnalogVideo_PAL_N) | AnalogVideo_PAL_60) | AnalogVideo_PAL_N_COMBO) , 
     AnalogVideoMask_MCE_PAL = ((((AnalogVideo_PAL_B | AnalogVideo_PAL_D) | AnalogVideo_PAL_G) | AnalogVideo_PAL_H) | AnalogVideo_PAL_I) , 
     AnalogVideoMask_MCE_SECAM = (((((((AnalogVideo_SECAM_B | AnalogVideo_SECAM_D) | AnalogVideo_SECAM_G) | AnalogVideo_SECAM_H) | AnalogVideo_SECAM_K) | AnalogVideo_SECAM_K1) | AnalogVideo_SECAM_L) | AnalogVideo_SECAM_L1) 
    } AnalogVideoStandard; 

多くはである何、クロスバーフィルタが自動的に追加されますと、私は私がPhysicalConnectorType列挙型を使用したい入力の経路が、HDMIなどのいくつかの新しい入力することができます含まれていません:

typedef 
enum tagPhysicalConnectorType 
    { 
     PhysConn_Video_Tuner = 1, 
     PhysConn_Video_Composite = (PhysConn_Video_Tuner + 1) , 
     PhysConn_Video_SVideo = (PhysConn_Video_Composite + 1) , 
     PhysConn_Video_RGB = (PhysConn_Video_SVideo + 1) , 
     PhysConn_Video_YRYBY = (PhysConn_Video_RGB + 1) , 
     PhysConn_Video_SerialDigital = (PhysConn_Video_YRYBY + 1) , 
     PhysConn_Video_ParallelDigital = (PhysConn_Video_SerialDigital + 1) , 
     PhysConn_Video_SCSI = (PhysConn_Video_ParallelDigital + 1) , 
     PhysConn_Video_AUX = (PhysConn_Video_SCSI + 1) , 
     PhysConn_Video_1394 = (PhysConn_Video_AUX + 1) , 
     PhysConn_Video_USB = (PhysConn_Video_1394 + 1) , 
     PhysConn_Video_VideoDecoder = (PhysConn_Video_USB + 1) , 
     PhysConn_Video_VideoEncoder = (PhysConn_Video_VideoDecoder + 1) , 
     PhysConn_Video_SCART = (PhysConn_Video_VideoEncoder + 1) , 
     PhysConn_Video_Black = (PhysConn_Video_SCART + 1) , 
     PhysConn_Audio_Tuner = 0x1000, 
     PhysConn_Audio_Line = (PhysConn_Audio_Tuner + 1) , 
     PhysConn_Audio_Mic = (PhysConn_Audio_Line + 1) , 
     PhysConn_Audio_AESDigital = (PhysConn_Audio_Mic + 1) , 
     PhysConn_Audio_SPDIFDigital = (PhysConn_Audio_AESDigital + 1) , 
     PhysConn_Audio_SCSI = (PhysConn_Audio_SPDIFDigital + 1) , 
     PhysConn_Audio_AUX = (PhysConn_Audio_SCSI + 1) , 
     PhysConn_Audio_1394 = (PhysConn_Audio_AUX + 1) , 
     PhysConn_Audio_USB = (PhysConn_Audio_1394 + 1) , 
     PhysConn_Audio_AudioDecoder = (PhysConn_Audio_USB + 1) 
    } PhysicalConnectorType; 

DirectShowは古いマルチメディアフレームワークであり、ヘッダーが時間切れである可能性があります。 DirectShowに新しい標準を適用する方法はありますか? DirectShowの他の再配布はありますか?それとも、私はDirectShowを使ってあきらめて、代わりにMedia Foundationを使うべきですか?

答えて

0

したがって、MicrosoftがDirectShowのサポートを停止したと書き換えました。 DirectShowは、デフォルトで720p、1080i、1080pなどのHD標準をサポートしていません。このような問題を解決するために、ビデオキャプチャデバイスのベンダーは、このような新しいデバイスをサポートするプライベートダイレクトショーフィルタを開発し、デバイスのドライバに組み込む - このフィルタはドライブのインストール時にインストールされます。 DirectShowのソースフィルタの発見 - それらのうちの1つは、ドライバをインストールした場合はもちろん、必要なフィルタになります。 Media Foundationについて - 現時点では、ビデオのキャプチャ用にUSBビデオクラスドライバAudio/Video Capture in Media Foundationのみをサポートしています。このようなドライバはUSBウェブカメラのみをサポートしています。

よろしくお願いいたします。

P.S.

EXTERN_C const IID IID_IAJACaptureFilter; 

MIDL_INTERFACE("D941E04F-3B38-4F27-82DD-943FBEA7E755") 
IAJACaptureFilter : public IUnknown 
{ 
public: 
    virtual HRESULT STDMETHODCALLTYPE SetBoardNumber( 
     /* [in] */ WORD value) = 0; 

    virtual HRESULT STDMETHODCALLTYPE GetBoardNumber( 
     /* [out] */ WORD *value) = 0; 

    virtual HRESULT STDMETHODCALLTYPE GetNumBoards( 
     /* [out] */ WORD *value) = 0; 

    virtual HRESULT STDMETHODCALLTYPE ReserveBoard( 
     /* [in] */ WORD value) = 0; 

    virtual HRESULT STDMETHODCALLTYPE SetVideoFormat( 
     /* [in] */ WORD value) = 0; 

    virtual HRESULT STDMETHODCALLTYPE GetVideoFormat( 
     /* [out] */ WORD *value) = 0; 

    virtual HRESULT STDMETHODCALLTYPE SetReferenceSource( 
     /* [in] */ WORD value) = 0; 

    virtual HRESULT STDMETHODCALLTYPE GetReferenceSource( 
     /* [out] */ WORD *value) = 0; 

    virtual HRESULT STDMETHODCALLTYPE SetVideoSource( 
     /* [in] */ WORD value) = 0; 

    virtual HRESULT STDMETHODCALLTYPE GetVideoSource( 
     /* [out] */ WORD *value) = 0; 

    virtual HRESULT STDMETHODCALLTYPE SetAnalogVideoFormat( 
     /* [in] */ WORD value) = 0; 

    virtual HRESULT STDMETHODCALLTYPE GetAnalogVideoFormat( 
     /* [out] */ WORD *value) = 0; 

    virtual HRESULT STDMETHODCALLTYPE GetSourceVideoFormat( 
     /* [out] */ WORD *value) = 0; 

    virtual HRESULT STDMETHODCALLTYPE GetInput1VideoFormat( 
     /* [out] */ WORD *value) = 0; 

    virtual HRESULT STDMETHODCALLTYPE GetInput2VideoFormat( 
     /* [out] */ WORD *value) = 0; 

    virtual HRESULT STDMETHODCALLTYPE GetHDMIInVideoFormat( 
     /* [out] */ WORD *value) = 0; 

    virtual HRESULT STDMETHODCALLTYPE GetReferenceVideoFormat( 
     /* [out] */ WORD *value) = 0; 

    virtual HRESULT STDMETHODCALLTYPE SetFourCC( 
     /* [in] */ DWORD value) = 0; 

    virtual HRESULT STDMETHODCALLTYPE GetFourCC( 
     /* [out] */ DWORD *value) = 0; 

    virtual HRESULT STDMETHODCALLTYPE SetEnableEtoE( 
     /* [in] */ BOOL value) = 0; 

    virtual HRESULT STDMETHODCALLTYPE GetEnableEtoE( 
     /* [out] */ BOOL *value) = 0; 

    virtual HRESULT STDMETHODCALLTYPE SetEnableVANCMode( 
     /* [in] */ BOOL value) = 0; 

    virtual HRESULT STDMETHODCALLTYPE GetEnableVANCMode( 
     /* [out] */ BOOL *value) = 0; 

    virtual HRESULT STDMETHODCALLTYPE SetScaleMode( 
     /* [in] */ WORD value) = 0; 

    virtual HRESULT STDMETHODCALLTYPE GetScaleMode( 
     /* [out] */ WORD *value) = 0; 

    virtual HRESULT STDMETHODCALLTYPE SetAudioSource( 
     /* [in] */ WORD value) = 0; 

    virtual HRESULT STDMETHODCALLTYPE GetAudioSource( 
     /* [out] */ WORD *value) = 0; 

    virtual HRESULT STDMETHODCALLTYPE SetInputAlarm( 
     /* [in] */ BOOL value) = 0; 

    virtual HRESULT STDMETHODCALLTYPE GetInputAlarm( 
     /* [out] */ BOOL *value) = 0; 

    virtual HRESULT STDMETHODCALLTYPE GetCurrentFrame( 
     /* [out] */ DWORD *value) = 0; 

    virtual HRESULT STDMETHODCALLTYPE GetDroppedFrames( 
     /* [out] */ DWORD *value) = 0; 

    virtual HRESULT STDMETHODCALLTYPE GetBufferLevel( 
     /* [out] */ DWORD *value) = 0; 

    virtual HRESULT STDMETHODCALLTYPE GetBoardID( 
     /* [out] */ DWORD *value) = 0; 

    virtual HRESULT STDMETHODCALLTYPE GetSerialNumber( 
     /* [retval][out] */ BSTR *value) = 0; 

    virtual HRESULT STDMETHODCALLTYPE GetDebug( 
     /* [out] */ int *pnDebug1, 
     /* [out] */ int *pnDebug2, 
     /* [out] */ int *pnDebug3) = 0; 

}; 

フィルター:例えばAJA DSフィルタ - 一部のベンダーは、DSフィルタの拡張のための独自のインターフェイスを定義し `

   CComPtrCustom<ICaptureGraphBuilder2> lCaptureGraph; 

       LOG_INVOKE_FUNCTION(lCaptureGraph.CoCreateInstance, __uuidof(CLSID_CaptureGraphBuilder2Proxy)); 

       LOG_CHECK_PTR_MEMORY(lCaptureGraph); 

       CComPtrCustom<IGraphBuilder> lGraphBuilder; 

       LOG_INVOKE_FUNCTION(lGraphBuilder.CoCreateInstance, __uuidof(CLSID_FilterGraphProxy)); 

       LOG_CHECK_PTR_MEMORY(lGraphBuilder); 

       LOG_INVOKE_POINTER_METHOD(lCaptureGraph, SetFiltergraph, 
        lGraphBuilder);        

       CComPtrCustom<IBaseFilter> lVideoCaptureFilter; 

       CComPtrCustom<IBindCtx> pbc; 

       LOG_INVOKE_FUNCTION(CreateBindCtx, NULL, &pbc); 

       LOG_INVOKE_POINTER_METHOD(mMoniker, BindToObject, 
        pbc, 
        nullptr, 
        IID_PPV_ARGS(&lVideoCaptureFilter)); 

       LOG_CHECK_PTR_MEMORY(lVideoCaptureFilter); 

       LOG_INVOKE_POINTER_METHOD(lGraphBuilder, AddFilter, 
        lVideoCaptureFilter, 
        L"Video Capture"); 

       std::vector<CComPtrCustom<IMFMediaType>> lMediaTypes; 

       do 
       { 
        CComPtrCustom<IPin> lPin; 

        LOG_INVOKE_POINTER_METHOD(lCaptureGraph, FindPin, 
         lVideoCaptureFilter, 
         PINDIR_OUTPUT, 
         &PIN_CATEGORY_CAPTURE, 
         &__uuidof(MEDIATYPE_VideoProxy), 
         FALSE, 
         aStreamIndex, 
         &lPin); 

        if (lPin != nullptr) 
        { 
         PIN_INFO lPIN_INFO; 

         ZeroMemory(&lPIN_INFO, sizeof(lPIN_INFO)); 

         HRESULT lr = lPin->QueryPinInfo(&lPIN_INFO); 

         if (SUCCEEDED(lr) && lPIN_INFO.achName[0] != L'\0') 
         { 
          if (aPtrStreamNameString != nullptr) 
          { 
           *aPtrStreamNameString = SysAllocString(lPIN_INFO.achName); 
          } 
         } 

         getMediaTypes(
          lPin, 
          lMediaTypes); 
        } 

       } while (false); 

`

:出力ピンを取得するために、あなたは、次のコードを使用することができますAJA社の出力フィルタのフォーマットを設定することができます。

+0

はいシステムデバイスを列挙し、ドライバによって登録されたソースフィルタを取得するためにBindToObject()を呼び出すことができます。つまり、ビデオ標準のようなソースフィルタのプロパティをカスタマイズしたいのであれば、特定のDirectShowインターフェイスの代わりにIKsPropertySetを使用する必要があります。 –

+0

ビデオ出力ピンとサポートされている出力AM_MEDIA_TYPEを見つけることができます - いくつかのデバイスは、さまざまな出力フォーマットと解像度で多くのピンをサポートしています。しかし、それはデバイスによって異なります。一部のベンダーは、出力ピンのフォーマットと解像度を選択するために独自の インターフェイスを使用しています。 –

+0

P.S.をお読みください。 –

関連する問題