本发明涉及流媒体播放技术,特别涉及数字电视上基于gstreamer的流媒体播放器利用芯片平台硬件解码加速及视频画面pq画质调节技术。
背景技术:
近年来,随着移动互联网的飞速发展,消费类电子产品呈现出了爆发式增长,而数字电视中流媒体播放却存在如下缺陷:
【缺陷一】尤其是数字电视上对流媒体播放的要求越来越高,不仅要支持各种格式的媒体播放,以及各种协议的流媒体数据,而传统的android系统原生实现的流媒体框架媒体支撑能力较弱,不能很好的支撑市场上各种播放业务的需求;
【缺陷二】另外,芯片方也往往各自为战,大都基于自身硬件平台提出一套解决方案,导致电视厂商要各个平台都要适配,花费大量人力财力;
【缺陷三】gstreamer框架虽然灵活,但是在android平台其视频输出仅支持基于opengles方式输出,解码后的数据需要作纹理拷贝,性能低下。而且在surfacetexture上输出的视频纹理,无法充分利用芯片方硬件pq画质调节,输出的画面色彩还原度不佳,画质效果低劣。
技术实现要素:
本发明的目的是提供一种数字电视中基于gstreamer框架的流媒体播放器提升画质的方法,解决目前数字电视中流媒体播放存在缺陷的问题。
本发明解决其技术问题,采用的技术方案是:数字电视中基于gstreamer框架的流媒体播放器提升画质的方法,包括如下步骤:
步骤1、交叉编译使得gstreamersdk和androidframework实现api可互操作;
步骤2、在libmediaplayerservice层基于gstreamer重新实现mediaplayerinterface.h头文件约束,实现播放器videoplayer;
步骤3、实现硬解码插件vdecplugin,使其调用基于原生androidmediacodecapi实现视频流硬解码功能,将解码出视频帧的序列索引index与mediacodec分配的framebuffer键值对作key/value匹配,并且硬解插件开放anativewindowinterface,使得硬解码插件可以与上层给定的surfaceview绑定;
步骤4、实现视频输出插件vsinkplugin,以步骤3中vdecplugin中实现的key/value键值对作为输入,在surfaceview上渲染视频帧;
步骤5、将步骤3与步骤4中实现的vdecplugin和vsinkplugin插件的rank值设为最高256,使得gstreamer框架在自动构建pipeline时,以第一优先级智能加载;
步骤6、基于java的app应用,利用标准的mediaplayersetdisplay接口,传递surfaceview对象到步骤2中实现的videoplayer播放器中,同时将java对象映射到c/c++的anativewindow接口,并将此对象传递给步骤3中的vdecplugin以及gstreamer框架;
步骤7、结合上述步骤1~6,使得gstreamer能够与android标准组件surfaceview交互。
本发明的有益效果是,通过上述数字电视中基于gstreamer框架的流媒体播放器提升画质的方法,使用surfaceview充分利用芯片平台硬件解码加速及视频画面pq画质调节功能,使得高清、极高清视频播放更流畅,画面显示更加绚丽,极大的提升了用户使用体验;另外,遵循googleandroid硬件编解码模块libstatefright通用事实标准,因此不特定于某一个芯片平台,支持包括但不限于mtk,mstar,海思等平台电视解决方案,具有较强的通用性,解决了因平台限制,每个硬件平台视频输出需要单独适配的问题,节约成本,因此极大的提高了生产力。
具体实施方式
下面详细描述本发明的技术方案。
本发明所述数字电视中基于gstreamer框架的流媒体播放器提升画质的方法,包括如下步骤:
步骤1、交叉编译使得gstreamersdk和androidframework,实现api可互操作;
步骤2、在libmediaplayerservice层基于gstreamer重新实现mediaplayerinterface.h头文件约束,实现播放器videoplayer;
步骤3、实现硬解码(hwdecoder)插件vdecplugin,使其调用基于原生androidmediacodecapi实现视频流硬解码功能,将解码出视频帧的序列索引index与mediacodec分配的framebuffer键值对作key/value匹配,并且硬解插件开放anativewindowinterface,使得硬解码插件可以与上层给定的surfaceview绑定,此步骤为关键步骤,同时需要考虑媒体框架因为各种原因导致dropframe时,索引对应的帧buffer能够归还给底层buffer的拥有者;
步骤4、实现视频输出插件vsinkplugin,以步骤3中vdecplugin中实现的key/value键值对作为输入,实现在surfaceview上渲染视频帧目的,并且考虑重复帧输出时如何保证索引所对应帧buffer的唯一性;
步骤5、将步骤3与步骤4中实现的vdecplugin和vsinkplugin插件的rank值设为最高256,使得gstreamer框架在自动构建pipeline时,能够以第一优先级智能加载;
步骤6、基于java的app应用,利用标准的mediaplayersetdisplay接口,传递surfaceview对象到步骤2中实现的videoplayer播放器中,同时将java对象映射到c/c++的anativewindow接口,并将此对象传递给步骤3中的vdecplugin以及gstreamer框架;
步骤7、结合上述步骤1~6,使得gstreamer能够与android标准组件surfaceview交互,从而路由调用到芯片厂商硬件解码以及画质pq调节功能,通过通用的标准组件,取代传统的硬件解码加速及画质pq调节的私有接口调用。