博客
关于我
【一】Android MediaPlayer整体架构源码分析 -【初始化和创建】
阅读量:687 次
发布时间:2019-03-15

本文共 2859 字,大约阅读时间需要 9 分钟。

Android 10.0 MediaPlayer 初始化与创建流程分析

MediaPlayer在Android系统中是Audio/Video播放的核心组件,其初始化和创建流程涉及多个层次的技术实现。本文将详细分析MediaPlayer在Android 10.0版本中的初始化与创建过程,以帮助开发者深入理解其工作原理。


一、MediaPlayer的初始化和创建源码实现分析

MediaPlayer类在其静态代码块中首先加载名为media_jni的SO库,这是与其C++底层实现进行交互的关键步骤。静态代码块的执行时机早于类对象的创建,确保其作为一个全局初始化的操作。

1.1 native_init()实现分析

native层JNI方法native_init()通过Jvm层MediaPlayer类的class对象获取字段和方法索引。表明该方法负责初始化MediaPlayer类的相关字段和方法,使其能够与C++底层实现有效交互。具体处理如下:

  • 获取MediaPlayer类的class对象。
  • 获取字段mNativeContext,以便在后续操作中使用它来存储和访问native层MediaPlayer对象的指针。
  • 获取静态方法postEventFromNative,以便在需要时调用。
  • 获取字段mNativeSurfaceTexture,用于存储surface相关信息。
  • 进一步处理网络配置信息和视频数字版权管理(如Modular DRM)的相关结构体。

1.2 gPlaybackParamsFields.init()实现分析

该方法负责获取并缓存Java层PlaybackParams类中的字段和方法索引,从而在后续操作中灵活访问和修改参数。分别处理了播放速度、音质调整模式和视频同步相关参数。

1.3 gSyncParamsFields.init()实现分析

类似的,gSyncParamsFields.init()处理视频同步参数,获取并缓存SyncParams类的字段和方法索引,以支持音视频同步的相关操作。

1.4 gVolumeShaperFields.init()实现分析

该方法处理volume shaping相关参数,获取并缓存VolumeShaper配置信息。涉及视频音量调节的具体参数,如视频音量、XOffset等。

2. Java层MediaPlayer构造函数分析

MediaPlayer的构造函数负责初始化其内部状态和组件。其主要步骤包括:

  • 调用父类PlayerBase的构造函数,并传递音频播放属性和Player类型。
  • 创建Handler对象用于事件处理,确保其在正确的线程中执行。
  • 初始化TimeProvider用于处理MediaPlayer的时间信息。
  • 调用native层初始化方法,并传递当前MediaPlayer对象的弱引用,便于底层组件关联 到Java层对象。
public MediaPlayer() {    super(new AudioAttributes.Builder().build(), AudioPlaybackConfiguration.PLAYER_TYPE_JAM_MEDIAPLAYER);    mEventHandler = new EventHandler(this, Looper.myLooper());    mTimeProvider = new TimeProvider(this);    native_setup(new WeakReference<>(this));    baseRegisterPlayer();}

3. MediaPlayer的父类PlayerBase分析

MediaPlayer继承自PlayerBase类,其基本初始化工作由父类完成,包括:

  • 分配音频播放属性(AudioAttributes)。
  • 设置播放器状态为空闲状态。
  • 处理应用程序操作权限,确保MediaPlayer符合音频播放AppOp的要求。
public PlayerBase(@NonNull AudioAttributes attr, int implType) {    mAttributes = attr;    mImplType = implType;    mState = AudioPlaybackConfiguration.PLAYER_STATE_IDLE;}

4. native层MediaPlayer对象的初始化分析

在C++层,MediaPlayer的构造函数主要完成对象内部的初始化设置,包括:

  • 设置默认音频流类型为MUSIC。
  • 初始化当前播放状态为空闲状态。
  • 设置默认当前seek位置和寻找模式。
  • 初始化当前音频和视频尺寸。
  • 生成唯一的音频会话ID,并从AudioSystem获取。
MediaPlayer::MediaPlayer() {    mListener = NULL;    mCookie = NULL;    // 代表 MediaPlayer 对应的binder cookie    mStreamType = AUDIO_STREAM_MUSIC;    mAudioAttributesParcel = NULL;    mCurrentPosition = -1;    mCurrentSeekMode = SEEK_PREVIOUS_SYNC;    mSeekPosition = -1;    mSeekMode = SEEK_PREVIOUSSYNC;    mCurrentState = MEDIA_PLAYER_IDLE;    mPrepareSync = false;    mPrepareStatus = NO_ERROR;}

5. Event Handling机制分析

MediaPlayer内部使用EventHandler来接收和处理来自C++层的事件回调。通过switch语句处理不同的事件类型,如准备就绪、播放完成、缓存更新等。每个事件类型对应一个回调处理逻辑。

@Overridepublic void handleMessage(Message msg) {    if (mMediaPlayer.mNativeContext == 0) {        return;    }    switch (msg.what) {        case MEDIA_PREPARED:            // 处理准备事件,如初始化字幕轨迹            break;        // 其他事件类型类似    }}

结论

MediaPlayer的初始化与创建过程涉及多个层次的技术实现,包括Java层的逻辑配置、C++层的底层初始化和JNI层的交互。通过仔细分析这些步骤,可以更好地理解Android中音视频播放的核心机制。

转载地址:http://jopmz.baihongyu.com/

你可能感兴趣的文章
nodejs 读取xlsx文件内容
查看>>
nodejs 运行CMD命令
查看>>
Nodejs+Express+Mysql实现简单用户管理增删改查
查看>>
nodejs+nginx获取真实ip
查看>>
nodejs-mime类型
查看>>
NodeJs——(11)控制权转移next
查看>>
NodeJS、NPM安装配置步骤(windows版本)
查看>>
NodeJS、NPM安装配置步骤(windows版本)
查看>>
nodejs与javascript中的aes加密
查看>>
nodejs中Express 路由统一设置缓存的小技巧
查看>>
nodejs中express的使用
查看>>
Nodejs中的fs模块的使用
查看>>
NodeJS使用淘宝npm镜像站的各种姿势
查看>>
nodejs包管理工具对比:npm、Yarn、cnpm、npx
查看>>
NodeJs单元测试之 API性能测试
查看>>
nodejs图片转换字节保存
查看>>
nodejs在Liunx上的部署生产方式-PM2
查看>>
nodejs字符与字节之间的转换
查看>>
NodeJs学习笔记001--npm换源
查看>>
NodeJs学习笔记002--npm常用命令详解
查看>>