发明内容
本发明的主要目的在于提供一种支持视频插件接入的视频快速平滑显示的方法及装置,旨在实现视频的快速解码与平滑显示。
为了达到上述目的,本发明提出一种支持视频插件接入的视频快速平滑显示的方法,包括:
接收流媒体数据,并存入缓冲池;
根据预定的解码器及动态解码库文件对所述流媒体数据进行解码;
将解码后的流媒体数据显示到终端。
优选地,所述根据预定的解码器及动态解码库文件对所述流媒体数据进行解码的步骤包括:
当所述缓冲池中的流媒体数据达到预定阀值时,调取预定的解码器;
通过所述预定的解码器加载相应的动态解码库文件,对所述缓冲池中的流媒体数据进行解码;
将所述解码后的流媒体数据送入显示队列。
优选地,所述加载相应的动态解码库文件的步骤包括:
通过调用动态解码库文件相应的解码DLL中的自我描述、创建及卸载函数与所述预定的解码器进行交互。
优选地,所述流媒体数据包括:录像数据流或来自前端设备的实时数据流。
优选地,所述加载相应的动态解码库文件的步骤进一步包括:
通过调用动态解码库文件相应的解码DLL中的自我描述、创建及卸载函数与所述相应的录像协议器进行交互。
优选地,所述将解码后的流媒体数据显示到终端的步骤包括:
按照预定的时间间隔从所述显示队列中取出YUV格式数据;
将所述YUV格式数据转换为RGB格式数据;
对所述RGB格式数据进行视频叠加处理后,显示于终端预定的窗口。
本发明还提出一种支持视频插件接入的视频快速平滑显示的装置,包括:
流媒体数据接收模块,用于接收流媒体数据,并存入缓冲池;
数据解码模块,用于根据预定的解码器及动态解码库文件对所述流媒体数据进行解码;
数据显示模块,用于将解码后的流媒体数据显示到终端。
优选地,所述数据解码模块包括:
调取单元,用于当所述缓冲池中的流媒体数据达到预定阀值时,调取预定的解码器;
加载解码单元,用于通过所述预定的解码器加载相应的动态解码库文件,对所述缓冲池中的流媒体数据进行解码;
发送单元,用于将所述解码后的流媒体数据送入显示队列。
优选地,所述加载解码单元还用于通过调用动态解码库文件相应的解码DLL中的自我描述、创建及卸载函数与所述预定的解码器进行交互;或者,通过调用动态解码库文件相应的解码DLL中的自我描述、创建及卸载函数与所述相应的录像协议器进行交互。
优选地,所述数据显示模块包括:
获取单元,用于按照预定的时间间隔从所述显示队列中取出YUV格式数据;
转换单元,用于将所述YUV格式数据转换为RGB格式数据;
显示单元,用于对所述RGB格式数据进行视频叠加处理后,显示于终端预定的窗口。
本发明提出的一种支持视频插件接入的视频快速平滑显示的方法及装置,通过定义统一的视频接入规则,由各待接入厂家提供相应的动态解码库文件,当新增加一个解码器时,不需要重新编译程序与发行版本,只需增加相应的动态解码库文件,根据预定的解码器及动态解码库文件对接收并缓存在缓冲池中的流媒体数据进行解码,可以选择用户指定所需要的解码器,也可由系统根据解码器的性能进行自动选择;同时使用多级缓存技术,保证了视频的高速解码与平滑显示。
具体实施方式
本发明实施例解决方案主要是:通过定义统一的视频接入规则,由各待接入厂家提供相应的动态解码库文件,当新增加一个解码器时,不需要重新编译程序与发行版本,只需增加相应的动态解码库文件,根据预定的解码器及动态解码库文件对接收并缓存在缓冲池中的流媒体数据进行解码,同时使用多级缓存技术,以保证视频的高速解码与平滑显示。
由于各厂家根据对象开发的特征,定义有抽象类模块,通过动态链接库技术,可以把不同厂家提供的抽象类模块加以链接。同理,也可将上述技术应用到包含各个厂家自定义的协议格式的录像文件之中,实现对各种格式的录像文件接入的功能。
另外,在视频应用中,由于视频源的分布位置及网络环境的差异,有可能会导致视频流接收不顺畅。为了处理视频平滑显示,需要在流媒体数据接收时进行缓存处理,同时针对视频流的高速解码显示,在视频流的解码及显示过程中同样需要使用缓存的机制。
如图1所示,本发明一实施例提出一种支持视频插件接入的视频快速平滑显示的方法,包括:
步骤S101,接收流媒体数据,并存入缓冲池;
其中,流媒体数据的接收包括通过录像数据流读入线程读入录像数据流和直接来自前端设备的实时数据流。
无论哪种流媒体数据,最终均统一接入到帧数据的缓冲池中。后续对流媒体数据的解码操作,均从缓冲池中获取流媒体数据。
通过缓冲池对接收的流媒体数据进行缓存,有利于流媒体数据的快速解码及平滑显示。
步骤S102,根据预定的解码器及动态解码库文件对流媒体数据进行解码;
当缓存到缓冲池中的流媒体数据达到一定位置即预定阀值时,通知解码线程进行解码,解码线程通过调用指定的解码器加载相应的动态解码库文件对流媒体数据进行解码,完成解码后通知缓冲池并释放缓冲池控制权,同时把解码完后的YUV数据推送到可显示队列中。
根据动态加载的需求,各解码库以单独文件即动态解码库文件存在于系统当中。在解码需要用到解码库时,才动态地进行加载。为了防止定位到不正确的动态解码库文件,可以在各个解码DLL里约定统一的自我描述、创建及卸载函数,其中:
自我描述函数,用于设定该解码库的性能参数;
创建函数,用于将解码库实例化;
卸载函数,用于回收创建时申请的系统资源。
通过创建函数得到解码库的实例后,即可根据定义的抽象解码器进行解码。
对解码库来说,并不关心各个解码器的具体实现。解码库只通过已经定义好的抽象解码器的方法来进行解码操作。解码库中只有CoderMng对象通过调用每个解码DLL里的自我描述、创建及卸载函数与各个解码器进行交互。
同理,解码库本身也不关心录像文件的具体格式。解码库中的RecFile对象通过调用每个解码DLL里的自我描述、创建及卸载函数与各个录象协议器进行交互。
其中,解码器加载动态解码库文件的步骤包括:
1、指定需要加载的解码器的路径;
2、通过模块加载API,加载解码器的DLL;
3、调用约定好的创建函数,实例化解码器;
4、通过定义好的抽象类方法来使用解码实例进行解码操作;
5、调用约定好的卸载函数,回收该解码实例所申请的系统资源。
对于录像数据流,录像文件的回放步骤包括:
1、指定需要加载的录像协议器的路径;
2、通过模块加载API,加载录像协议器的DLL;
3、调用约定好的创建函数,实例化录像协议器;
4、通过定义好的抽象类方法来使用录像协议实例进行录像文件读入操作。
5、调用约定好的卸载函数,回收该录像协议实例所申请的系统资源。
步骤S103,将解码后的流媒体数据显示到终端。
通过显示计时器按实际的帧间隔时间循环从显示队列中取出YUV格式的视频数据,进行显示操作。
在显示操作中,需要将显示队列中取出的YUV格式的视频数据转换为RGB格式的视频数据,通过解码库预先设置好的回调函数通知外部应用层,使应用层可以进行自定义的视频叠加处理,最终将叠加处理后的视频数据显示到指定的窗口之中。
显示操作完成后,通知可显示队列并释放队列控制权,在休眠与下帧数据之间的间隔后,重复上述从显示队列中取出YUV格式的视频数据,进行显示操作的步骤。
上述YUV格式的数据与RGB格式的数据属于现有技术,在此不作详述。
在具体实施时,如图2所示,步骤S102包括:
步骤S1021,当所述缓冲池中的流媒体数据达到预定阀值时,调取预定的解码器;
步骤S1022,通过预定的解码器加载相应的动态解码库文件,对缓冲池中的流媒体数据进行解码;
步骤S1023,将解码后的流媒体数据送入显示队列。
如图3所示,步骤S103包括:
步骤S1031,按照预定的时间间隔从所述显示队列中取出YUV格式数据;
步骤S1032,将YUV格式数据转换为RGB格式数据;
步骤S1033,对RGB格式数据进行视频叠加处理后,显示于终端预定的窗口。
本实施例通过定义统一的视频接入规则,由各待接入厂家提供相应的动态解码库文件,当新增加一个解码器时,不需要重新编译程序与发行版本,只需增加相应的动态解码库文件,根据预定的解码器及动态解码库文件对接收并缓存在缓冲池中的流媒体数据进行解码,可以选择用户指定所需要的解码器,也可由系统根据解码器的性能进行自动选择;同时使用多级缓存技术,保证了视频的高速解码与平滑显示。
为了实现视频的平滑显示,则必须要在接收视频源的地方做帧数据的缓存,同时在解码线程中及时解码并推到显示缓存之中。最后,通过高精度的计时器,按各帧数据之间的实际时间间隔,定时进行显示操作。
可以通过C++的特性进行派生类的开发,从而实现解码器的多态性;再通过WINDOWS系统中的动态加载机制,实现各个解码器的独立分离。通过两者的结合,最终,解码库的规模可以由最终使用者自行定义,甚至可以由系统自动进行各种解码器的按优选择。
对于数据缓冲池的实现,解码库中每一路工作是由几个独立的线程共同完成。线程间如果有太多的通讯,必然会导致程序的复杂度增加,由此也增加了程序的维护难度。在本实施例中,线程间通讯只通过对数据缓冲池或显示队列的访问来进行。也就是各个线程间,只负责对目标队列进行读或写操作,从而降低了程序的复杂度及维护难度。
对于数据显示的实现,可通过微软提供的DirectDraw很方便地把YUV数据显示到终端。考虑到直接使用YUV数据,会导致绘图表面中的GDI句柄无效,由此,便无法通过回调GDI句柄给外部应用层,这样,应用层便无法增加自定义的视频叠加处理,因此,本实施例需要将YUV数据转换为RGB格式再进行显示,在显示之前,通过回调函数来返回GDI句柄供应用层使用。
如图4所示,本发明一实施例提出一种支持视频插件接入的视频快速平滑显示的装置,包括:流媒体数据接收模块401、数据解码模块402以及数据显示模块403;其中:
流媒体数据接收模块401,用于接收流媒体数据,并存入缓冲池;
数据解码模块402,用于根据预定的解码器及动态解码库文件对流媒体数据进行解码;
数据显示模块403,用于将解码后的流媒体数据显示到终端。
本实施例中,流媒体数据接收模块401接收的流媒体数据包括通过录像数据流读入线程读入的录像数据流和直接来自前端设备的实时数据流。
无论哪种流媒体数据,最终均统一接入到帧数据的缓冲池中。后续对流媒体数据的解码操作,均从缓冲池中获取流媒体数据。数据解码模块402只与帧数据缓存池进行交互。同理,解码后的YUV格式的视频数据将放入到显示队列中,数据显示模块403并不直接与解码线程进行通讯,只与显示队列进行交互。
通过缓冲池对接收的流媒体数据进行缓存,有利于流媒体数据的快速解码及平滑显示。
当缓存到缓冲池中的流媒体数据达到一定位置即预定阀值时,数据解码模块402通过解码线程进行解码,解码线程通过调用指定的解码器加载相应的动态解码库文件对流媒体数据进行解码,完成解码后通知缓冲池并释放缓冲池控制权,同时把解码完后的YUV数据推送到可显示队列中。
根据动态加载的需求,各解码库以单独文件即动态解码库文件存在于系统当中。在解码需要用到解码库时,才动态地进行加载。为了防止定位到不正确的动态解码库文件,可以在各个解码DLL里约定统一的自我描述、创建及卸载函数,其中:
自我描述函数,用于设定该解码库的性能参数;
创建函数,用于将解码库实例化;
卸载函数,用于回收创建时申请的系统资源。
通过创建函数得到解码库的实例后,即可根据定义的抽象解码器进行解码。
对解码库来说,并不关心各个解码器的具体实现。解码库只通过已经定义好的抽象解码器的方法来进行解码操作。解码库中只有CoderMng对象通过调用每个解码DLL里的自我描述、创建及卸载函数与各个解码器进行交互。
同理,解码库本身也不关心录像文件的具体格式。解码库中的RecFile对象通过调用每个解码DLL里的自我描述、创建及卸载函数与各个录象协议器进行交互。
其中,解码器加载动态解码库文件的步骤包括:
1、指定需要加载的解码器的路径;
2、通过模块加载API,加载解码器的DLL;
3、调用约定好的创建函数,实例化解码器;
4、通过定义好的抽象类方法来使用解码实例进行解码操作;
5、调用约定好的卸载函数,回收该解码实例所申请的系统资源。
对于录像数据流,录像文件的回放步骤包括:
1、指定需要加载的录像协议器的路径;
2、通过模块加载API,加载录像协议器的DLL;
3、调用约定好的创建函数,实例化录像协议器;
4、通过定义好的抽象类方法来使用录像协议实例进行录像文件读入操作。
5、调用约定好的卸载函数,回收该录像协议实例所申请的系统资源。
数据显示模块403通过显示计时器按实际的帧间隔时间循环从显示队列中取出YUV格式的视频数据,进行显示操作。
在显示操作中,需要将显示队列中取出的YUV格式的视频数据转换为RGB格式的视频数据,通过解码库预先设置好的回调函数通知外部应用层,使应用层可以进行自定义的视频叠加处理,最终将叠加处理后的视频数据显示到指定的窗口之中。
显示操作完成后,通知可显示队列并释放队列控制权,在休眠与下帧数据之间的间隔后,重复上述从显示队列中取出YUV格式的视频数据,进行显示操作的步骤。
具体地,如图5所示,数据解码模块402包括:调取单元4021、加载解码单元4022以及发送单元4023,其中:
调取单元4021,用于当缓冲池中的流媒体数据达到预定阀值时,调取预定的解码器;
加载解码单元4022,用于通过预定的解码器加载相应的动态解码库文件,对缓冲池中的流媒体数据进行解码;
发送单元4023,用于将解码后的流媒体数据送入显示队列。
具体地,加载解码单元4022还用于通过调用动态解码库文件相应的解码DLL中的自我描述、创建及卸载函数与所述预定的解码器进行交互;或者,通过调用动态解码库文件相应的解码DLL中的自我描述、创建及卸载函数与所述相应的录像协议器进行交互。
如图6所示,数据显示模块403包括:获取单元4031、转换单元4032以及显示单元4033,其中:
获取单元4031,用于按照预定的时间间隔从显示队列中取出YUV格式数据;
转换单元4032,用于将YUV格式数据转换为RGB格式数据;
显示单元4033,用于对RGB格式数据进行视频叠加处理后,显示于终端预定的窗口。
本发明实施例支持视频插件接入的视频快速平滑显示的方法及装置,通过定义统一的视频接入规则,由各待接入厂家提供相应的动态解码库文件,当新增加一个解码器时,不需要重新编译程序与发行版本,只需增加相应的动态解码库文件,根据预定的解码器及动态解码库文件对接收并缓存在缓冲池中的流媒体数据进行解码,可以选择用户指定所需要的解码器,也可由系统根据解码器的性能进行自动选择;同时使用多级缓存技术,保证了视频的高速解码与平滑显示。
以上所述仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或流程变换,或直接或间接运用在其它相关的技术领域,均同理包括在本发明的专利保护范围内。