一种解决AndroidTV播放webp卡顿的方法与流程

文档序号:19415075发布日期:2019-12-14 00:51阅读:2439来源:国知局
一种解决Android TV播放webp卡顿的方法与流程

本发明涉及android动态图片处理及渲染技术领域,具体涉及一种解决androidtv播放webp卡顿的方法。



背景技术:

目前android系统的发展和普及程度已经非常高,但是电视系统硬件资源相比于手机系统相对落后。如何在有限的硬件条件下添加复杂动画、缩小android应用的体积,已经成为一个亟待解决的问题。通过分析对比现在主流的动图、视频格式发现,webp动图能够有效的缩小android应用体积、对动画效果能够高度的还原。

同时,android系统对webp播放目前还没有完美的解决方案,android原生控件并不支持webp动图,主流的fresco图片播放框架,框架集成体积大,无法对播放进行更细粒度的控制,而且解码和渲染过程都是通过soc进行,加大了soc的负担,播放的帧率得不到保证,出现帧率过低、丢帧等情况,且渲染效果不好,渐变色等部分容易出现马赛克。

通过对google对webp的生成、解码分析发现,webp的解码、渲染到屏幕、解码线程和渲染线程的同步占用了很多的时间。因此,针对soc资源有限,对webp的播放进行了重新设计和优化,把渲染部分的任务交给gpu进行,减轻了soc的计算量,同时利用了gpu计算能力强大的特性,优化了webp动图的播放效果和流畅度。



技术实现要素:

本发明的目的在于提供一种解决androidtv播放webp卡顿的方法,使得在在有限的硬件资源条件下减少soc的渲染工作量,实现webp的流畅播放。

为了达到上述技术效果,本发明提供了如下技术方案:

一种解决androidtv播放webp卡顿的方法,其特征在于,包括以下步骤:

(1)使用webp动画解码库对webp动图进行解码;

(2)使用webp动画渲染库对webp动画解码库解码后的数据进行渲染显示。

进一步的技术方案为,所述步骤(2)中webp动画渲染库采用gpu渲染方式。

进一步的技术方案为,所述步骤(1)具体为:传入webp动画路径到解码库进行解码,对解码后的帧数据进行处理,所述处理具体为去掉冗余帧信息、对像素数据进行处理,使得像素数据可以适配opengles纹理生成。

进一步的技术方案为,所述解码后的帧数据不会生成bitmap图像,而是直接将像素数据用于渲染。

进一步的技术方案为,所述步骤(2)具体为通过surfaceview提供渲染绘图表面,对webp动画解码库解码后的像素信息进行生成opengles纹理,然后webp动画渲染库调动gpu进行渲染操作,解码后的像素数据存储于native的内存中,而不需要转换为传统的bitmap。

首先介绍google提供的播放webp动图的方案。google原生webp播放方案主要通过libframesequence.so完成解码工作,通过framesequencedrawable完成解码和渲染的调度和同步工作。在framesequencedrawable创建解码线程通过libframesequence在native层对webp进行解码,解码之后得到native的帧数据,解码一帧完成后,通知java层android主线程进行帧刷新,android主线程进行当前帧刷新之后,再通知解码线程进行下一帧解码。该方案存在的问题在于电视soc性能有限,当soc当前处理的任务繁重时,导致一帧解码和渲染不能够在40ms之内完成,就会出现卡顿掉帧现象。

基于上述方案分析,发现耗时主要在两个地方,分别是:

(1)native层进行webp帧解码,解码时长通常耗费5ms~15ms;

(2)android主线程渲染绘制,该过程耗时时长较长,特别在soc繁忙的情况下,通常将耗费20ms~40ms的时间进行渲染和交换前后台buffer。

针对上述解码和渲染过程分析,本发明采用了下面的技术方案进行webp动图播放:

第一方面,本发明提供一种解码方案,称之为webp动画解码库,该方案主要在于对webp动图解码后的数据进行了去冗余信息,得到纯净的像素信息能够使之能够直接用于显示模块的渲染。相比于libframesequence解码后生成bitmap,直接对解码后的像素数据进行操作,对解码后的像素数据不进行bitmap生成,bitmap作为重量级元数据,对soc和内存的耗费是相当巨大的,优化的方案是避免bitmap操作。直接把解码库解码出的帧数据放到native内存中,节省了bitmap生成时间和内存拷贝时间。

第二方面,本发明提供一种动图解码后的原始像素数据显示模块,称之为webp动画渲染库,所述动图包括:webp动图。动图显示模块负责调动解码模块进行解码,解码模块返回该帧的像素数据和下一帧的显示timestamp,在到达下一帧的显示timestamp时,进行下一帧渲染显示。动图显示模块同时还负责对解码模块返回的像素数据进行渲染显示,其中解码后返回的像素数据为纯像素数据,把解码后的帧数据填充到nativesurface的buffer中,生成opengles纹理,直接采用opengles操作gpu渲染管线进行渲染,而非使用传统的imageview进行渲染。该方法相比于imageview,能够有效的提高渲染效果,soc的工作得到减轻,可以把更多的计算能力放在解码过程中,把渲染的任务交给gpu去进行。

与现有技术相比,本发明具有如下有益效果:本发明通过调用解码模块对webp动图进行解码,对解码后的数据进行二次处理,得到原始的帧数据,并把帧数据传递给数据显示模块进行渲染。基于构建出解码模块和显示模块,在解决现有webp动图播放卡顿的基础上,同时解决了现有webp框架入侵性强,体积大的问题,提供了一种无侵入的解决方案。极大提高了webp动图的播放渲染效果,避免了webp动图播放的卡顿掉帧,提升了应用的整体质量,降低了soc的资源占用,提高了系统的流程度。带来更好的视觉效果体验。

附图说明

图1为重新设计优化解码渲染前的流程图;

图2为优化之后的解码渲染框架图。

具体实施方式

下面结合附图和具体实施例对本发明进行进一步的解释和说明。

图1为重新设计优化解码渲染前的流程图,其中加黑椭圆标识的为耗时过程长的,需要优化处理部分。

图2是优化之后的解码渲染框架图,主要描述了解码模块和渲染模块的工作流程。

实施例1

如图2所示,本实施例提供了一种解决androidtv播放webp卡顿的方法,具体包括:

(1)传递webp动图路径到解码模块进行解码。其中解码模块已经封装好像素处理及内存操作部分,解码模块会调动libframesequence进行解码,解码完成后会得到帧信息数据。解码模块会对帧信息数据进行处理,去掉冗余信息,并进行数据转换,得到可用于后续显示渲染模块可用的像素数据。

(2)定义surfaceview、glsl着色器渲染器、egl渲染线程,这一步主要时为渲染模块提供渲染的窗口。同时可以设置播放方式和播放监听器,渲染模块会在播放完成时进行回调对应的监听函数。

(3)把surfacview的surface传递给显示渲染模块,显示渲染模块把像素数据填充到nativesurface的buffer中,然后通过opengles生成对应的纹理,然后交给gpu渲染管线进行渲染。

尽管这里参照本发明的解释性实施例对本发明进行了描述,上述实施例仅为本发明较佳的实施方式,本发明的实施方式并不受上述实施例的限制,应该理解,本领域技术人员可以设计出很多其他的修改和实施方式,这些修改和实施方式将落在本申请公开的原则范围和精神之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1