none
ファイルを再生できません。 RRS feed

回答

  • 外しているかもしれませんが、IMediaControl::Run() で Render を開始した後に、IMediaControl::StopWhenReady () を使ってきちんと停止させていますか?

    下のコードは URL の先にあるサンプルをいじったものですが、HozonAndHyoji を capture 開始時に、StopHozonAndHyouji を capture 終了時に呼び出すようにしています。グローバル変数に置いているものは、必要最小限というわけではない(取り敢えずあると良さそうなのを取り出しただけ)ですので、無駄があるかもしれません。 

    static IGraphBuilder*  g_pGraph = NULL ;
    static IMediaControl*  g_pControl = NULL ;
    static IBaseFilter*  g_pMux  = NULL ;
    static IVideoWindow*  g_pVidWin = NULL ;
    static ICaptureGraphBuilder2* g_pBuilder = NULL ;
    
    HRESULT
    HozonAndHyoji (HWND hWnd)
    {
     //まず最初に、CoInitialize を呼び出して COM ライブラリを初期化する。
     HRESULT    hr   = E_FAIL ;
     ICreateDevEnum*   pDevEnum = NULL ;
     IEnumMoniker*   pClassEnum = NULL ;
     ULONG    cFetched;
     IMoniker*   pMoniker = NULL ;
     IBaseFilter*   pSrc  = NULL ;
     REFERENCE_TIME   rtStart  = 20000000 ;
     REFERENCE_TIME   rtStop  = 50000000 ;
     RECT     grc ;
    
     hr =  CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&g_pGraph) ;
     if (SUCCEEDED (hr)) {
      // Capture Graph Builder を作成する。
      hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void **)&g_pBuilder);
      if (SUCCEEDED(hr)) {
       g_pBuilder->SetFiltergraph (g_pGraph) ;
      }
     }
    
     // システム デバイス列挙子を作成する。
     hr = CoCreateInstance (CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, IID_ICreateDevEnum, (void **)&pDevEnum);
     if (FAILED (hr)) {
      OutputDebugString (TEXT ("CoCreateInstance (CLSID_SystemDeviceEnum) failed.\n")) ;
      goto exit_return ;
     }
    
     // ビデオ キャプチャ デバイスの列挙子を作成する。
     hr = pDevEnum->CreateClassEnumerator (CLSID_VideoInputDeviceCategory, &pClassEnum, 0) ;
     if (FAILED (hr)) {
      OutputDebugString (TEXT ("CreateClassEnumerator (CLSID_VideoInputDeviceCategory) failed.\n")) ;
      goto exit_return ;
     }
     if (hr == S_FALSE) {
      /* Capture Device はない。*/
      goto exit_return ;
     }
    
     if (pClassEnum->Next(1, &pMoniker, &cFetched) == S_OK) {
      // 最初のモニカをフィルタ オブジェクトにバインドする。
      pMoniker->BindToObject (0, 0, IID_IBaseFilter, (void**)&pSrc) ;
      pMoniker->Release () ;
     }
     SAFE_RELEASE (pClassEnum) ;
     SAFE_RELEASE (pDevEnum) ;
    
     // pSrc は、前のコードのキャプチャ フィルタである。
     hr = g_pGraph->AddFilter (pSrc, L"Video Capture") ;
     if (FAILED (hr)) {
      OutputDebugString (TEXT ("AddFilter () failed.\n")) ;
      goto exit_return ;
     }
     // プレビュー。
     hr = g_pBuilder->RenderStream (&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pSrc, NULL, NULL) ;
     if (FAILED (hr)) {
      OutputDebugString (TEXT ("RenderStream () failed.\n")) ;
      goto exit_return ;
     }
    
     hr = g_pGraph->QueryInterface (IID_IVideoWindow, (void **)&g_pVidWin) ;
     if (FAILED (hr)) {
      OutputDebugString (TEXT ("QueryInterface (IID_IVideoWindow) failed.\n")) ;
      goto exit_return ;
     }
    
     hr = g_pVidWin->put_Owner ((OAHWND) hWnd) ;
     if (FAILED (hr)) {
      OutputDebugString (TEXT ("put_Owner () failed.\n")) ;
      goto exit_return ;
     }
     hr = g_pVidWin->put_WindowStyle (WS_CHILD | WS_CLIPSIBLINGS) ;
     if (FAILED (hr)) {
      OutputDebugString (TEXT ("put_WindowStyle () failed.\n")) ;
      goto exit_return ;
     }
    
     GetClientRect (hWnd, &grc) ;
     hr = g_pVidWin->SetWindowPosition(0, 0, grc.right, grc.bottom);            
     if (FAILED (hr)) {
      OutputDebugString (TEXT ("SetWindowPosition () failed.\n")) ;
      goto exit_return ;
     }
     hr = g_pBuilder->SetOutputFileName(
       &MEDIASUBTYPE_Avi,  // ターゲット ファイルの AVI を指定する。
       L"c:\\TMP\\Example.avi", // ファイル名。
       &g_pMux,   // Mux へのポインタを受け取る。
       NULL
      );     // (省略可能) ファイル シンクへのポインタを受け取る。
     if (FAILED (hr)) {
      OutputDebugString (TEXT ("SetOutputFileName () failed.\n")) ;
      goto exit_return ;
     }
    
     hr = g_pBuilder->RenderStream(
       &PIN_CATEGORY_CAPTURE,  // ピン カテゴリ。
       &MEDIATYPE_Video,  // メディア タイプ。
       pSrc,    // キャプチャ フィルタ。
       NULL,    // 中間フィルタ (省略可能)。
       g_pMux) ;   // Mux フィルタまたはファイル シンク フィルタ。
     if (FAILED (hr)) {
      OutputDebugString (TEXT ("RenderStream () failed.\n")) ;
      goto exit_return ;
     }
    
     hr = g_pGraph->QueryInterface(IID_IMediaControl, (void **)&g_pControl) ;
     if (FAILED (hr)) {
      OutputDebugString (TEXT ("QueryInterface (IID_IMediaControl) failed.\n")) ;
      goto exit_return ;
     }
    
     hr = g_pControl->Run () ;
    exit_return:
     SAFE_RELEASE (pClassEnum) ;
     SAFE_RELEASE (pDevEnum) ;
     if (FAILED (hr)) {
      SAFE_RELEASE (g_pVidWin) ;
      SAFE_RELEASE (g_pControl) ;
      SAFE_RELEASE (g_pMux) ;
      SAFE_RELEASE (g_pBuilder) ;
      SAFE_RELEASE (g_pGraph) ;
     }
     return hr ;
    }
    
    void
    StopHozonAndHyouji (HWND hWnd)
    {
     HRESULT hr ;
     
     if (g_pControl != NULL) {
      hr = g_pControl->StopWhenReady () ;
     }
     SAFE_RELEASE (g_pVidWin) ;
     SAFE_RELEASE (g_pControl) ;
     SAFE_RELEASE (g_pMux) ;
     SAFE_RELEASE (g_pBuilder) ;
     SAFE_RELEASE (g_pGraph) ;
     return ;
    }
     

    このコードで手元の環境 WindowsXP SP2 + Visual Studio 2005 で試すと、Windows Media Player で再生できる avi ができているように見えます。

     

    2006年10月6日 8:02

すべての返信

  • http://www2s.biglobe.ne.jp/~yukio_s/sunday/cap.htm

    上記のリンクのコードを書いて見たのですがうまくAVIの

    ファイルが動作いたしませんアドバイスお願いいたします。

    2006年10月5日 14:41
  • 外しているかもしれませんが、IMediaControl::Run() で Render を開始した後に、IMediaControl::StopWhenReady () を使ってきちんと停止させていますか?

    下のコードは URL の先にあるサンプルをいじったものですが、HozonAndHyoji を capture 開始時に、StopHozonAndHyouji を capture 終了時に呼び出すようにしています。グローバル変数に置いているものは、必要最小限というわけではない(取り敢えずあると良さそうなのを取り出しただけ)ですので、無駄があるかもしれません。 

    static IGraphBuilder*  g_pGraph = NULL ;
    static IMediaControl*  g_pControl = NULL ;
    static IBaseFilter*  g_pMux  = NULL ;
    static IVideoWindow*  g_pVidWin = NULL ;
    static ICaptureGraphBuilder2* g_pBuilder = NULL ;
    
    HRESULT
    HozonAndHyoji (HWND hWnd)
    {
     //まず最初に、CoInitialize を呼び出して COM ライブラリを初期化する。
     HRESULT    hr   = E_FAIL ;
     ICreateDevEnum*   pDevEnum = NULL ;
     IEnumMoniker*   pClassEnum = NULL ;
     ULONG    cFetched;
     IMoniker*   pMoniker = NULL ;
     IBaseFilter*   pSrc  = NULL ;
     REFERENCE_TIME   rtStart  = 20000000 ;
     REFERENCE_TIME   rtStop  = 50000000 ;
     RECT     grc ;
    
     hr =  CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&g_pGraph) ;
     if (SUCCEEDED (hr)) {
      // Capture Graph Builder を作成する。
      hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void **)&g_pBuilder);
      if (SUCCEEDED(hr)) {
       g_pBuilder->SetFiltergraph (g_pGraph) ;
      }
     }
    
     // システム デバイス列挙子を作成する。
     hr = CoCreateInstance (CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, IID_ICreateDevEnum, (void **)&pDevEnum);
     if (FAILED (hr)) {
      OutputDebugString (TEXT ("CoCreateInstance (CLSID_SystemDeviceEnum) failed.\n")) ;
      goto exit_return ;
     }
    
     // ビデオ キャプチャ デバイスの列挙子を作成する。
     hr = pDevEnum->CreateClassEnumerator (CLSID_VideoInputDeviceCategory, &pClassEnum, 0) ;
     if (FAILED (hr)) {
      OutputDebugString (TEXT ("CreateClassEnumerator (CLSID_VideoInputDeviceCategory) failed.\n")) ;
      goto exit_return ;
     }
     if (hr == S_FALSE) {
      /* Capture Device はない。*/
      goto exit_return ;
     }
    
     if (pClassEnum->Next(1, &pMoniker, &cFetched) == S_OK) {
      // 最初のモニカをフィルタ オブジェクトにバインドする。
      pMoniker->BindToObject (0, 0, IID_IBaseFilter, (void**)&pSrc) ;
      pMoniker->Release () ;
     }
     SAFE_RELEASE (pClassEnum) ;
     SAFE_RELEASE (pDevEnum) ;
    
     // pSrc は、前のコードのキャプチャ フィルタである。
     hr = g_pGraph->AddFilter (pSrc, L"Video Capture") ;
     if (FAILED (hr)) {
      OutputDebugString (TEXT ("AddFilter () failed.\n")) ;
      goto exit_return ;
     }
     // プレビュー。
     hr = g_pBuilder->RenderStream (&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pSrc, NULL, NULL) ;
     if (FAILED (hr)) {
      OutputDebugString (TEXT ("RenderStream () failed.\n")) ;
      goto exit_return ;
     }
    
     hr = g_pGraph->QueryInterface (IID_IVideoWindow, (void **)&g_pVidWin) ;
     if (FAILED (hr)) {
      OutputDebugString (TEXT ("QueryInterface (IID_IVideoWindow) failed.\n")) ;
      goto exit_return ;
     }
    
     hr = g_pVidWin->put_Owner ((OAHWND) hWnd) ;
     if (FAILED (hr)) {
      OutputDebugString (TEXT ("put_Owner () failed.\n")) ;
      goto exit_return ;
     }
     hr = g_pVidWin->put_WindowStyle (WS_CHILD | WS_CLIPSIBLINGS) ;
     if (FAILED (hr)) {
      OutputDebugString (TEXT ("put_WindowStyle () failed.\n")) ;
      goto exit_return ;
     }
    
     GetClientRect (hWnd, &grc) ;
     hr = g_pVidWin->SetWindowPosition(0, 0, grc.right, grc.bottom);            
     if (FAILED (hr)) {
      OutputDebugString (TEXT ("SetWindowPosition () failed.\n")) ;
      goto exit_return ;
     }
     hr = g_pBuilder->SetOutputFileName(
       &MEDIASUBTYPE_Avi,  // ターゲット ファイルの AVI を指定する。
       L"c:\\TMP\\Example.avi", // ファイル名。
       &g_pMux,   // Mux へのポインタを受け取る。
       NULL
      );     // (省略可能) ファイル シンクへのポインタを受け取る。
     if (FAILED (hr)) {
      OutputDebugString (TEXT ("SetOutputFileName () failed.\n")) ;
      goto exit_return ;
     }
    
     hr = g_pBuilder->RenderStream(
       &PIN_CATEGORY_CAPTURE,  // ピン カテゴリ。
       &MEDIATYPE_Video,  // メディア タイプ。
       pSrc,    // キャプチャ フィルタ。
       NULL,    // 中間フィルタ (省略可能)。
       g_pMux) ;   // Mux フィルタまたはファイル シンク フィルタ。
     if (FAILED (hr)) {
      OutputDebugString (TEXT ("RenderStream () failed.\n")) ;
      goto exit_return ;
     }
    
     hr = g_pGraph->QueryInterface(IID_IMediaControl, (void **)&g_pControl) ;
     if (FAILED (hr)) {
      OutputDebugString (TEXT ("QueryInterface (IID_IMediaControl) failed.\n")) ;
      goto exit_return ;
     }
    
     hr = g_pControl->Run () ;
    exit_return:
     SAFE_RELEASE (pClassEnum) ;
     SAFE_RELEASE (pDevEnum) ;
     if (FAILED (hr)) {
      SAFE_RELEASE (g_pVidWin) ;
      SAFE_RELEASE (g_pControl) ;
      SAFE_RELEASE (g_pMux) ;
      SAFE_RELEASE (g_pBuilder) ;
      SAFE_RELEASE (g_pGraph) ;
     }
     return hr ;
    }
    
    void
    StopHozonAndHyouji (HWND hWnd)
    {
     HRESULT hr ;
     
     if (g_pControl != NULL) {
      hr = g_pControl->StopWhenReady () ;
     }
     SAFE_RELEASE (g_pVidWin) ;
     SAFE_RELEASE (g_pControl) ;
     SAFE_RELEASE (g_pMux) ;
     SAFE_RELEASE (g_pBuilder) ;
     SAFE_RELEASE (g_pGraph) ;
     return ;
    }
     

    このコードで手元の環境 WindowsXP SP2 + Visual Studio 2005 で試すと、Windows Media Player で再生できる avi ができているように見えます。

     

    2006年10月6日 8:02
  • ご返事ありがとうございます。

    少し頑張ってみます。

    2006年10月10日 11:57