流产的加载RTSP, ONVIF和UDP源过滤器

问题的描述:

铅RTSP源,铅ONVIF源,铅MPEG2传输UDP来源过滤器将长时间聆听流加载或运行时传入的数据。默认情况下,应用程序将不会处理消息在这段时间里,几乎冻结。根据滤波器,应用程序将被冻结,当你试图加载或运行流程,如下:

冻结会发生如果数据没有到达(例如,如果您连接到的服务器宕掉或无法及时响应)。如果数据到达时,没有问题和负载/运行过程迅速完成。避免阻塞的主要用户界面线程很长一段时间,你有两个选择:

  1. 在另一个线程执行负载/运行操作
  2. 使用回调机制实现这些过滤器没有数据到达时接收通知。在这些通知,可以中止等待或解冻程序处理窗口消息。如果你处理窗口消息,你需要小心避免re-entrancy问题。

UDP源将为输入数据监听16秒当你试图加载流。如果没有在这段时间,负载将会失败。你可以改变超时的值使用中所描述的“超时”参数UDP源URL语法

RTSP源ONVIF源第16 - 25将侦听秒运行时传入的音频和视频数据流。漫长的等待最常见的原因是等待时,不会让它通过UDP数据包你玩的RTSP服务器在本地网络。

如果你使用LEADTOOLS多媒体的播放和转换模块,“加载流”是指将源文件的属性设置。188宝金博怎么下载的时候调用设置源文件属性返回时,负载会成功(如果数据接收)或失败(如果数据没有收到)。

如果你使用LEADTOOLS多媒体的播放和转换模块,“运行流”意味着调用188宝金博怎么下载IltmmPlay:运行,IltmmConvert: RunConvertIltmmConvert: StartConvert(或. net的同龄人,Leadtools.188宝金博怎么下载Multimedia.PlayCtrl.Run,Leadtools.188宝金博怎么下载Multimedia.ConvertCtrl.RunConvertLeadtools.188宝金博怎么下载Multimedia.ConvertCtrl.StartConvert)。

描述的解决方案:

解决这个问题有两种方法:一个高级和低级的方式:

使用低级的解决方案和实现ILMSrcCallback通知只在以下情况:

如果您使用或转换模块和负载流使用IltmmPlay: put_SourceFile或IltmmConvert:: put_SourceFile,您可以使用高级解决方案,不需要使用的接口。每当你从铅UDP,加载一个URL RTSP或ONVIF源过滤器,LEADTOOLS自动创建一个内部对象实现ILMSrcCallback接口和源过滤器通过设置寄存器ILMUDPSrc: SourceObject,ILMRTSPSrc: SourceObject,或ILMONVIFSrc: SourceObject这个内部对象属性。每当接收到的内部对象EVENTTYPE_NODATAAVAILABLE通知,它发送一个ltmmPlay_Notify_MediaEvent事件通知窗口(这是一个应用程序窗口创建)。事件包含ltmmEC_LOADSTATUS事件和lParam1被设置为ltmmAM_LOADSTATUS_WAITING_FOR_DATA。lParam2被设置为的时间(以毫秒为单位),运行自UDP, RTSP或ONVIF开始等待数据来源。

注意,为了避免re-entrancy问题,只有下列方法时应该被称为过程这个ltmmPlay_Notify_MediaEvent事件(其他方法可能不会像预期的那样工作,如果他们被称为在处理这个事件通知):

这个场景的伪代码是这样的游戏对象(我们称之为m_player):

  1. 创建一个窗口,将听通知(hwndNotify)。让我们假设这个窗口的窗口过程CMainFrame:: OnPlayerNotify如下

  2. 告诉玩家使用这个通知窗口:m_player - > SetNotifyWindow((长)m_hWnd WM_PLAYERNOTIFY);

  3. 启动负载(例如,30秒超时):m_player - > put_SourceFile (L“udp: / / 127.0.0.1:9005 ?超时= 30”);

  4. 负载会成功(如果UDP源接收数据)或失败(如果在30秒内没有接收到数据或者你取消等通过调用m_player - > ResetSource)

如果UDP源不接收任何数据,通知窗口将被称为每秒钟而执行步骤3,将调用CMainFrame:: OnPlayerNotify。下面的实现向您展示如何取消20秒后负载:

LRESULT CMainFrame:: OnPlayerNotify(按钮按钮,LPARAM LPARAM){如果(按钮= = ltmmPlay_Notify_MediaEvent){lParam ltmmMediaEvent * pEventParams = (ltmmMediaEvent *);如果(pEventParams & & pEventParams - > lEventCode = = ltmmEC_LOADSTATUS)如果(pEventParams - > lParam1 = = ltmmAM_LOADSTATUS_WAITING_FOR_DATA){如果(pEventParams - > lParam2 > = 20000)m_player - > ResetSource ();/ *中止负载如果这需要超过20秒* /}}返回0;}

这看起来可能不简单但这是为什么你需要这样做:UDP源不会被创建并添加到直到你叫put_SourceFile图。所以你不能得到UDP源过滤器接口调用put_SourceFile之前。put_SourceFile返回后,你不能得到通知,因为那时为时已晚接收UDP消息通知。有两种情况:

  1. 如果UDP源接收数据,图表,put_SourceFile成功并返回。你现在可以获得UDP源接口,但为时已晚接收通知(自装载过程结束)。

  2. 如果UDP源不接收任何数据,它将发送EVENTTYPE_NODATAAVAILABLE通知的ILMSrcCallback。但是你不能获得UDP源设置回调接口put_SourceFile以来还没有返回。您可以创建另一个线程同时put_SourceFile正在运行,得到源对象,查询它ILMUDPSrc界面,设置回调,等等。但是为什么去这一切麻烦,当你可以听ltmmEC_LOADSTATUS事件吗?

RTSP源过滤器的情况略有不同,因为发生的最大等待当你尝试运行图表而不是在负载。所以你可以加载流,获取ILMRTSPSrc界面和设置ILMSrcCallback之前运行图表。但仍然,更容易听ltmmEC_LOADSTATUS事件。

你可以看到一个窗口通知实现c++球员和mpeg - 2传输演示。188金宝搏beat体育官网注意,演示这些事件监听,但忽略了它们。你可以搜索在源代码中ltmmAM_LOADSTATUS_WAITING_FOR_DATA和添加自己的取消代码快速看到这是如何工作的。

LEADTOOLS过滤器C API的帮助
188金宝搏的网址客服|支持|联系我们|知识产权的通知
©1991 - 2021领先的技术公司。保留所有权利。