Android音视频开发系列-MediaPlayer源码解析

Android音视频开发系列-MediaPlayer源码解析一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情。 MediaPlayer状态机 状态 说明 Idle 播放器实例化或调用reset()后的状态 End 播放

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

MediaPlayer状态机

状态 说明
Idle 播放器实例化或调用reset()后的状态
End 播放器release()调用之后的状态
Error 播放器出错的状态,一般情况是在调用方法和初始化错误时发生
Initialized 播放器调用setDataSource()时
preparing 播放器调用prepareAsync()或prepare()时的状态,时间较短
prepared 播放器调用prepareAsync()或prepare()时经历preparing
Started 播放器调用start()方法后
Paused 播放器调用pause()方法后
Stopped 播放器调用stop()方法后
PlaybackCompleted 在播放器没有设置Loop循环模式下,播放一次后表示播放结束

MediaPlayer创建过程

static静态初始化

外部调用MediaPlayer实例化对象过程中,在调用native_setup之前在静态代码中会加载so文件。加载so文件是在构造函数之前,主要是加载和链接库文件media_jni.so。因此静态代码中也常常用来初始化全局数据和变量。

  • native_init()
static {
    System.loadLibrary("media_jni");
    native_init();
}
  • static void android_media_MediaPlayer_native_init(JNIEnv *env) image.png 调用native_init后进入android_media_MediaPlayer.cpp执行初始化方法,JNI会调用Java层MediaPlayer获取到mNativeContext然后调用postEventFromNative静态方法,从而把Native事件回调到Java层检查软引用MediaPlayer正常。 image.png

构建函数

静态方法实现后接着是MediaPlayer的构造方法,在构造方法中会执行native_setup实现C++MediaPlayer对象创建以及回调监听设置等。

  • MediaPlayer() image.png
  • native_step() image.png

播放资源设置

资源设置方法在底层会调用到nativeSetDataSource方法还是由JNI接口实现。

  • setDataSource() image.png
  • nativeSetDataSource image.png

image.png nativeSetDataSource方法在cpp文件中并没有具体方法而是由动态注册方法实现。因为_setDataSource有重载方法,通过映射形式调用不同实现方法。例如Http形式传入映射到android_media_MediaPlayer_setDataSourceAndHeaders

Surface视图设置

设置Surface同样也会调用到JNI接口在C++底层创建surface对象来做展示。底层由android_view_Surface.cpp实现创建窗口。 image.png

准备prepared

播放视频前调用prepareAsync()方法进入准备状态。 image.png

  • prepareAsync() image.png C++代码中调用prepareAsync会进入到MediaPlayer服务进程,在MediaPlayerService.cpp中最终调用到mediaplayer.cppprepareAsync_l()方法。而最终底层实体播放器是AwesomePlayer还是NuPlayer就要看Android FrameWork版本。

MediaPlayer服务

setDataSource函数中会有getMediaPlayerService方法获取服务创建播放器。MediaPlayerService创建方法内部会new Client,该Client是Java层的MediaPlayer。底层服务通过IPC机制通信,Service创建Client使用相应播放器类型设置资源内容。 image.png

image.png

时序总流程

总体调用关系如下所示,通过Java向JNI接口调用C++代码。mediaPlayerService作为服务根据上层逻辑通过Factory找到对应播放器实例化实现播放器能力。 MediaPlayer.java -> android_media_mediaPlayer.cpp -> mediaplayer.cpp -> ServiceManager -> mediaPlayerService -> MediaPlayerFactory -> NuPlayer

源码参考

其他参考

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/20632.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注