Android OpenMAX(一)漫谈
在开始正式的学习前,我们先来聊一聊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组件)。
- 简单来讲,OMX IL层定义了
播放器可以分为如下几个部分: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(一)漫谈的更多相关文章
- android openmax hardware decoder 整合记录
欢迎访问我的blog:http://blog.thinkinside.me 关于android中openmax中hardware decoder的调用中,整合过程比较简单.主要是对OMXCodec的封 ...
- Android Multimedia框架总结(十三)CodeC部分之OpenMAX框架初识及接口与适配层实现
转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52629598 前言:上篇中介绍O ...
- Android多媒体开发-- android中OpenMax的实现整体框架
1.android中用openmax来干啥? android中的AwesomePlayer就 是用openmax来做(code)编解码,其实在openmax接口设计中,他不光能用来当编解码.通过他的组 ...
- Android中openmax实现框架
OMX中 OMXNodeInstance 负责创建并维护不同的实例,这些实例是根据上面需求创建的,以node作为唯一标识.这样播放器中每个OMXCodec在OMX服务端都对应有了自己的OMXNodeI ...
- android中OpenMax的实现【3】OMX中主要成员
原文 http://blog.csdn.net/tx3344/article/details/8117908 通过上文知道了,每个AwesomePlayer 只有一个OMX服务的入口,但是Awesom ...
- android中OpenMax的实现【2】AwesomePlayer中openmax的入口
AwesomePlayer 中有个变量 OMXClient mClient; 让我们看看 OMXClient class OMXClient { public: OMXClient(); stat ...
- Android多媒体开发-- OpenMax IL简介
1.openmax 简介 http://www.khronos.org/openmax/ OpenMax是一个多媒体应用程序的框架标准,由NVIDIA公司和Khronos在2006年推出. OpenM ...
- 漫谈android系统(4)bring up panel
点击打开链接 版权声明: 作者:alex wang 版权:本文版权归作者和CSDN共有 转载:欢迎转载,为了保存作者的创作热情,请按要求[转载],谢谢 要求:未经作者同意,必须保留此段声明:必须在文章 ...
- 漫谈国内外Android生态:华为发布的 HMS 服务,对 Mate30 系列无法搭载 Google GMS 的补偿有多大(原创)
如果既用过iPhone,也用过国际版Android,还用过国内的安卓,(并且这三种都用了半年以上),就能体会到GMS多重要.可以说,iOS的体验大幅度领先于国内的安卓,一多半的原因是国内安卓没有GMS ...
- Android中利用OpenMax 编程的基本流程
近期因为公司在做数字电视,播放器和模块由供应商打包一起卖,驱动调通了,但是播放器要硬件解码,和平台差异,原厂又没有相关文档,就自己试着看了一个系统的播放器流程,顺便整理了一下,也方便以后查询,希望对播 ...
随机推荐
- Drop 、Delete、Truncate的区别是什么
Drop .Delete.Truncate 的区别是什么? DROP 删除表结构和数据,truncate 和 delete 只删除数据 truncate 操作,表和索引所占用的空间会恢复到初始大小:d ...
- 批处理及有状态等应用类型在 K8S 上应该如何配置?
众所周知, Kubernetes(K8S)更适合运行无状态应用, 但是除了无状态应用. 我们还会有很多其他应用类型, 如: 有状态应用, 批处理, 监控代理(每台主机上都得跑), 更复杂的应用(如:h ...
- HarmonyOS NEXT调优工具Smart Perf Host高效使用指南
在软件开发的过程中,很多开发者都经常会遇到一些性能问题,比如应用启动慢.点击滑动卡顿.应用后台被杀等,想要解决这些问题势必需要收集大量系统数据.而在收集数据的过程中,开发者则需要在各种工具和命令之 ...
- Launching Teamviewer remotely through SSH
Launching Teamviewer remotely through SSH When you need to manage your Server remotely, but you can ...
- MMDeploy部署实战系列【第六章】:将编译好的MMdeploy导入到自己的项目中 (C++)
MMDeploy部署实战系列[第六章]:将编译好的MMdeploy导入到自己的项目中 (C++) 这个系列是一个随笔,是我走过的一些路,有些地方可能不太完善.如果有那个地方没看懂,评论区问就可以,我给 ...
- 《C# in depth》第5章C#5.0中的更改(十三)——異步枚舉器
一.異步枚舉 异步枚举器(Async Enumerator)是指一种异步迭代器,可以用于处理异步数据源.它允许我们以异步的方式逐个读取数据源中的元素. 在传统的同步枚举器中,当我们遍历一个集合时,程序 ...
- axiso封装
import axios from 'axios';import {Message } from 'element-ui'//element-ui提示框组件import config from './ ...
- 剑指offer03(Java)-数组中重复的数字(简单)
题目: 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任 ...
- 使用友盟+的APM服务实现对移动端APP的性能监控
简介: 对于信息系统服务,一般我们的重点监控对象都是核心的后端服务,通常会采用一些主流的APM(Application Performance Management)框架进行监控.告警.分析.那么对 ...
- [ELK] 生产环境使用 Elasticsearch Docker 镜像的优化选项
[ 配置内核设置 vm.max_map_count 至少为 262144 ] https://www.elastic.co/guide/en/elasticsearch/reference/curre ...