2

我正在编写一个RTSP客户端,并使用Media Foundation将多个IP摄像头视频源传输到Windows显示器。据我所知,内置MF RTSP不处理IP摄像头非常好,所以我必须写一个自定义媒体来源:我应该为RTSP客户端创建一个新线程还是仅使用Media Foundation中的自定义IMFMediaSource

编写自定义媒体来源:https://msdn.microsoft.com/en-us/library/windows/desktop/ms700134(v=vs.85).aspx

还有以下职位提供了一些有用的提示,但没有太多的实现细节:通过RTSP

捕捉H264/AAC流使用媒体基金会: https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/8f67d241-7e72-4509-b5f8-e2ba3d1a33ad/capture-h264aac-stream-via-rtsp-using-media-foundation?forum=mediafoundationdevelopment

如果我WRI在我的自定义媒体源对象中使用我的RTSP代码,它是否能够在自己的线程中充分运行,并使用阻止“recv”网络调用来接收摄像机流数据?或者COM对象不是一个可以处理这种类型的任务的独立线程?阻止“recv”调用和阻止COM工作队列之间是否存在潜在的冲突?

或者我应该使用“CreateThread”创建一个新线程来处理所有的RTSP细节并将摄像机流数据转发给媒体源对象?

任何意见指向我在正确的方向将是伟大的!

回答

1

实现你的媒体来源,并实现内部:

  1. 的CreateThread当你的媒体源“开始”:https://msdn.microsoft.com/en-us/library/windows/desktop/ms700134(v=vs.85).aspx#starting
  2. 使用阻塞的recv(或者你可以实现更多的东西一样IOCP线程复杂)内你的线程从点1
  3. 队列当请求新的样品通过的recv
  4. 交付对应的帧(该队列的顶部)而获得的每个RTSP帧:https://msdn.microsoft.com/en-us/library/windows/desktop/ms700134(v=vs.85).aspx#source_data

如果需要还可以引入GAP,或者如果没有获得足够的数据,则重复上次的样本。

+0

谢谢你的指导!我将按照您所描述的执行此操作。 –

1

Media Foundation通过其设计建议您实现异步处理。有工作队列,事件生成器,启动/停止和其他操作预计将被启动,并且不会与通知/事件异步完成阻塞。

按照这种设计,你不需要太多的线程。媒体基金会建议您改用其工作队列,根据需要实施线程池。

但是,这并不意味着你不能使用线程。在实现Media Foundation源代码必需的接口/方法时,必须实现异步模式,但如果您更喜欢在单独的工作线程上执行实际工作(这在很多情况下会导致更简单的代码),那就可以了。

+0

谢谢罗马R! –

相关问题