【学习】从零开发的Android音视频开发(13)——MediaCodec到OMX框架过程及其硬解码

MediaCodec到OMX框架过程

在讲NuPlayer时,NuPlayer解码部分会创建MediaCodec,并且最终到达OMX框架,先看MediaCodec的init函数
在这里插入图片描述
在这里插入图片描述

从init函数中可以看到,首先创建了ACodec,并且初始化了ALooperAMessage,由于ACodec继承自AHandler,那么一套消息机制就有了。最后发送kWhatInit消息,收到消息的逻辑位于ACodec.cpp中
在这里插入图片描述

主要是调用了ACodec的initiateAllocateComponent函数
在这里插入图片描述

同样发送了一个kWhatAllocateComponent消息,消息中心收到后,会调用onAllocateComponent回调函数

在这里插入图片描述

通过该函数主要是先判断OMXClient和Server是否正常建立了连接,然后通过IOMX进行IPC通信,接着调用omx->allocateNode分配Node节点

同理看看onConfigureComponent
在这里插入图片描述

上面的代码会调用ACodec的configureCodec函数,由于太长不予展示,该函数用于构建一些编解码器,包括各种不同的音频编解码器和视频编解码器

MediaCodec硬解码

其调用的是在系统中注册过的解码器,硬件厂商会把自己的硬解码器注册进来,这就是硬解码(GPU负责),如果厂商注册一个软解码器,则是软解码(CPU负责)

MediaCodec并不是真正的编解码器,真正的编解码器在OMX中,要保证是硬解码,在MediaCodec里有接口可以枚举所有解码器,每种编码可能都有多个解码器,区分哪个是软解码哪个是硬解码就行。如通过mime构建MediaCode:MediaCodec mediacodec=MediaCodec.createDecoderByType("video/avc")

从其函数的注释中我们可以看到其枚举了哪些编解码器
在这里插入图片描述

接下来看一下Android系统中解码器的命名方式,软解码器通常是以OMX.google开头,硬解码器通常是以OMX.[hardware_vendor]开头,比如MTK的解码器以OMX.MTK开头,也有不遵守这个命名规范的,不以OMX.开头的情况也会被认为是软解码器
在这里插入图片描述

MediaCodec调用的是系统中注册的解码器,系统中可以存在很多解码器,但能够被应用的解码器是根据配置来的,即/system/etc/media_codecs.xml。这个文件一般由硬件或者系统的生产厂家在编译整个系统的时候提供,一般保存在代码的device/[company]/[codename]目录下。这个文件配置了系统中有哪些可用的Codec以及这些Codec对应的媒体文件类型。在这个文件里面,系统提供的软硬编解码器都需要被列出来。如果系统实际包含某个Codec但没配置在该文件中,那么应用程序也无法使用

在这个配置文件里如果出现多个Codec对应同样类型的媒体格式,这些Codec都会被保留。当系统使用时会选择第一个匹配的Codec,除非指明了要软还是硬解码。但在framework层为上层提供服务的AwesomePlayer处理音频和视频的时候对选择软硬解码的参数没有设置。所以虽然底层支持选择,但对于上层使用MediaPlayer的java程序来说还是只能接受默认的Codec选取规则

android提供的命令行程序/system/bin/stagefright在播放音频文件的时候,可以根据参数来选择软硬解码,但该工具只支持播放音频。一般来说如果系统有对应的媒体硬件解码器那么我们总是会用到。在极少数情况下硬件解码器存在但不配置,有可能是这个硬件解码器还有Bug暂时不适合发布,所以不使用

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android音视频开发是指在Android平台上进行音频和视频相关功能的开发。它涉及到音频的录制、播放,视频的采集、编码、解码和播放等方面。 在Android音视频开发中,可以使用Android提供的多媒体框架来实现各种功能。以下是Android音视频开发的一些关键点: 1. 音频开发: - 音频录制:可以使用AudioRecord类进行音频的录制,通过设置音频源、采样率、声道数等参数来实现。 - 音频播放:可以使用MediaPlayer类或AudioTrack类进行音频的播放,通过设置音频文件路径或音频数据来实现。 2. 视频开发: - 视频采集:可以使用Camera类或Camera2 API进行视频的采集,通过设置摄像头参数、预览尺寸等来实现。 - 视频编码:可以使用MediaCodec类进行视频的编码,通过设置编码器类型、编码参数等来实现。 - 视频解码:可以使用MediaCodec类进行视频的解码,通过设置解码器类型、解码参数等来实现。 - 视频播放:可以使用SurfaceView或TextureView进行视频的播放,通过设置视频文件路径或视频数据来实现。 3. 音视频处理: - 音频处理:可以使用AudioEffect类进行音频的处理,如混音、变声等。 - 视频处理:可以使用OpenGL ES进行视频的处理,如滤镜、特效等。 4. 直播和推流: - 直播:可以使用第三方库,如librtmp、FFmpeg等来实现音视频的直播功能。 - 推流:可以使用第三方库,如librtmp、FFmpeg等来实现音视频的推流功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值