首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是为RTSP客户端创建一个新线程,还是只使用媒体基础中的自定义IMFMediaSource?

是为RTSP客户端创建一个新线程,还是只使用媒体基础中的自定义IMFMediaSource?
EN

Stack Overflow用户
提问于 2017-07-25 15:46:03
回答 2查看 531关注 0票数 2

我正在编写一个RTSP客户端,并使用Media Foundation将多个IP摄像机视频提要流到Windows显示器。我知道内置的MF不能很好地处理IP摄像机,所以我必须编写一个定制的媒体源:

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

另外,下面的文章给出了一些有用的技巧,但没有给出太多的实现细节:

利用媒体基金会: 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捕获H 264/AAC流

如果我在自定义Media Source对象中编写RTSP代码,它是否能够在它自己的线程中充分运行,并使用阻塞的"recv“网络调用来接收相机流数据?还是COM对象实际上不是一个可以处理此类任务的单独线程?阻塞"recv“调用与阻塞COM的工作队列之间是否存在潜在的冲突?

还是应该使用"CreateThread“创建一个新线程来处理所有的RTSP细节并将相机流数据转发给Media对象?

任何给我正确方向的建议都是很棒的!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-25 18:37:01

实现您的媒体源,并在实现中:

  1. 媒体源“启动”时的CreateThread:https://msdn.microsoft.com/en-us/library/windows/desktop/ms700134(v=vs.85).aspx#starting
  2. 从第1点开始,在线程内部使用阻塞recv (或者您可以实现一些更复杂的东西,比如IOCP线程)。
  3. 将由recv获得的每个RTSP帧排队
  4. 请求新示例时传递相应的帧(队列顶部):data

如果需要,您也可以引入GAP,如果没有获得足够的数据,也可以重复最后一个示例。

票数 1
EN

Stack Overflow用户

发布于 2017-07-26 21:03:01

按其设计,媒体基金会建议您异步实现处理。有工作队列、事件生成器、start/stop等操作将被启动,并且不会通过通知/事件异步完成。

按照这个设计,您不需要太多的线程。建议您使用它的工作队列,该队列根据需要实现线程池。

但是,这并不意味着您不能使用线程。当您对Media Foundation源代码强制实现接口/方法时,您将不得不实现异步模式,但如果您更愿意在单独的工作线程上执行实际工作(在许多情况下,这会导致更简单的代码),则可以。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45308037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档