我应该为RTSP客户端创建一个新线程还是仅使用Media Foundation中的自定义IMFMediaSource
我正在编写一个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
如果我WRI在我的自定义媒体源对象中使用我的RTSP代码,它是否能够在自己的线程中充分运行,并使用阻止“recv”网络调用来接收摄像机流数据?或者COM对象不是一个可以处理这种类型的任务的独立线程?阻止“recv”调用和阻止COM工作队列之间是否存在潜在的冲突?
或者我应该使用“CreateThread”创建一个新线程来处理所有的RTSP细节并将摄像机流数据转发给媒体源对象?
任何意见指向我在正确的方向将是伟大的!
实现你的媒体来源,并实现内部:
- 的CreateThread当你的媒体源“开始”:https://msdn.microsoft.com/en-us/library/windows/desktop/ms700134(v=vs.85).aspx#starting
- 使用阻塞的recv(或者你可以实现更多的东西一样IOCP线程复杂)内你的线程从点1
- 队列当请求新的样品通过的recv
- 交付对应的帧(该队列的顶部)而获得的每个RTSP帧:https://msdn.microsoft.com/en-us/library/windows/desktop/ms700134(v=vs.85).aspx#source_data
如果需要还可以引入GAP,或者如果没有获得足够的数据,则重复上次的样本。
Media Foundation通过其设计建议您实现异步处理。有工作队列,事件生成器,启动/停止和其他操作预计将被启动,并且不会与通知/事件异步完成阻塞。
按照这种设计,你不需要太多的线程。媒体基金会建议您改用其工作队列,根据需要实施线程池。
但是,这并不意味着你不能使用线程。在实现Media Foundation源代码必需的接口/方法时,必须实现异步模式,但如果您更喜欢在单独的工作线程上执行实际工作(这在很多情况下会导致更简单的代码),那就可以了。
谢谢罗马R! –
谢谢你的指导!我将按照您所描述的执行此操作。 –