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

这篇具有很好参考价值的文章主要介绍了【学习】从零开发的Android音视频开发(13)——MediaCodec到OMX框架过程及其硬解码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

MediaCodec到OMX框架过程

在讲NuPlayer时,NuPlayer解码部分会创建MediaCodec,并且最终到达OMX框架,先看MediaCodec的init函数
【学习】从零开发的Android音视频开发(13)——MediaCodec到OMX框架过程及其硬解码
【学习】从零开发的Android音视频开发(13)——MediaCodec到OMX框架过程及其硬解码

从init函数中可以看到,首先创建了ACodec,并且初始化了ALooperAMessage,由于ACodec继承自AHandler,那么一套消息机制就有了。最后发送kWhatInit消息,收到消息的逻辑位于ACodec.cpp中
【学习】从零开发的Android音视频开发(13)——MediaCodec到OMX框架过程及其硬解码

主要是调用了ACodec的initiateAllocateComponent函数
【学习】从零开发的Android音视频开发(13)——MediaCodec到OMX框架过程及其硬解码

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

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

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

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

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

MediaCodec硬解码

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

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

从其函数的注释中我们可以看到其枚举了哪些编解码器
【学习】从零开发的Android音视频开发(13)——MediaCodec到OMX框架过程及其硬解码

接下来看一下Android系统中解码器的命名方式,软解码器通常是以OMX.google开头,硬解码器通常是以OMX.[hardware_vendor]开头,比如MTK的解码器以OMX.MTK开头,也有不遵守这个命名规范的,不以OMX.开头的情况也会被认为是软解码器
【学习】从零开发的Android音视频开发(13)——MediaCodec到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暂时不适合发布,所以不使用文章来源地址https://www.toymoban.com/news/detail-405300.html

到了这里,关于【学习】从零开发的Android音视频开发(13)——MediaCodec到OMX框架过程及其硬解码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【音视频笔记】Mediacodec+Muxer生成mp4,浏览器无法播放问题处理

    最近在测试视频录制功能时发现,AudioRecord + MediaCodec + MediaMuxer生成的MP4,PC浏览器无法播放 ,但是Android、Windows、Mac的播放器应用都能正常播放。虽然不禁想吐槽浏览器视频组件的容错性差,但我也意识生成的文件格式肯定也是有问题的。 然后尝试了合成MP4视频时,只保留视

    2024年02月07日
    浏览(50)
  • 5G到来未来五年,做纯应用的Android开发者如何学习通过音视频破局?附《578页NDK七大模块学习宝典》(1)

    “只懂应用层,目前越来越多的企业要求音视频技术,我该怎么办?” “到底该不该学习音视频,怎么抉择?\\\" “想从事音视频开发,该怎么入门?如何进阶 ?” 如果你有这样的问题,从侧面反映了你是一个积极向上,想不断努力来提升自己的人。 先从一个简单的问题聊起

    2024年04月23日
    浏览(42)
  • Android 音视频开发 - VideoView

    本篇文章主要介绍下Android 中的VideoView. VideoView是一个用于播放视频的视图组件,可以方便地在应用程序中播放本地或网络上的视频文件。 VideoView可以直接在布局文件中使用,也可以在代码中动态创建。 它封装了MediaPlayer和SurfaceView,提供了简单的接口来控制视频的播放和显示

    2024年04月08日
    浏览(79)
  • Android音视频开发 - MediaMetadataRetriever 相关

    MediaMetadataRetriever 是android中用于从媒体文件中提取元数据新的类. 可以获取音频,视频和图像文件的各种信息,如时长,标题,封面等. 需要申请 读写权限 . 这里我使用的是本地路径, 需要注意的是如果路径文件不存在,会抛出 IllegalArgumentException,具体的源码如下: 根据keyCode返回keyC

    2024年04月08日
    浏览(38)
  • Android音视频开发实战02-Jni

    JNI是Java Native Interface的缩写,是Java提供的一种机制,用于在Java代码中调用本地(C/C++)代码。它允许Java代码与本地代码进行交互,通过JNI,Java应用程序可以调用一些原生库或者操作系统API,以获取更好的性能和更强的功能支持。 使用JNI需要编写一些Native方法,并将其实现在

    2024年02月11日
    浏览(37)
  • Android音视频开发实战01-环境搭建

    FFmpeg 是一款流行的开源多媒体处理工具,它可以用于转换、编辑、录制和流式传输音视频文件。FFmpeg 具有广泛的应用场景,包括视频编解码、格式转换、裁剪、合并、滤镜等等。官网:https://ffmpeg.org/ FFmpeg 支持各种常见的音视频格式,例如 MP4、AVI、FLV、MOV、AAC、MP3、M4A 等等

    2024年02月10日
    浏览(36)
  • Android 音视频开发—MediaPlayer音频与视频的播放介绍

    Android多媒体中的——MediaPlayer,我们可以通过这个API来播放音频和视频该类是Androd多媒体框架中的一个重要组件,通过该类,我们可以以最小的步骤来获取,解码和播放音视频。 它支持三种不同的媒体来源: 本地资源 内部的URI,比如你可以通过ContentResolver来获取 外部URL(流

    2024年02月10日
    浏览(45)
  • 音视频开发系列(6)——全面了解Android MediaFormat

    MediaFormat 是 Android 平台中用于描述音视频格式的类,它提供了许多 API 用于设置和获取音视频的格式信息。以下是 MediaFormat 类的主要 API: 用于创建音频和视频格式的 MediaFormat 对象。需要指定媒体类型(例如 audio/mp4a-latm 或 video/avc)、媒体的采样率、通道数、码率、帧率等信

    2024年02月01日
    浏览(29)
  • Android开源计划-一周开发app,webrtc音视频开发

    题目 – 一周开发app计划 首批参与成员 -小巫 -墨香 -梦痕 -边城刀客 -徐cc 要求 – -每位认领者按照开源规范来做,代码规范和Android开发规范 -每位认领者必须拥有github账号,熟练使用git对代码进来管理 -每个人认领一个功能点或模块 -提出完善的解决方案并提供封装良好的库

    2024年04月08日
    浏览(34)
  • Android音视频开发(三)——MediaExtractor和MediaMuxer的使用

    了解了音视频的编解码过程,我们接下来使用一下经常跟MediaCodec一起搭配的MediaExtractor和MediaMuxer。最后会使用一个简单的demo来了解具体了解这两个工具类的使用过程。这一节我们就先不讲MediaCodec了,放到下节的demo。 Android提供了一个MediaExtractor类,可以用来 分离容器中的

    2024年02月01日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包