c++ - DirectShow 困境 - 无法录制

标签 c++ windows device directshow record

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

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);

代码,同上。

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

最佳答案

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

您的进一步步骤是沿着以下两者中的任何一个:

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

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

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

关于c++ - DirectShow 困境 - 无法录制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17020251/

相关文章:

c++ - Win32 应用程序在最小化窗口动画时挂起

windows - Docker镜像命令未返回所有镜像

windows - 批处理以列出不包含特定文件的文件夹

android - 无法打开日志设备 '/dev/log/main' : No such file or directory on my Nexus 4

c++ - (Qt) 尝试在我的 MainWindow 上使用来自另一个小部件类的任何函数时读取访问错误

c++ - 网格内一列中的项目数

C++——DirectWrite : Load font from file at runtime

c++ - 如何在数据以二进制零结尾时初始化 std::string

java - Android 蓝牙设备选择器使用

iphone - xcode 3.2.4(sdk 4.1)无法安装到设备