2016-09-10 29 views
2

を起こりません、私はビデオに画面と音声をキャプチャすることができ、自分のアプリケーションを作成するには、Windowsのdevの中央上のDirectShow例フォロースルーしようとしています:Capturing Video to an AVI FileのDirectShowキャプチャ、何も

すべてのコードは大丈夫行くが、何も起こりません、aviファイルが表示されていません。ウェブカムが接続されています。私はAMCapでストリームを見ることができます。コード内で、正しい名前のcamが表示されています。 Windows SDKがインストールされ、私のプラットフォームはwin7 x64です。

マイコード:

#include "stdafx.h" 
#include <iostream> 

#include <windows.h> 
#include <dshow.h> 

#pragma comment(lib, "strmiids") 

HRESULT EnumerateDevices(REFGUID category, IEnumMoniker **ppEnum) 
{ 
    // Create the System Device Enumerator. 
    ICreateDevEnum *pDevEnum; 
    HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, 
     CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pDevEnum)); 

    if (SUCCEEDED(hr)) 
    { 
     // Create an enumerator for the category. 
     hr = pDevEnum->CreateClassEnumerator(category, ppEnum, 0); 
     if (hr == S_FALSE) 
     { 
      hr = VFW_E_NOT_FOUND; // The category is empty. Treat as an error. 
     } 
     pDevEnum->Release(); 
    } 
    return hr; 
} 

HRESULT InitCaptureGraphBuilder(
    IGraphBuilder **ppGraph, // Receives the pointer. 
    ICaptureGraphBuilder2 **ppBuild // Receives the pointer. 
) 
{ 
    if (!ppGraph || !ppBuild) 
    { 
     return E_POINTER; 
    } 
    IGraphBuilder *pGraph = NULL; 
    ICaptureGraphBuilder2 *pBuild = NULL; 

    // Create the Capture Graph Builder. 
    HRESULT hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, 
     CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void**)&pBuild); 
    if (SUCCEEDED(hr)) 
    { 
     // Create the Filter Graph Manager. 
     hr = CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC_SERVER, 
      IID_IGraphBuilder, (void**)&pGraph); 
     if (SUCCEEDED(hr)) 
     { 
      // Initialize the Capture Graph Builder. 
      pBuild->SetFiltergraph(pGraph); 

      // Return both interface pointers to the caller. 
      *ppBuild = pBuild; 
      *ppGraph = pGraph; // The caller must release both interfaces. 
      return S_OK; 
     } 
     else 
     { 
      pBuild->Release(); 
     } 
    } 
    return hr; // Failed 
} 

void DisplayDeviceInformation(IEnumMoniker *pEnum) 
{ 
    IMoniker *pMoniker = NULL; 

    while (pEnum->Next(1, &pMoniker, NULL) == S_OK) 
    { 
     IPropertyBag *pPropBag; 
     HRESULT hr = pMoniker->BindToStorage(0, 0, IID_PPV_ARGS(&pPropBag)); 
     if (FAILED(hr)) 
     { 
      pMoniker->Release(); 
      continue; 
     } 

     VARIANT var; 
     VariantInit(&var); 

     hr = pPropBag->Read(L"DevicePath", &var, 0); 
     if (SUCCEEDED(hr)) 
     { 
      // The device path is not intended for display. 
      printf("Device path: %S\n", var.bstrVal); 
      VariantClear(&var); 
     } 

     IGraphBuilder *ppGraph; 
     ICaptureGraphBuilder2 *pBuild; // Capture Graph Builder 
     hr = InitCaptureGraphBuilder(&ppGraph, &pBuild); 


     IBaseFilter *pCap; // Video capture filter. 
     hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pCap); 
     if (SUCCEEDED(hr)) 
     { 
      hr = ppGraph->AddFilter(pCap, L"Capture Filter"); 
      if (SUCCEEDED(hr)) { 
       IBaseFilter *pMux; 
       hr = pBuild->SetOutputFileName(
        &MEDIASUBTYPE_Avi, // Specifies AVI for the target file. 
        L"C:\\a\\Example.avi", // File name. 
        &pMux,    // Receives a pointer to the mux. 
        NULL);    // (Optional) Receives a pointer to the file sink. 

       hr = pBuild->RenderStream(
        &PIN_CATEGORY_CAPTURE, // Pin category. 
        &MEDIATYPE_Video,  // Media type. 
        pCap,     // Capture filter. 
        NULL,     // Intermediate filter (optional). 
        pMux);     // Mux or file sink filter. 

              // Release the mux filter. 
       pMux->Release(); 

       IConfigAviMux *pConfigMux = NULL; 
       hr = pMux->QueryInterface(IID_IConfigAviMux, (void**)&pConfigMux); 
       if (SUCCEEDED(hr)) 
       { 
        pConfigMux->SetMasterStream(0); 
        pConfigMux->Release(); 
       } 

       IConfigInterleaving *pInterleave = NULL; 
       hr = pMux->QueryInterface(IID_IConfigInterleaving, (void**)&pInterleave); 
       if (SUCCEEDED(hr)) 
       { 
        pInterleave->put_Mode(INTERLEAVE_CAPTURE); 
        pInterleave->Release(); 
       } 

      } 
     } 

     pPropBag->Release(); 
     pMoniker->Release(); 
    } 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); 
    if (SUCCEEDED(hr)) 
    { 
     IEnumMoniker *pEnum; 

     hr = EnumerateDevices(CLSID_VideoInputDeviceCategory, &pEnum); 
     if (SUCCEEDED(hr)) 
     { 
      DisplayDeviceInformation(pEnum); 
      pEnum->Release(); 
     } 
     CoUninitialize(); 
    } 

    int i; 
    std::cin >> i; 
    return 0; 
} 

答えて

2

あなたのコードは、デバイス(ソース)を列挙し、その後、すべてのものを削除し、次のデバイスに進み、パイプラインを記録したファイルを構築します。

コードは実際の録音を行うものではありません。

最小限の不足している部分は、この(あなたのDisplayDeviceInformationの下)です:

IConfigInterleaving *pInterleave = NULL; 
    hr = pMux->QueryInterface(IID_IConfigInterleaving, (void**)&pInterleave); 
    if (SUCCEEDED(hr)) 
    { 
     pInterleave->put_Mode(INTERLEAVE_CAPTURE); 
     pInterleave->Release(); 
    } 

    /////////////////////////////////////////////////// 
    // Added 
    IMediaControl* pMediaControl; 
    ppGraph->QueryInterface(&pMediaControl); 
    pMediaControl->Run(); 
    Sleep(5000); 
    pMediaControl->Stop(); 
    /////////////////////////////////////////////////// 

    pPropBag->Release(); 
    pMoniker->Release(); 
+0

はい、それがあることをことを、私は記録を開始部分が欠落していることをfinkingたが、カントは、ドキュメントでそれを発見しました。 P.S. СпасибобольшоеРоман – novox

+0

あなたはようこそ。この録画では、生のビデオをAVIに書き込んでいるので、次のステップでもっと大きな問題に直面するでしょう。あなたはビデオコンプレッサーを付けたいと思うかもしれません。そして、裸のWindowsはDirectShow経由で良いものを提供しないという悲しい話です。あなたは最終的にそれを並べ替えるでしょうが、初めは本当に不愉快な混乱のように見えるかもしれません。 –

関連する問題