Android Media Framework(一)OpenMAX 框架简介

2024-06-02 22:52

本文主要是介绍Android Media Framework(一)OpenMAX 框架简介,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

学习开源代码最快的方式是先阅读它的文档,再查看它的头文件,最后研读代码实现并进行编译调试。Android早期引入OpenMAX IL作为使用音视频编解码器的标准接口,了解Android Media框架的底层运行原理要从OMX IL开始。在这一节,我们将阅读整理OpenMAX IL Spec中的介绍和架构部分,以便对整个框架有一个初步的概念。

阅读材料openmax_il_spec_1_0.pdf可在khronos官网下载,也可在公众号后台回复ILSpec获取下载链接。

1、OMX IL简介

OpenMAX Integration Layer(OMX IL,集成层)是由Khronos Group开发的一套低层级标准接口,旨在为编解码器提供一定程度的抽象,使得嵌入式或移动设备能够统一调用音频、视频和图像编解码器,从而实现编解码器实现代码和调用代码的跨平台性。

OMX IL API由两大主要部分组成,分别是Core API和Component API。

  • OMX IL Component:在OMX IL中组件表示独立的功能模块,组件可能是source(源)、sinks(接收器)、codecs(编解码器)、filters(过滤器)或任何其他数据处理模块,组件需要依据Component API来实现。与组件之间的数据通信是通过称为端口的接口进行的,用户可以通过输入端口向组件发送数据,也可以通过输出端口接收数据。
  • OMX IL Core:Core API主要用于动态加载卸载组件,调用组件方法;

将OMX IL API封装并向上层提供高层级接口的部分被称为IL Client(客户端),IL Client使用OMX Core来加载组件,卸载组件,调用组件的方法。

为什么Android要引入OMX IL?

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

2、OMX Component States

OMX IL为组件定义了一些状态,组件使用过程中会经历一系列的状态转换。OMX IL定义的状态有Unloaded、Loaded、Idle、Executing、Paused、WaitForResources、Invalid,但Android中实际用到的只有Loaded、Idle、Executing、Invalid,因此后文中我们只介绍这么多。

  • Loaded:组件创建后就会进入Loaded状态,表示组件已经加载完成。
  • Idle:组件获取到运行所需要的资源,但是还没开始处理数据,这时候处在Idle(空闲)状态。
  • Executing:组件正在运行、处理数据,这时候处在Executing状态。
  • Invalid:组件运行或配置过程中出现错误进入到Invalid状态。

3、OMX Component Architecture

spec中有一个OMX IL组件的架构图,看懂它大致就能了解一个OMX组件应该如何实现了,这里对架构图做简单描述:

  • OMX IL Client或其他组件需要使用组件句柄操作组件,组件操作可以划分为三类:
    • 参数、配置的设定与获取,这些操作是同步执行的,调用完即返回结果;
    • 命令的发送,OMX组件需要维护一个Command Queue,OMX IL API使用异步编程的思想,应用层可能会连续下发多个命令,因此使用队列处理命令事务;
    • input、output buffer的发送,input buffer填充完成后送给编解码器使用,output buffer使用完成后送给编解码器重新填充;
  • 在Android中组件会有两个端口input、output port,每个port维护有一个队列,队列中存储的是Buffer Header的指针,Buffer Header是一个结构体,指向真正的数据缓冲区。
  • OMX组件的数据输出通过Callback完成,总共有三个callback:
    • input port callback:将用完的input buffer送回给IL Client;
    • output port callback:将填充好的output buffer送回给IL Client;
    • event callback:将OMX组件生成的事件发送给IL Client;

4、Communication Behavior

这一节对port有更多的描述,port存储有组件定义的要用的buffer的最小数量,buffer可能是由OMX组件自己分配,也有可能是使用预先分配的。port中的每一个buffer都会关联到一个Buffer Header,Buffer Header除了指向缓冲区外还存储有与缓冲区关联的metadata(元数据)。

5、Tunneled Buffer Allocation and Sharing

关注公众号《青山渺渺》获取更多音视频开发内容

image

这篇关于Android Media Framework(一)OpenMAX 框架简介的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1025323

相关文章

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF