Android中软解码和硬解码的优先级

我们先来看一下Android系统中解码器的命名,软解码器通常是以OMX.google开头的。硬解码器通常是以OMX.[hardware_vendor]开头的,比如TI的解码器是以OMX.TI开头的。当然还有一些不遵守这个命名规范的,不以OMX.开头的,那也会被认为是软解码器。

判断规则见frameworks/av/media/libstagefright/OMXCodec.cpp:

  1. static bool IsSoftwareCodec(const char *componentName) {
  2. if (!strncmp("OMX.google.", componentName, 11)) {
  3. return true;
  4. }
  5. if (!strncmp("OMX.", componentName, 4)) {
  6. return false;
  7. }
  8. return true;
  9. }

实际上系统中存在的解码器可以很多,但能够被应用使用的解码器是根据配置来的,即/system/etc/media_codecc.xml。这个文件一般由硬件或者系统的生产厂家在build整个系统的时候提供,一般是保存在代码的device/[company]/[codename]目录下的,例如device/samsung/tuna/media_codecs.xml。这个文件配置了系统中有哪些可用的codec以及,这些codec对应的媒体文件类型。在这个文件里面,系统里面提供的软硬codec都需要被列出来。

也就是说,如果系统里面实际上包含了某个codec,但是并没有被配置在这个文件里,那么应用程序也无法使用到!

在这里配置文件里面,如果出现多个codec对应同样类型的媒体格式的时候,这些codec都会被保留起来。当系统使用的时候,将后选择第一个匹配的codec。除非是指明了要软解码还是硬解码,但是Android的framework层为上层提供服务的AwesomePlayer中在处理音频和视频的时候,对到底是选择软解还是硬解的参数没有设置。所以虽然底层是支持选择的,但是对于上层使用MediaPlayer的Java程序来说,还是只能接受默认的codec选取规则。

但是Android提供的命令行程序/system/bin/stagefright在播放音频文件的时候,倒是可以根据参数来选择到底使用软解码还是硬解码,但是该工具只支持播放音频,不支持播放视频。

一般来说,如果系统里面有对应媒体的硬件解码器的话,系统开发人员应该是会配置在media_codecs.xml中,所以大多数情况下,如果有硬件解码器,那么我们总是会使用到硬件解码器。极少数情况下,硬件解码器存在,但不配置,我猜测只可能是这个硬解码器还有bug,暂时还不适合发布。

时间: 2024-10-13 02:56:17

Android中软解码和硬解码的优先级的相关文章

转 Android视频播放软解与硬解的区别

硬解,用自带播放器播放,android中的VideoView 软解,使用音视频解码库,比如FFmpeg 一.硬解码 硬解:就是调用GPU的专门模块编码来解,减少CPU运算,对CPU等硬件要求也相对低点.软解需要CPU运算,变相加大CPU负担耗电增加很多.硬件解码是将原来全部交由CPU来处理的视频数据的一部分交由GPU来做,而GPU的并行运算能力要远远高于CPU,这样可以大大的降低对CPU的负载,CPU的占用率较低了之后就可以同时运行一些其他的程序了. 对于Android设备,目前用得比较多的so

Android视频播放软解与硬解的区别

硬解,用自带播放器播放,android中的VideoView 软解,使用音视频解码库,比如FFmpeg 一.硬解码 硬解:就是调用GPU的专门模块编码来解,减少CPU运算,对CPU等硬件要求也相对低点.软解需要CPU运算,变相加大CPU负担耗电增加很多.硬件解码是将原来全部交由CPU来处理的视频数据的一部分交由GPU来做,而GPU的并行运算能力要远远高于CPU,这样可以大大的降低对CPU的负载,CPU的占用率较低了之后就可以同时运行一些其他的程序了. 对于Android设备,目前用得比较多的so

Android平台对H264视频硬解码

本文讲述如何使用Android标准的API (MediaCodec)实现H264的硬件解码. 原本我们是用JNI调用平台提供的硬件解码接口得到YUV帧,再放入opengl脚本里处理渲染的.可是换了新平台之后,没有拿到底层的接口,所以这两天找在Android上的H264解码方案.前天在友人的提示下找到了MediaCodec这个类,Android developer上面有MediaCodec的描述和用法,还算详细可以慢慢摸索.但是在网上关于这个类的用法是比较少. 那在这里贴代码介绍一下. 1 //

Android 用MediaCodec实现视频硬解码

本 文向你讲述如何用android标准的API (MediaCodec)实现视频的硬件编解码.例程将从摄像头采集视频开始,然后进行H264编码,再解码,然后显示. 1.从摄像头采集视频 可以通过摄像头Preview的回调,来获取视频数据. 首先创建摄像头,并设置参数: [java] view plaincopy cam = Camera.open(); cam.setPreviewDisplay(holder); Camera.Parameters parameters = cam.getPar

Android 用MediaCodec实现视频硬解码(转)

本文向你讲述如何用android标准的API (MediaCodec)实现视频的硬件编解码.例程将从摄像头采集视频开始,然后进行H264编码,再解码,然后显示.我将尽量讲得简短而清晰,不展示 那些不相关的代码.但是,我不建议你读这篇文章,也不建议你开发这类应用,而应该转而开发一些戳鱼.打鸟.其乐融融的程序.好吧,下面的内容是写给那些执 迷不悟的人的,看完之后也许你会同意我的说法:Android只是一个玩具,很难指望它来做靠谱的应用. 1.从摄像头采集视频 可以通过摄像头Preview的回调,来获

Android中常用的编码和解码(加密和解密)的问题

1. URL Encoding     编码目的是为了在?址上可以包含中文等特殊字符解码是为了把编码后的内容还原成原始的内容格式如下%9C%3C%F3%98 规则: %hex_byte 就是将实际的字节转换为十六进制进行显示编码URLEncoder.encode(String str, String charset) 解码 URLDecoder.encode(String str, String charset) eg.    %E6%88%91%E6%98%AFvhly%EF%BC%8C%E4

转:android中多媒体解码openmax的实现

转自:http://blog.csdn.net/hellofeiya/article/details/8601168 每个AwesomePlayer 只有一个OMX服务的入口,但是AwesomePlayer不一定就只需要1种解码器.有可能音视频都有,或者有很多种.这个时候这些解码器都需要OMX的服务,也就是OMX那头需要建立不同的解码器的组件来对应着AwesomePlayer中不同的code.OMX中非常重要的2个成员就是 OMXMaster 和 OMXNodeInstance.OMX通过这俩个

什么是“软解码”,什么又是“硬解码”呢?

我们在计算机上播放的视频文件都是经过压缩的,因为这样有利于节约存储空间:那么在播放过程,就需要进行一个反射的解压缩过程.在以前这项工作都是由CPU来完成的,对于普通分辨率的AVI.RMVB等文件,绝大多数的CPU都可以胜任:但是发展到高清视频(1080i/p)之后,数据解压缩的工作量比以前翻了数倍,这让很多处理器叫苦不迭. 随着技术的发展,工程师们发现显卡的GPU/VPU要比CPU更适合这类大数据量的.低难度的重复工作.视频解码工作从处理器那里分离出来,交给显卡去做,这就叫做“硬解码”,例如NV

vlc源码分析(六) 调用OpenMAX硬解码H.265

http://www.cnblogs.com/jiayayao/p/6964506.html H.265(HEVC)编码格式能够在得到相同编码质量视频的前提下,使用相当于H.264(AVC)一半的存储容量,虽然H.265的算法复杂度比H.264高一个数量级,但是硬件水平在不断提高,因此H.265使用场合逐渐多了起来.好多硬件厂商芯片内部实现了H.265的硬解码.最近调试了vlc-android调用OpenMAX硬解码H.265的部分,使用的硬件平台是ZX-2000,系统是Android5.1.