none
關於Directshow最基礎問題 RRS feed

  • 問題

  •  

    我的開發環境

     

    Visual studio 2005

     

    project是 vc++ smart device的MFC Application

     

    需求是想在模擬的手機上RUN一支叫clock.avi的小影片

     

    在模擬手機我放了clock.avi這個影片

     

    程式如下:

     

    ------------------------------------------------------------------------------------------------------------------------------------------------------------

    IGraphBuilder *pGraph;
    IMediaControl *pMediaControl;
     HRESULT hr = CoInitialize(NULL);

    CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC , IID_IGraphBuilder, (void **)&pGraph);

    hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pMediaControl);

    hr = pGraph->RenderFile(L"\\clock.avi", NULL);

    hr = pMediaControl->Run();
        

        pMediaControl->Release();
        pGraph->Release();
        CoUninitialize();

    -----------------------------------------------------------------------------------------------------------------------------------------------------------

     

    其中.h檔與lib檔都有在project作好正確設定了

     

    但run下去,完全都沒有反應...至少也給我一個bug吧....

     

    查了一整天,都不知道所以然.....= =

     

    超累的

     

    根據MSDN:

     

    http://msdn2.microsoft.com/en-us/library/aa929447.aspx

    2007年12月5日 下午 12:05

解答


  • 程式碼區塊


    IGraphBuilder *pGraph;
    IMediaControl *pMediaControl;


    IMediaEvent   *pEvent = NULL;


     HRESULT hr = CoInitialize(NULL);

    CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC , IID_IGraphBuilder, (void **)&pGraph);


    hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pMediaControl);

    hr= pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);

    hr = pGraph->RenderFile(L"\\clock.avi", NULL);

    hr = pMediaControl->Run();
        

      

      //當filter graph運行時,數據經過各個filter最後回放為視頻或音頻。
      //播
    放發生在一個單獨的線程中。你可以透過 呼叫 IMediaEvent::WaitForCompletion方法
      //來等候播放的結束:

          long evCode = 0;
        pEvent->WaitForCompletion(INFINITE, &evCode);



        pMediaControl->Release();

       pEvent->Release();

        pGraph->Release();
        CoUninitialize();





    2007年12月5日 下午 02:22

所有回覆


  • 程式碼區塊


    IGraphBuilder *pGraph;
    IMediaControl *pMediaControl;


    IMediaEvent   *pEvent = NULL;


     HRESULT hr = CoInitialize(NULL);

    CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC , IID_IGraphBuilder, (void **)&pGraph);


    hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pMediaControl);

    hr= pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);

    hr = pGraph->RenderFile(L"\\clock.avi", NULL);

    hr = pMediaControl->Run();
        

      

      //當filter graph運行時,數據經過各個filter最後回放為視頻或音頻。
      //播
    放發生在一個單獨的線程中。你可以透過 呼叫 IMediaEvent::WaitForCompletion方法
      //來等候播放的結束:

          long evCode = 0;
        pEvent->WaitForCompletion(INFINITE, &evCode);



        pMediaControl->Release();

       pEvent->Release();

        pGraph->Release();
        CoUninitialize();





    2007年12月5日 下午 02:22
  • 謝謝你的回應

     

    我新增了紅色的code

     

    但還是一樣...沒反應

     

    如果程式沒錯的話

     

    會不會是設定的問題呢?

    2007年12月6日 上午 12:53
  •  

    我用hr來抓event的結果

     

    一直跑到pMediaControl->Run()這行

     

    hr顯示為-2147220970

     

    好怪的數值,我在網路上看到錯誤訊息都是

     

    回傳E_FAIL或是其它類

     

    我是卡到陰嗎......

    2007年12月6日 上午 02:45
  • hr=pMediaControl->Run();

    if (FAILED(hr))    ShowError(hr);

     

    顯示錯誤訊息

    程式碼區塊
    void ShowError(HRESULT hr){ 
       if (FAILED(hr))    {     
          TCHAR szErr[MAX_ERROR_TEXT_LEN];      
          DWORD res = AMGetErrorText(hr, szErr, MAX_ERROR_TEXT_LEN);      
         if (res == 0)        
               wsprintf(szErr, "Unknown Error: 0x%2x", hr);       
         MessageBox(0, szErr, TEXT("Error!"), MB_OK | MB_ICONERROR);    
      }
    }

     

     

    2007年12月6日 上午 03:17
  •  

    可以了

     

    原來是要丟到真的device上執行

     

    用模擬的方式是不行的....

    2007年12月6日 上午 05:13