DirectShowシステムを休出にて構築中

くまさん

神社,ダムと温泉好きな「システムアーキテクト」

おすすめ

4件のフィードバック

  1. メロン より:

    通りすがりの書き込みですm(_ _)m
    ちょうどDirectShowをやっていて同じようにキャプチャデバイスが
    PALになっておりそのまま取り込むと砂嵐の画像になります
    ググるとココが検索されました(なんてタイムリーな話題)
    1のIAMAnalogVideoDecoderをキャプチャデバイスフィルタにキャストするコードを
    ご教授いただけませんか?
    COMの知識余り無くTips意外に自分でコードが書けない初心者です
    よろしくお願いいたします

  2. くまさん より:

    >>メロン さま

    ようこそ!

    IAMAnalogVideoDecoderを利用したPAL->NTSCの切り替え,見つけるのけっこう大変でしたよぉ(汗

    なお,前提として
    うちでは,
    Directshow.net
    http://directshownet.sourceforge.net/
    を利用して,C#にて実装してます
    C++の場合は,C#のソース読み取って理解していただけると 🙂

    あと,実際動いているコード中,必要部分を抜粋しましたんで
    そこいらも注意です 😉

    private void VideoInit()
    {
       DsDevice[] capDevices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);
          if (capDevices == null)
          {
            ErrorCD = ERRORCD_NOTDEVICE;
            return;
          }

       try
       {
            // Set up the capture graph
            bool fl = false;
            foreach(DsDevice dv in capDevices)
            {
              if (dv.Name == devName)
              {
                SetupGraph( dv, iWidth, iHeight, iBPP, hControl);     //Graphの初期化内で,PAL->NTSCのモード変換をやります

                // tell the callback to ignore new images
                m_PictureReady = new ManualResetEvent(false);
                fl = true;
                break;
              }
            }

            if (fl == false)
            {
              ErrorCD = ERRORCD_NOTFOUNDDEVICE;
              return;
            }
       }
       catch
       {
         Dispose();
         throw;
       }
    }

    private void SetupGraph(DsDevice dev, int iWidth, int iHeight, short iBPP, Control hControl)
    {
      int hr;

      ISampleGrabber sampGrabber = null;
      IBaseFilter capFilter = null;
      IPin pCaptureOut = null;
      IPin pSampleIn = null;
      IPin pRenderIn = null;
      IAMAnalogVideoDecoder vdDec;

      // Get the graphbuilder object
      m_graphBuilder = new FilterGraph() as IFilterGraph2;
      try
      {
    #if DEBUG
        m_rot = new DsROTEntry(m_graphBuilder);
    #endif
        // add the video input device
        hr = m_graphBuilder.AddSourceFilterForMoniker(dev.Mon, null, dev.Name, out capFilter);
        DsError.ThrowExceptionForHR( hr );
        vdDec = capFilter as IAMAnalogVideoDecoder;    //PAL->NTSCのモード切替はこの2行です
        vdDec.put_TVFormat(AnalogVideoStandard.NTSC_M);

         //以下,永遠と初期化コードが続きます...
       }
    }

  3. メロン より:

    >くまさん
    昨夜は素早くレス下さり有り難うございました

    確かにIAMAnalogVideoDecoderを扱った日本語のサイトってないですね
    (検索するだけで半日かかりました)
    くまさんが書いて下さったのでこのブログが唯一のIAMAnalogVideoDecoderを扱った日本語ページということですね

    お察し通りC++なので頂いたソースとMSDNの恐ろしく言葉足らずな説明を元に以下のようにくんでみたところなんとかNTSCでプライマリが変わるようになりました。
    [キャプチャソース一部]
    ICreateDevEnum *pDevEnum = NULL;
    IMoniker *pMoniker = NULL;
    IEnumMoniker *pClassEnum = NULL;
    IAMAnalogVideoDecoder *pAVD = NULL;
    (中略)

    //ビデオキャプチャデバイス列挙子を取得
    pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pClassEnum, 0);
    if(pClassEnum == NULL)
    {
    MessageBox(NULL,”有効なビデオキャプチャデバイスは存在しません”,
    “ERROR!”, MB_ICONERROR | MB_OK | MB_SETFOREGROUND | MB_TASKMODAL);
    return ;
    }
    //最初に見つかったビデオキャプチャデバイスのフィルタ
    pClassEnum -> Next(1, &pMoniker, &cFetched);
    pMoniker -> BindToObject( 0, 0, IID_IBaseFilter, (void**)&pbf );
    pbf->QueryInterface(IID_IAMAnalogVideoDecoder, (void**)&pAVD);
    pAVD -> put_TVFormat(AnalogVideo_NTSC_M); //ココでNTSCに切り替え

    無事コレで設定値を変更することはできたのですが
    残念なことに砂嵐は治りませんでした(涙)
    一度立ちあげ砂嵐画像をキャプチャした後、ソフトを落として再起動すると今度はちゃんとキャプチャできています
    つまり、NTSCに切り替える前にデバイスがアナログ入力を内部の設定値で行ってしまっているため最初のキャプチャが治らない
    ということですね
    うざいのでソフトの中で同じ関数を2回回して回避しました・・・エンジニアにあるまじき暴挙です(反省)

  4. くまさん より:

    >>メロン さま

    m_pGraph->QueryInterface(IID_IMediaControl, (void **)&m_pMediaControl);
    m_pMediaControl->Run();

    する前に,put_TVFormat()を呼び出すと
    うちのキャプチャボックスは,PAL->NTSCへ綺麗に切り替わりましたです

    キャプチャボックスの仕様ですかねぇ...

    >>うざいのでソフトの中で同じ関数を2回回して回避しました・・・エンジニアにあるまじき暴挙です(反省)

    動かすために,うちでも,けっこう強引なことやってますですよぉ(爆

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください