我应该为RTSP客户端创建新线程,还是只在Media Foundation中使用自定义IMFMediaSource

时间:2017-07-25 15:46:04

标签: windows multithreading com video-streaming ms-media-foundation

我正在编写RTSP客户端并使用Media Foundation将多个IP摄像头视频源流式传输到Windows显示器。据我所知,内置的MF RTSP无法很好地处理IP摄像机,因此我必须编写自定义媒体资源:

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

以下帖子还提供了一些有用的提示,但没有太多的实现细节:

使用Media Foundation通过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

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

或者我应该使用“CreateThread”创建一个新线程,它将处理所有RTSP细节并将摄像机流数据转发到Media Source对象?

任何指出我正确方向的建议都会很棒!

2 个答案:

答案 0 :(得分:1)

在实施中实施您的媒体资源:

  1. 当您的媒体资源被启动时,CreateThread":https://msdn.microsoft.com/en-us/library/windows/desktop/ms700134(v=vs.85).aspx#starting
  2. 从第1点开始,在你的线程中使用阻塞recv(或者你可以实现更复杂的东西,如IOCP线程)。
  3. 对通过recv
  4. 获取的每个RTSP帧进行排队
  5. 在请求新样本时提供相应的框架(队列顶部):https://msdn.microsoft.com/en-us/library/windows/desktop/ms700134(v=vs.85).aspx#source_data
  6. 如果需要,您还可以引入GAP,或者如果没有获得足够的数据,则重复上一个样本。

答案 1 :(得分:1)

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

遵循此设计,您不需要很多线程。 Media Foundation建议您使用其工作队列,根据需要实现线程池。

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