基于linux桌面显卡的安卓视频解码硬件加速方法
技术领域
1.本发明涉及android视频解码技术领域,尤指一种基于linux桌面显卡的安卓视频解码硬件加速方法。
背景技术:2.近年来,随着android(安卓)用户的增长以及android软硬件产品的成熟和发展,android应用生态呈现出爆发式发展,在很多领域都已经超过windows应用生态和ios应用生态,成为目前使用最广泛的应用生态。android基于linux内核发展而来,是目前移动终端市场中市场份额最高的linux类操作系统,在移动终端领域具有极好的生态环境;windows系统占据着pc市场的最大份额,其作为美国闭源操作系统,在信息网络安全方面存在巨大安全隐患;而linux操作系统,其作为android的前身,由于开发人员数目和市场份额的限制,发展较为缓慢,生态环境长期处于不良状态,一直不见起色。随着信息技术的飞速发展,国家对信息安全的重视程度日益提升,国内基于开源linux操作系统的自主操作系统日益发展壮大,但linux操作系统生态应用的严重缺乏仍旧是困扰linux操作系统真正推向市场的一大痛点。
3.要解决linux操作系统的生态问题,必须解决用户数不足和平台应用软件数不足这两个关键点。android在移动终端领域具有广泛的用户群,并且具有成熟的开发平台和应用软件群体,对于解决linux操作系统目前的窘境具有一定的参考价值。
4.由于android操作系统基于linux内核发展而来,其针对移动终端设备的特点在用户空间做了大幅的改进和增强,所以给linux操作系统兼容android应用提供了极大的可能性和便利,使得移动端的丰富应用很有可能成功运行在pc端。近年来,android应用生态在linux操作系统上的兼容支持成为了研究热点,国内外有许多研究人员尝试将android运行环境迁移到linux类计算机平台以实现android应用生态在linux操作系统上兼容支持的效果,各种兼容技术衍生而出,其中就包括google的 arc(app runtime for chrome)技术、虚拟机和模拟器技术、anbox(android in a box)项目等,这些技术将pc端和移动端进行融合,成功将android应用生态迁移到linux上来,极大地推动了linux应用生态的发展,很大程度上弥补了linux应用缺乏的诟病,方便了linux操作系统用户的日常办公、娱乐等需求,也加快了linux操作系统走向消费市场的步伐,但它们都还存在着无法忽视的用户体验问题,包括稳定性、易用性、功能完备性等,导致这块技术领域没有显著的提升。
5.对于linux桌面而言,通用硬件设备并不像android移动设备一样配置了专门的硬件实现视频解码硬件加速,所以只能使用显卡的图像处理能力来实现视频解码硬件加速。android模拟器和虚拟机由于无法直接访问到宿主机的硬件设备,目前采取的方式主要是实现纯软件的解码插件库,完全使用cpu解码,对cpu的使用率较高,加上模拟器和虚拟机方案本身具有一定的性能损耗,视频解码效率进一步降低。再比如anbox,虽然anbox不是虚拟机或模拟器,但由于采用的仍然是android原本的纯软件解码器,解码效率完全依赖于cpu的性能,cpu的使用率也比较高。这种完全使用软件解码的方案,总体来说解码效率比较低,
并且对android视频应用的体验有影响。
技术实现要素:6.本发明的目的,在于提供一种基于linux桌面显卡的安卓视频解码硬件加速方法,以解决现有的linux兼容安卓系统中存在的视频解码效率低的问题。
7.为解决上述技术问题,本发明是这样实现的:本发明的一种基于linux桌面显卡的安卓视频解码硬件加速方法,应用在linux系统兼容安卓容器的环境中,基于linux内核及linux桌面的支持vaapi的显卡设备,所述方法具体包括以下步骤:s1、加载安卓容器的视频解码服务并初始化视频解码器;s2、所述视频解码器初始化视频解码硬件加速接口;s3、所述视频解码器将视频数据包发送至所述视频解码硬件加速接口;s4、所述视频解码硬件加速接口将数据包传入linux内核并由显卡设备将所述数据包解码为视频帧;s5、所述视频解码器通过所述视频解码硬件加速接口取回已解码的视频帧;s6、所述视频解码服务将所述视频帧发送到视频程序进行显示。
8.其中,在步骤s1之前还包括以下具体步骤:s01、将安卓系统和linux系统安装于同一linux平台上;s02、将所述安卓系统和所述linux系统共享同一linux内核,linux系统的容器中运行安卓系统以构成安卓容器;s03、在linux平台上安装支持vaapi的显卡设备,将支持vaapi的显卡设备的设备节点映射到安卓容器中;s04、将linux系统的ffmpeg对接到安卓中,并实现为安卓的视频解码器插件库。
9.其中,步骤s2具体包括以下步骤:s21、将linux的libva库对接到安卓容器中;s22、将符合vaapi的显卡插件库对接到安卓容器中;s23、所述ffmpeg视频解码器插件库开启vaapi功能;s24、所述ffmpeg视频解码器初始化自身的上下文配置,并初始化视频解码硬件加速接口的上下文。
10.其中,步骤s3具体包括以下步骤:s31、所述安卓容器中的视频应用产生视频数据包;s32、所述安卓容器中的视频解码服务获取视频数据包;s33、所述视频解码器从视频解码服务的输入数据流中获取视频数据包;s34、所述视频解码器使用ffmpeg接口将数据发送给libva库及显卡相关vaapi实现程序。
11.其中,步骤s5具体包括以下步骤:s51、所述显卡设备完成视频数据解码生成视频帧;s52、所述视频解码器从所述显卡设备中取回所述视频帧的数据;s53、所述视频解码器对视频帧的数据进项缩放。
12.其中,步骤s6具体包括以下步骤:s61、所述视频解码服务将视频帧的数据发送给调用安卓视频解码接口的客户端的视频程序;s62、所述客户端对视频帧的数据进行像素格式转换和显示范围裁剪;s63、所述客户端将处理过的视频帧的数据进行显示。
13.本发明的有益效果为:本发明提供的一种基于linux桌面显卡的安卓视频解码硬件加速方法,将linux操作系统的vaapi对接到安卓容器环境中,安卓容器环境可以通过使用linux内核来实现视频解码硬件加速,即让安卓可以直接通过linux内核操作显卡设备,并在此基础上将libva库、ffmpeg库以及intel显卡和mesa中amd显卡的vaapi对接到安卓容器环境中,提供安卓环境中,对ffmpeg库开启vaapi功能,提供android环境中对vaapi的支持,减少使用cpu进行视频解码带来的性能损失,提高了android视频解码的效率。
附图说明
14.下面结合附图和具体实施方式对本发明作进一步详细的说明。
15.图1为本发明的流程示意图;图2为本发明的安卓容器环境实现视频解码硬件加速的结构图。
具体实施方式
16.下面结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述。在下面的描述中阐述了很多具体细节以便于充分理解本发明,但是本发明还可以采用其他不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本发明内涵的情况下做类似推广,因此本发明不受下面公开的具体实施例的限制。
17.如图1和图2所示,一种基于linux桌面显卡的安卓视频解码硬件加速方法,应用在linux系统兼容安卓容器的环境中,基于linux内核及linux桌面的支持vaapi的显卡设备,所述方法具体包括以下步骤:s1、加载安卓容器的视频解码服务并初始化视频解码器;s2、所述视频解码器初始化视频解码硬件加速接口,在本实施例中,是初始化ffmpeg并使用ffmpeg的接口初始化vaapi;s3、所述视频解码器将视频数据包发送至所述视频解码硬件加速接口;s4、所述视频解码硬件加速接口将数据包传入linux内核并由显卡设备将所述数据包解码为视频帧,在本实施例中,所述视频解码硬件加速接口将数据包传入linux内核后,由显卡设备的gpu将所述数据包解码为视频帧;s5、所述视频解码器通过所述视频解码硬件加速接口取回已解码的视频帧;s6、所述视频解码服务将所述视频帧发送到视频程序进行显示。
18.在实施例中,图2是安卓容器环境实现视频解码硬件加速的结构图,从图中可以看出,linux和安卓共享同一个内核(linux内核),安卓环境运行在容器中,即安卓容器,linux平台将显卡设备映射到安卓容器中,安卓视频解码服务使用ffmpeg解码,ffmpeg使用libva库加载显卡相关va库,显卡相关va库包括intel显卡va库和amd显卡va库,va库使用显卡设
备进行视频解码。
19.其中,在步骤s1之前还包括以下具体步骤:s01、将安卓系统和linux系统安装于同一linux平台上;s02、将所述安卓系统和所述linux系统共享同一linux内核,linux系统的容器中运行安卓系统以构成安卓容器;s03、在linux平台上安装支持vaapi的显卡设备,将支持vaapi的显卡设备映射到安卓容器中;s04、将linux系统的ffmpeg对接到安卓中,并实现为安卓的视频解码器插件库。其中,该步骤的“对接”是将linux上的ffmpeg源码在安卓里配置并编译成二进制库。
20.在本实施例中,原生安卓系统的视频解码不提供硬件加速,各个移动设备厂商需要根据硬件实现针对该移动设备的支持硬件加速的视频解码程序。linux桌面环境下运行的安卓容器,需要使用linux桌面所能提供的相关技术,实现安卓容器系统里的视频解码硬件加速。在linux桌面上,可以通过vaapi的方式实现视频解码硬件加速,在此条件下,可以在原生安卓系统里提供vaapi支持,为此需要解决一些问题。首先是需要显卡设备支持vaapi,支持vaapi的显卡有intel和amd的显卡,linux桌面除了安装上述显卡外,还需要保证安卓容器能够正常使用显卡设备,linux需要将上述显卡设备的设备节点映射到安卓容器里,并且容器里为设备节点设置合理的权限保证安卓环境能正常访问显卡的设备节点。另外,安卓系统支持openmax多媒体框架,可以加载并使用符合openmax标准的编解码插件程序,为此需要将支持vaapi的解码程序实现为omx库。考虑到上述linux桌面环境安装的显卡型号可能不同,不同型号显卡视频解码硬件加速支持的视频编码格式有所不同,当显卡设备解码硬件加速不支持某种视频编码格式时,还需要能灵活地切换回cpu解码。ffmpeg是一个常用的编解码库,支持多种视频编码的cpu解码和视频解码vaapi硬件加速,因此选择ffmpeg作为视频解码程序的具体实现,为此需要将ffmpeg对接到安卓容器环境里,包括编译ffmpeg库,实现基于ffmpeg的omx插件库,即ffmpeg视频解码器插件库,改造android多媒体框架以支持加载ffmpeg的omx插件库。
21.其中,步骤s2具体包括以下步骤:s21、将linux的libva库对接到安卓容器中,其中,该处的对接为:将linux上的libva源码在安卓里编译成二进制库;s22、将符合vaapi的显卡插件库对接到安卓容器中;s23、所述ffmpeg视频解码器插件库开启vaapi功能;s24、所述ffmpeg视频解码器初始化自身的上下文配置,并初始化视频解码硬件加速接口的上下文。
22.在本实施例中,为了使用vaapi进行视频解码硬件加速,需要将linux的libva库对接到安卓环境里,libva库提供vaapi的通用接口并根据显卡选择加载显卡提供的vaapi库。由于不同的显卡视频解码硬件加速的具体实现不同,各个显卡都有专门的vaapi实现库,例如专门针对intel显卡的具体实现有i965_drv_video.so,mesa提供了amd显卡的r600_drv_video.so和radeonsi_drv_video.so。另外,ffmpeg库默认是使用cpu解码的,为了使用vaapi硬件加速,需要配置ffmpeg的编译选项,打开相关视频流格式的解码选项,并且打开该解码选项的vaapi硬件加速选项。在ffmpeg解码程序实际运行时,除了初始化自身的解码
器上下文,还需要初始化视频解码硬件加速支持(即vaapi)的上下文,在初始化上下文过程中,ffmpeg使用libva库加载所述的显卡设备的vaapi实现库,完成硬件加速接口及环境的初始化。
23.其中,步骤s3具体包括以下步骤:s31、所述安卓容器中的视频应用产生视频数据包;s32、所述安卓容器中的视频解码服务获取视频数据包;s33、所述视频解码器从视频解码服务的输入数据流中获取视频数据包;s34、所述视频解码器使用ffmpeg接口将数据发送给libva库及显卡相关vaapi实现程序。
24.在本实施例中,视频数据是由安卓应用产生的,以本地文件、网络传输字节流等形式存在。对于同时包含音频与视频数据的数据流而言,需要首先通过应用或者android media.extractor将音频流与视频流分开,再将视频流数据以包的形式发送到安卓视频解码服务。视频解码服务根据安卓应用的要求针对视频流格式创建不同的解码器,例如h.264解码器,h.265解码器等。视频解码服务拿到数据包之后,将数据包作为解码器的输入传递给解码器。解码器拿到数据包之后,使用ffmpeg接口将数据包交给解码程序进行解码。ffmpeg在开启并初始化vaapi的情况下,会将数据通过libva和显卡vaapi具体实现交由linux内核和显卡设备处理。
25.其中,步骤s5具体包括以下步骤:s51、所述显卡设备完成视频数据解码生成视频帧;s52、所述视频解码器从所述显卡设备中取回所述视频帧的数据;s53、所述视频解码器对视频帧的数据进项缩放。
26.在本实施例中,linux桌面显卡具有较好的图像处理能力,可以用于视频解码,例如,对于amd显卡mesa vaapi使用显卡的uvd功能。在显卡完成视频解码之后生成视频帧数据,视频解码器对画面进行进一步处理就需要从显卡中取回视频帧数据。同样的,取回视频帧数据也是使用ffmpeg的接口进行,ffmpeg实际通过vaapi接口取回视频帧数据。一般情况下,视频帧数据是yuv像素格式的,在最终显示时需要视频帧数据yuv参数与显示渲染程序yuv参数保持一致,因此需要对视频帧数据进行缩放处理。
27.其中,步骤s6具体包括以下步骤:s61、所述视频解码服务将视频帧的数据发送给调用安卓视频解码接口的客户端的视频程序;s62、所述客户端对视频帧的数据进行像素格式转换和显示范围裁剪,其中,该步骤的过程是在安卓视频解码接口内部实现的;s63、所述客户端将处理过的视频帧的数据进行显示。其中,客户端的视频程序提供了一个可以用来显示的载体,一个surface,安卓视频解码接口内部将数据填充到这个surface实现显示,只是这个填充数据的过程发生在客户端的视频程序进程中。
28.在本实施例中,视频解码器在处理视频帧数据后,解码服务器将数据发送到解码接口客户端程序。由于应用中用来显示的surface可能并不支持yuv像素格式,所以此时还需要将yuv像素格式转化为surface可以支持显示的像素格式,例如rgba像素格式。对于应用,还可以对数据做进一步的裁剪以选择想要显示的视频区域。最终,进过像素格式转换和
范围裁剪后,将数据送到应用视频surface的显示缓冲队列中,进行显示。
29.本发明提供的一种基于linux桌面显卡的安卓视频解码硬件加速方法将linux操作系统的vaapi实现对接到android环境中,安卓容器环境可以通过使用linux内核来实现视频解码硬件加速,即让安卓可以直接通过内核操作显卡,并在此基础上将libva库,ffmpeg库以及intel显卡和mesa中amd显卡的vaapi实现对接到android环境中,提供android环境中,对ffmpeg库开启vaapi功能,提供android环境中对vaapi的支持,减少使用cpu进行视频解码带来的性能损失,提高了安卓视频解码的效率。
30.应当理解的是,本发明的上述具体实施方式仅仅用于示例性说明或解释本发明的原理,而不构成对本发明的限制。因此,在不偏离本发明的精神和范围的情况下所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。此外,本发明所附权利要求旨在涵盖落入所附权利要求范围和边界、或者这种范围和边界的等同形式内的全部变化和修改例。