Android Media Framework(一)OpenMAX Spec阅读与框架简介

学习开源代码最快的方式是先阅读它的文档,再查看它的头文件,最后研读代码实现并进行编译调试。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

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

相关推荐
ii_best4 小时前
按键精灵支持安卓14、15系统,兼容64位环境开发辅助工具
android
美狐美颜sdk4 小时前
跨平台直播美颜SDK集成实录:Android/iOS如何适配贴纸功能
android·人工智能·ios·架构·音视频·美颜sdk·第三方美颜sdk
melonbo7 小时前
使用FFmpeg将H.264码流封装为MP4
ffmpeg·音视频·h.264
恋猫de小郭8 小时前
Meta 宣布加入 Kotlin 基金会,将为 Kotlin 和 Android 生态提供全新支持
android·开发语言·ios·kotlin
aqi009 小时前
FFmpeg开发笔记(七十七)Android的开源音视频剪辑框架RxFFmpeg
android·ffmpeg·音视频·流媒体
androidwork11 小时前
深入解析内存抖动:定位与修复实战(Kotlin版)
android·kotlin
慢行的骑兵11 小时前
Android音视频探索之旅 | CMake基础语法 && 创建支持Ffmpeg的Android项目
ffmpeg·音视频
梦天201511 小时前
android核心技术摘要
android
Just_Paranoid11 小时前
华为云Flexus+DeepSeek征文|基于Dify构建音视频内容转录工作流
华为云·音视频·dify·maas·deepseek·flexusx
go546315846512 小时前
修改Spatial-MLLM项目,使其专注于无人机航拍视频的空间理解
人工智能·算法·机器学习·架构·音视频·无人机