Android多媒体浅析

时间:2021-04-14 20:34:58

发现Android影音系统超复杂的,个人水平有限,关注以下几个问题:

1. 系统如何选择多媒体引擎

2. 引擎如何选择编解码器

3. 分离器如何分离音视频

4. 视频解码播放过程如何使用OMX IL

5. 音频解码播放过程与ALSA的关系


1. 系统如何选择多媒体引擎

多媒体系统自上而下可分为三类,

  • 上层应用软件,就是在Android市场里下载的到的多媒体播放软件如Mobo player, Rock player等。
  • 系统级多媒体引擎,Android 2.3默认的是Stagefright,取代了之前繁琐的Opencore。
  • 系统级多媒体插件OMX IL层,用于音视频编解码。

Android系统启动时开启本地服务MediaPlayerService,全权负责多媒体控制。

Android多媒体浅析

上层调用setDataSource(),根据音视频文件的路径名称url选择合适的播放引擎。

getPlayerType()选择引擎的依据主要有两个:

1)url的开头名称如rtsp://, http://

2)  property_get()读取init.rc脚本相关信息。

选择成功后创建,本文讨论Android2.3默认的多媒体引擎Stagefright,它把具体任务全部交由AwesomePlayer实现。

 

2. 引擎如何选择编解码器

Android多媒体浅析

上层调用prepareAsync(),自上而下一直到AwesomePlayer开启一个准备音视频的事件,这个事件完成媒体播放前两大工作-即音视频分离和编解码配置。

Android多媒体浅析

先说编解码配置,通过findMatchingCodecs()找到合适的解码器,依据仍然是音视频文件的路径名称url。

具体地,在OMXCodec.cpp里有一个数据结构CodecInfo,

struct CodecInfo {

    const char *mime;     // 通过url得到的音视频信息

    const char *codec;    // 该多媒体引擎支持的编解码器

};

比如有一个音频文件jay.mp3存放于U盘根目录下,即url: /mnt/extsd/jay.mp3,

- 首先通过url得到mine: audio/mpeg,

- 然后通过mine找到匹配的codec: MP3Decoder,即MP3解码器。

- 找到解码器后,将其作为OMX的节点创建和配置。

 

3. 分离器如何分离音视频

Android多媒体浅析

finishSetDataSource_l()分离音视频轨道。

1)通过url得到数据源dataSource。

2)根据dataSource选择合适的分离器。

3)  将分离的音频源和视频源放入相应的全局变量里,以便播放时使用。

 

4. 视频解码播放过程如何使用OMX IL

视频播放部分参考博文 http://www.cublog.cn/u1/57901/showart_2423206.html

Android多媒体浅析

整个流程概括起来,就是把分离的视频源放入onVideoEvent事件,经OMX解码处理并转换成RGB格式后输出屏幕。

Android多媒体浅析

上层播放音视频调用start()即可,殊不知引擎在其中完成了巨大的工作量,先说视频,

Android多媒体浅析

drainInputBuffer()和fillOutputBuffer调用了OMX IL层进行视频解码,这里OMX节点mNode就是先前提到的解码器建立的。

mOMX->emptyBuffer和mOMX->fillBuffer是两个核心的回调函数,其实质如下图。

Android多媒体浅析

 

 5. 音频解码播放过程与ALSA的关系

Android多媒体浅析

AwesomePlayer把音频播放的任务交给AudioPlayer,AudioPlayer创建AudioTrack,AudioTrack线程与AudioFlinger服务线程通过类似管道的机制进行数据通信,AudioFlinger调用抽象层进入ALSA架构,openOutputStream()输出音频数据流。

关于音频播放系统参考博文 http://blog.csdn.net/DroidPhone/article/details/5941344