【问题标题】:DirectShow dilemma - Not able to recordDirectShow 困境 - 无法录制
【发布时间】:2013-06-10 09:00:57
【问题描述】:

这是实际的主要代码,预览效果很好:

int main()
{
   HRESULT hr = CoInitialize(NULL);

   ICaptureGraphBuilder2   *pBuild;
   IGraphBuilder           *pGraph;
   IMoniker                *pMoniker;
   IMediaControl           *pControl;
   IMediaEvent             *pEvent;

   InitCaptureGraphBuilder(&pGraph, &pBuild);

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

   IBaseFilter    *pCap;   // Video capture filter
   IEnumMoniker   *pEnum;

   hr = EnumerateDevices(CLSID_VideoInputDeviceCategory, &pEnum);
   DisplayDeviceInformation(pEnum, &pMoniker);
   hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pCap);

   if (SUCCEEDED(hr))
   {
      hr = pGraph->AddFilter(pCap, L"Capture Filter");
   }

   hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap, NULL, NULL);
   hr = pControl->Run();

   _getch();

   pControl->Release();
   pCap->Release();
   pGraph->Release();
   pBuild->Release();
   CoUninitialize();

   return 0;
}

现在,我知道要录制,我需要这段代码:

IBaseFilter *pMux;

hr = pBuild->SetOutputFileName(&MEDIASUBTYPE_Avi, L"D:\\test.avi", &pMux, NULL);
hr = pBuild->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, pCap, NULL, pMux);

如果我将其替换为预览代码,它实际上会创建 AVI 文件(一个非常大的文件),但它是空的,没有视频。 我的意思是我正在更换:

hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap, NULL, NULL);

代码,上面那个。

我做错了什么,或者更好的是,我错过了什么?

【问题讨论】:

    标签: c++ windows device directshow record


    【解决方案1】:

    RenderStream 是一种高级方法,它通过公共记录的 API 在内部嵌入其他调用,通常是为了易于使用。虽然它看起来很简单,但如果某些东西无法正常工作且无法按预期进行,则要排除故障并不容易。更难说只是视觉检查代码。它也不是最有效的,因为您可以自己做一些事情来更接近解决方案,即:

    您的进一步步骤是沿着这两个步骤中的任何一个:

    1. 您获取工作示例代码并与您的代码进行比较,查看差异并找出问题的根源。

    2. 您检查生成的过滤器图拓扑,将您的图放到ROT,并使用GraphEdit 或类似工具进行检查,以确保拓扑符合您的期望。

    您当然还需要检查HRESULT 代码,您似乎已经在做。

    【讨论】:

    • 非常感谢您提供的所有答案,最后我可以说我有一个工作程序!如果其他人问这些问题,我建议您说“看看 PlayCap 示例”,因为理解它确实比 AMCap 更容易。下一步将是视频压缩,因为 1 分钟。大约 100MB
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多