原文:How to add custom hardware codec to Android Framework?
http://gopinaths.gitlab.io/post/custom_hardware_codec_in_android/

本文介绍了Android平台中的媒体架构,从而解释了将自己的供应商特定硬件编码器/解码器作为OpenMAX组件添加到Android框架的步骤。

什么是编解码器?

编解码器是硬件设备或将输入数据处理成输出数据的计算机程序。编码数据流或用于传输和存储的信号(可能是加密形式)的编解码器称为编码器,解码器功能反转编码以进行重放或编辑。编解码器广泛用于视频会议,流媒体和视频编辑应用等应用。以下是几种不同类型的视频编解码器:H.264编码器和解码器,MPEG编码器和解码器,MJPEG编码器和解码器。

Android中的Mediacodec

Android包括Stagefright,一种原生级别的媒体播放引擎,内置基于软件的流行媒体格式编解码器。 Stagefright音频和视频播放功能包括与OpenMAX编解码器的集成,会话管理,时间同步渲染,传输控制和DRM(称为数字限制管理或数字版权管理)。 Stagefright还支持设备供应商提供的自定义硬件编解码器的集成。

架构

下面的框图显示了Android中的媒体架构。

从上图中可以看出,媒体架构主要由以下类和组件组成。

  • MediaCodec Class
  • Media player Service
  • Stagefright Engine
  • OMX Components.

Stagefright Engine and MediaPlayer Service

在本机级别,Android提供了一个多媒体框架,利用Stagefright引擎进行音频和视频录制和回放。 Stagefright附带默认的受支持软件编解码器列表,您可以使用OpenMax集成层标准实现自己的硬件编解码器。 有关更多实现细节,请参阅位于AOSP路径下方的MediaPlayer和Stagefright组件。

frameworks/av/media/libmedia
frameworks/av/media/libmediaplayerservice
frameworks/av/media/libstagefright

MediaCodec类

MediaCodec类可用于访问低级媒体编解码器,即编码器/解码器组件.MediaCodec类首先在Android 4.1(API 16)中可用。 mediacodec类的主要目的是访问设备中的底层硬件和软件编解码器。 因此,如果想在Android应用程序中使用自定义硬件/软件编解码器,则需要将编解码器注册到Android Framework。 这可以通过以下步骤完成。

在Android中注册您的编解码器的步骤

在Android框架中,编解码器通过media_codecs.xml注册。 以下是来自media_codec.xml文件的示例编码器和解码器块。

<MediaCodecs><Encoders><!-- video Decoder  --><MediaCodec name="OMX.qcom.video.encoder.h263" type="video/3gpp" ><Quirk name="requires-allocate-on-input-ports" /><Quirk name="requires-allocate-on-output-ports"/><Quirk name="requires-loaded-to-idle-after-allocation"/></MediaCodec></Encoders><Decoders><!-- video Decoder  --><MediaCodec name="OMX.qcom.video.decoder.mpeg4" type="video/mp4v-es" ><Quirk name="requires-allocate-on-input-ports" /><Quirk name="requires-allocate-on-output-ports"/><Quirk name="defers-output-buffer-allocation"/></MediaCodec></Decoders>
</MediaCodecs>

在标准的Android发行版中,可以在此处找到示例media_codecs.xml。 Stagefright服务解析系统/ etc / media_codecs.xml和system / etc / media_profiles.xml,以通过android.media.MediaCodecList和android.media.CamcorderProfile类将设备上支持的编解码器和配置文件公开给应用程序。 因此,您需要创建/编辑自己的media_codec.xml文件,并在AOSP构建期间将其复制到系统映像的system / etc目录中。

例子

要注册视频编解码器,您必须在解码器列表下添加新条目。 如果编码器在编码器列表下添加新条目。 为确保始终选择您的编解码器,请确保您的编解码器被列为特定MIME类型的第一个条目。 以下是media_codecs.xml文件中H.264编码器和解码器的示例。

H.264编码器示例,

</encoders><MediaCodec name="OMX.vendor-name.h264.encode" type="video/avc" ><Limit name="size" min="48x48" max="3840x2176" /><Limit name="bitrate" range="1-50000000" /></MediaCodec>
</encoders>
</Decoders><MediaCodec name="OMX.vendor-name.h264.decoder" type="video/avc" ><Limit name="size" min="32x32" max="3840x2176" /><Limit name="bitrate" range="1- 62500000" /></MediaCodec"bitrate" range="1-50000000" /></MediaCodec>
</Decoders>

其中,OMX.vendor-name.H264.encoder和OMX.vendor-name.H264.Decoder是组件的名称。 video / avc是组件的MIME类型。在该示例中,它表示AVC / H.264视频。接下来的两个语句表示编解码器的怪癖或特殊要求。现在您刚刚将自定义编解码器注册到了android框架。 ifile的。下一步是将您的编解码器集成到OMX层中。

OMX组件

什么是OpenMAX(OMX)?
OpenMAX(开放媒体加速)是一种免版税的跨平台(C语言编程接口)开放标准,用于加速嵌入式和移动设备上多媒体应用中的音频,视频和图像的捕获和呈现。 OpenMAX由非营利性技术联盟Khronos Group管理。 OpenMAX提供三层接口:

应用层(AL)
整合层(IL)
开发层(DL)
应用层(AL)
OpenMAX AL是多媒体应用程序(如媒体播放器)和平台媒体框架之间的接口。在Anroid中,该层暴露为mediacodec类。

整合层(IL)

OpenMAX IL是媒体框架和一组多媒体组件(如音频或视频编解码器)之间的接口。例如,在我们的例子中,它是Android上的StageFright或MediaCodec API。对于Windows,它是DirectShow。同样,Linux上的FFmpeg或Libav,或跨平台的GStreamer)。因此,如果要向Android OMAX层添加任何硬件编解码器支持,则必须在此层中完成。为此,您必须创建OMX组件和一个OMX插件,将您的自定义编解码器与Stagefright框架连接在一起。例如组件,可以参考Galaxy Nexus的示例插件,这里:hardware / ti / omap4xx / libstagefrighthw。

在OMAX IL层中添加自己的编解码器

根据OpenMAX IL组件标准创建组件。组件接口位于frameworks / native / include / media / OpenMAX / OMX_Component.h文件中。
创建一个OpenMAX插件,将您的组件与Stagefright服务相链接。有关创建插件的接口,请参阅frameworks / native / include / media / hardware / OMXPluginBase.h和HardwareAPI.h头文件。
将您的插件构建为产品Makefile中名为libstagefrighthw.so的共享库。该库将放在您的终端系统的/ system / lib中。该库将公开一个将由dlsym查找的createOMXPlugin符号。
OMXMaster调用addVendorPlugin,它在内部调用addPlugin(“libstagefrighthw.so”)。在addPlugin中,将查找createOMXPlugin,使用该函数初始化makeComponentInstance,destroyComponentInstance等的其他函数指针。
注意:

在某些情况下,这个“libstagefrighthw.so”库将由您的编解码器供应商作为预构建的二进制文件提供,因为它可能包含专有信息。在这种情况下,您的设备供应商将实施前两个步骤。在这种情况下,您只需要确保将模块声明为产品包。

开发层(DL)

OpenMAX DL是物理硬件之间的接口,例如数字信号处理器(DSP)芯片,CPU,GPU和软件,如视频编解码器和3D引擎。它允许编解码器/芯片供应商轻松集成支持OpenMAX DL的新硬件,而无需优化其低级软件。

Android中的OpenMAX核心实现:
可以从以下细节中参考Android中的OpenMAX实现。

源代码:/ AOSP / frameworks / av / media / libstagefright / omx
包含文件:/ AOSP / frameworks / native / include / media / openmax
共享库名:libstagefright_omx.so
对libstagefright的更改
在某些情况下,您可能需要将硬件编解码器组件支持的MIME类型添加到stagefright引擎。这告诉topfright引擎有关新支持的MIME类型的顶级应用程序框架。
必须在frameworks / av / media / libstagefright中的Acodec.cpp文件中添加支持。例如,如果您的MIME未在“MimeToRole”和“VideoCodingMapEntry”结构中列出,则需要将其包含在那里。例如,您可以参考“MEDIA_MIMETYPE_VIDEO_H263”来查看它是如何在libstagefright中注册的。

struct MimeToRole {const char *mime;const char *decoderRole;const char *encoderRole;};

References
https://source.android.com/devices/media/
https://www.khronos.org/files/openmax-al-1-1-quick-reference.pdf
https://www.khronos.org/openmax/

Portions of this page are reproduced from work created and shared by the Android Open Source Project and used according to terms described in the Creative Commons 2.5 Attribution License.

如何在Android Framework中添加自定义硬件编解码器?相关推荐

  1. android 最新sdk版本,详解如何在Android studio中更新sdk版本和build-tools版本

    一.首先看下Android开发用到的sdk目录: build-tools 保存着一些Android平台相关通用工具,比如adb.和aapt.aidl.dx等文件. aapt即Android Asset ...

  2. Android多个imei如何获取,如何在Android 10中获取IMEI号,这是获取在Android 10及以下Android 10中获取IMEI号的代码...

    如何在android 10中获取imei编号,这是获取在android 10及以下android 10中获取imei编号的代码. if (android.os.Build.VERSION.SDK_IN ...

  3. android led闪烁功能,如何在Android应用层中制作一个LED指示灯效果

    如何在Android应用层中制作一个LED指示灯效果 发布时间:2020-12-08 16:12:59 来源:亿速云 阅读:86 作者:Leah 本篇文章给大家分享的是有关如何在Android应用层中 ...

  4. android studio点击图片,如何在Android Studio中的模拟器图库中添加图像?

    如何在Android Studio中的模拟器图库中添加图像? 我正在开发图像过滤器应用程序. 但是,如果我没有任何图像,就无法真正尝试. 我知道我可以在电话中对其进行测试,但这并不相同,因为我需要错误 ...

  5. android开发使用c+_如何在Android项目中开始使用C ++代码

    android开发使用c+ by Onur Tuna 通过Onur Tuna 如何在Android项目中开始使用C ++代码 (How to start using C++ code in your ...

  6. 在java中添加源_关于Java:如何在Android Studio中添加链接的源文件夹?

    在Eclipse中,我可以将源文件夹作为"链接的源文件夹"添加到我的android项目中. 如何在Android Studio中实现同一目的? 或者是否可以添加外部文件夹以构建gr ...

  7. android中的后退功能,如何在Android应用中实现一个返回键功能

    如何在Android应用中实现一个返回键功能 发布时间:2020-11-23 16:28:56 来源:亿速云 阅读:89 作者:Leah 今天就跟大家聊聊有关如何在Android应用中实现一个返回键功 ...

  8. android getter不起作用,java - 如何在Android Studio中自动生成getter和setter

    java - 如何在Android Studio中自动生成getter和setter Android Studio中是否有一个快捷方式可以自动生成给定类中的getter和setter? 14个解决方案 ...

  9. android在java下建立模块,Android Studio:如何在Android模块中包含Java模块?

    在Android工作室我有一个Android模块,我们称之为MyAndroid.我还有一个Java模块(不是独立的JAR,而是模块中的完整Java项目),我们称之为MyJava.Android Stu ...

最新文章

  1. Arduino control Eeprom by IIC method of using device address in Arduino
  2. 三星s窗口共享android,三星s窗口共享(SideSync pc端)
  3. ASP.NET MVC 第一章 我们的第一个MVC例子
  4. python ide是什么意思_初学Python使用什么IDE会更好?
  5. 高通宣布与华为达成新专利授权协议,华为砸下18亿美元
  6. MyBatis查询返回类型为int,查询结果为空NULL,报异常解决
  7. 使用awt制作一个简易加法计算器
  8. cognos transformer 建一个85w数据的cube所用的时间,接优化
  9. MATLAB使用及介绍
  10. 服务器主板的无线驱动,给因特尔S2600CO服务器主板安装【SAS控制器】驱动
  11. python 战棋游戏代码实现(1):生物行走和攻击选择
  12. iPhone自定义手机铃声完整版教程
  13. C++ DISALLOW_COPY_AND_ASSIGN宏的作用
  14. 手机app邮箱如何和学校邮箱自动同步
  15. ASCII码表和常见键盘码
  16. edxp已激活模块_edxposed框架模块
  17. 2021-11-09 Cynthia XSS
  18. 青年时代历练和职业发展
  19. 使用python进行收据搜集示例之different_format_data_processing
  20. 区块链 aave源代码分析之二 闪电贷flashloan

热门文章

  1. 微信支付一 :公众号支付1
  2. # unity shader 后期轮廓(更新中)
  3. 什么是SHA系列算法,SHA-1和MD5算法有什么区别
  4. 服务器的GPU显示err,Nvidia GPU风扇和电源显示ERR!
  5. 阿凡达(Avatar)迄今为止最搞笑最靠谱的2个影评
  6. 服务器集群可视化监控-Prometheus+Grafana
  7. CCNA 初学(第一课)
  8. MTU介绍以及操作说明
  9. rosbag录制话题、播放话题多种模式
  10. javascript停止页面所有计时器