本文共 2859 字,大约阅读时间需要 9 分钟。
MediaPlayer在Android系统中是Audio/Video播放的核心组件,其初始化和创建流程涉及多个层次的技术实现。本文将详细分析MediaPlayer在Android 10.0版本中的初始化与创建过程,以帮助开发者深入理解其工作原理。
MediaPlayer类在其静态代码块中首先加载名为media_jni的SO库,这是与其C++底层实现进行交互的关键步骤。静态代码块的执行时机早于类对象的创建,确保其作为一个全局初始化的操作。
native层JNI方法native_init()通过Jvm层MediaPlayer类的class对象获取字段和方法索引。表明该方法负责初始化MediaPlayer类的相关字段和方法,使其能够与C++底层实现有效交互。具体处理如下:
该方法负责获取并缓存Java层PlaybackParams类中的字段和方法索引,从而在后续操作中灵活访问和修改参数。分别处理了播放速度、音质调整模式和视频同步相关参数。
类似的,gSyncParamsFields.init()处理视频同步参数,获取并缓存SyncParams类的字段和方法索引,以支持音视频同步的相关操作。
该方法处理volume shaping相关参数,获取并缓存VolumeShaper配置信息。涉及视频音量调节的具体参数,如视频音量、XOffset等。
MediaPlayer的构造函数负责初始化其内部状态和组件。其主要步骤包括:
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();} MediaPlayer继承自PlayerBase类,其基本初始化工作由父类完成,包括:
public PlayerBase(@NonNull AudioAttributes attr, int implType) { mAttributes = attr; mImplType = implType; mState = AudioPlaybackConfiguration.PLAYER_STATE_IDLE;} 在C++层,MediaPlayer的构造函数主要完成对象内部的初始化设置,包括:
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;} 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/