在开始正式的学习前,我们先来聊一聊Android音视频开发中的一些问题、感受与想法。(有一点要事先说明,我的问题与答案、想法并不一定正确,请读者带着审慎的思考来阅读,后续的文章也是一样,希望读者边阅读边思考,看到错误可以指出让我改正,如有问题也可以提出一起讨论。)

  • 为什么要有Android OpenMAX?

    • Android系统可以跑在多种类型的设备上,比如说手机、电视、平板或者是现在的车机上,这些设备会有不同的芯片,手机用的比较多的是海思、高通、联发科,电视见的比较多的是AML、RTK,这些芯片厂商会有自己编解码器的实现(VPU API),Android作为一个通用的平台为了调用不同芯片的VPU API引入了OpenMAX框架,各大厂商实现Android OpenMAX框架提供的接口之后,开发者就可以用统一的接口使用硬件编解码了。
  • Android OpenMAX(OMX)和OpenMAX有什么异同?

    • 在网上搜寻资料,一般介绍OpenMAX框架会包含三层,自上而下分别是OMX AL层、OMX IL层、OMX DL层,每一层都定义有一套标准的API,但是在Android中只用到了IL层的部分并且做了部分裁减。
  • OMX IL层包含哪些内容呢?

    • 简单来讲,OMX IL层定义了编解码组件的结构(我们应该如何实现OMX组件,一个OMX组件包含哪些东西)、组件的调用接口(我们应该如何获取、管理、调用、控制OMX组件)。

播放器可以分为如下几个部分:IO、Demux、Control、Decoder、Render,一般来说IO和Demux可以看作是一部分,Control用于控制IO-Demux、Decoder、Render协同工作,数据在三个组件之间来回流转,所以我觉得播放器控制,实际指的是Buffer流转的控制,Buffer传递方式的控制。

回到Decoder中来,我们在看ACodec、OpenMAX代码时可能会感觉写的十分复杂,这是因为考虑了非常多的情况,以Buffer传递方式为例:

  • 对于普通Input buffer或者是普通Output Buffer,传递给Decoder时用共享内存可以减少Buffer的拷贝,共享内存可以在ACodec这一层分配,可以由OMX组件分配;
  • 对于需要加密的Secure Input Buffer,Buffer由OMX组件分配并且将Buffer Handle回传给ACodec使用,本质上是一块共享内存,只不过是加密的物理内存;
  • 如果需要渲染到Surface上,那么可以直接将解码后的数据直接存储到graphic buffer上,graphic buffer也是一块物理共享内存,ACodec与OMX组件之间的Buffer传递需要通过Fence和Handle来完成。

input/output buffer有多种类型,分配方式和传递方式也是各不相同,所以看代码只看流程是很难理解实现原理的,我们要知道Buffer是从哪儿分配的,从哪里来又到哪里去,不同状态下是如何控制的。

最后,也是非常重要的一点,我们还需要对音视频的基础知识有所了解。

目前就想到这么多,后续如果有想到其他内容会继续补充。

Android OpenMAX(一)漫谈的更多相关文章

  1. android openmax hardware decoder 整合记录

    欢迎访问我的blog:http://blog.thinkinside.me 关于android中openmax中hardware decoder的调用中,整合过程比较简单.主要是对OMXCodec的封 ...

  2. Android Multimedia框架总结(十三)CodeC部分之OpenMAX框架初识及接口与适配层实现

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52629598 前言:上篇中介绍O ...

  3. Android多媒体开发-- android中OpenMax的实现整体框架

    1.android中用openmax来干啥? android中的AwesomePlayer就 是用openmax来做(code)编解码,其实在openmax接口设计中,他不光能用来当编解码.通过他的组 ...

  4. Android中openmax实现框架

    OMX中 OMXNodeInstance 负责创建并维护不同的实例,这些实例是根据上面需求创建的,以node作为唯一标识.这样播放器中每个OMXCodec在OMX服务端都对应有了自己的OMXNodeI ...

  5. android中OpenMax的实现【3】OMX中主要成员

    原文 http://blog.csdn.net/tx3344/article/details/8117908 通过上文知道了,每个AwesomePlayer 只有一个OMX服务的入口,但是Awesom ...

  6. android中OpenMax的实现【2】AwesomePlayer中openmax的入口

    AwesomePlayer 中有个变量 OMXClient mClient; 让我们看看   OMXClient class OMXClient { public: OMXClient(); stat ...

  7. Android多媒体开发-- OpenMax IL简介

    1.openmax 简介 http://www.khronos.org/openmax/ OpenMax是一个多媒体应用程序的框架标准,由NVIDIA公司和Khronos在2006年推出. OpenM ...

  8. 漫谈android系统(4)bring up panel

    点击打开链接 版权声明: 作者:alex wang 版权:本文版权归作者和CSDN共有 转载:欢迎转载,为了保存作者的创作热情,请按要求[转载],谢谢 要求:未经作者同意,必须保留此段声明:必须在文章 ...

  9. 漫谈国内外Android生态:华为发布的 HMS 服务,对 Mate30 系列无法搭载 Google GMS 的补偿有多大(原创)

    如果既用过iPhone,也用过国际版Android,还用过国内的安卓,(并且这三种都用了半年以上),就能体会到GMS多重要.可以说,iOS的体验大幅度领先于国内的安卓,一多半的原因是国内安卓没有GMS ...

  10. Android中利用OpenMax 编程的基本流程

    近期因为公司在做数字电视,播放器和模块由供应商打包一起卖,驱动调通了,但是播放器要硬件解码,和平台差异,原厂又没有相关文档,就自己试着看了一个系统的播放器流程,顺便整理了一下,也方便以后查询,希望对播 ...

随机推荐

  1. 如何通过 kubectl 进入 node shell

    概述 假设这样一个场景: 生产环境中,Node 都需要通过堡垒机登录,但是 kubectl 是可以直接在个人电脑上登录的. 这种场景下,我想要通过 kubectl 登录到 K8S 集群里的 Node, ...

  2. 实验1 c语言开发环境使用和数据类型 运算符 表达式

    #include<stdio.h> #include<stdlib.h> int main() { printf(" O\n"); printf(" ...

  3. 【Windbg Preview】Failed to load data access DLL, 0x80004005

    最近使用Windbg的时候一直在用Preview版本,感觉解析一下就能直接加载起环境来太爽了.不过最近遇到一个dump加载不起来了. 但是最近一次加载却失败了,尝试了很久也不行 Failed to l ...

  4. eclipse 导入项目报错

    eclipse 导入项目报错 用的是jsp的项目,svn下来以后发现很多地方都报错,看了一圈下来,大部分的报错都是因为一些基本的jsp页面的import部分报错,但是import的都是java自带的包 ...

  5. 全链路灰度新功能:MSE 上线配置标签推送

    简介: 本文介绍了全链路灰度场景给配置管理带来的问题,介绍了 MSE 针对这一场景的解决方案,并通过实践的方式展示了配置标签推送的使用流程.后续,MSE 还会针对配置治理做更多的探索,帮助用户更好地解 ...

  6. 庖丁解牛-图解MySQL 8.0优化器查询解析篇

    ​简介: SQL优化器本质上是一种高度抽象化的数据接口的实现,经过该设计,客户可以使用更通用且易于理解的SQL语言,对数据进行操作和处理,而不需要关注和抽象自己的数据接口,极大地解放了客户的应用程序. ...

  7. 2019-10-31-VisualStudio-断点调试详解

    title author date CreateTime categories VisualStudio 断点调试详解 lindexi 2019-10-31 8:56:7 +0800 2019-06- ...

  8. vue.js写悬浮广告效果

    拿上一篇运行一下,感觉自己这个效果在边界处理的更好 <template> <div class="ad"> <p>vue广告悬浮</p&g ...

  9. vue-单独引入css文件,设置公共的css样式或者修改默认的vant,mint样式

    1.css文件夹下新建global.css文件并粘贴复制: ======================= :root{     --bgColor : #d3252a;     --pinkColo ...

  10. LLM优化:开源星火13B显卡及内存占用优化

    1. 背景 本qiang~这两天接了一个任务,部署几个开源的模型,并且将本地经过全量微调的模型与开源模型做一个效果对比. 部署的开源模型包括:星火13B,Baichuan2-13B, ChatGLM6 ...