C ++ DirectShow视频和音频捕获 - 开始

时间:2011-08-08 13:57:58

标签: c++ directx directshow webcam

在应用程序开发过程中遇到的几个问题之后,我终于设法放弃了使用VFW。

感谢StackOverflow,我现在知道VFW已经过时,希望切换到DShow,让我的应用程序与Vista / W7一起使用。

不幸的是,已经完成了工作并且已经将应用程序发送给客户端,但是一旦我们意识到我们在Vista / W7上遇到帧速率问题 - 我们决定重写视频类并使用DirectShow来建立一个好的用于webcameras的音频/视频捕获引擎。

这将是棘手的,因为我们从未用DShow编码,现在我们正在寻找如何的几个具体示例:

  • 连接到选定的webcamera

    类似于:capDriverConnect

  • 将相机分辨率设置为640x480和RGB24格式(我们需要为每帧RGB24到YUV420)

    类似于:capSetVideoFormat / capCaptureSetSetup

  • 为此webcamera设置音频捕获

    类似于:capSetAudioFormat

  • 注册两个回调:

    • 一个用于视频帧(我们将帧传递给视频编码器)

    类似于:capSetCallbackOnVideoStream

    • 一个用于波形缓冲区(我们将波形缓冲区传递给音频编码器)

    类似于:capSetCallbackOnWaveStream

  • 能够在父窗口的某处显示预览窗口

    类似于:capPreview

  • 在需要时执行开始/停止操作

    • 开始 - 意味着,连接并开始捕获音频/视频帧
    • 断开 - 意味着,停止捕获音频视频帧
  • 执行绘图到实际框架

    类似于:

    SetBitmapBits(CameraInput.GetFrameBitmap(),W * H * 3,vdhdr->的lpData); //用gdi +绘制一些东西 GetBitmapBits(CameraInput.GetFrameBitmap(),w * h * 3,vdhdr-> lpData); //用数据重新设置框架

以上所有内容都是使用VFW制作的,但正如我之前写的那样,我们不幸需要切换直接显示。

有没有人可以帮助我们完成一个可以帮助我们学习Direct Show几个月的课程?

2 个答案:

答案 0 :(得分:2)

最好的例子是the ones from Microsoft

你的问题仍然以VFW的形式表达,所以很难按照书面回答。例如,在DirectShow中,您不会注册用于编码视频帧的回调。相反,您将开发一个编码器过滤器,它将从捕获源接收数据。

作为替代方案,如果您仅定位Vista及更高版本,则会the Microsoft Media Foundation。我没有经验,所以我不知道学习曲线与DirectShow的比较。

答案 1 :(得分:0)

我建议您在GraphEdit using FFDshow filters上构建图表。

EditGraph正在演示如何在DirectShow上构建图形

我认为您不需要自己构建过滤器类。在您构建图表后,您将能够使用GraphEdit观看视频。实现图表是a very simple task