一起养成写作习惯!这是我参与「掘金日新计划 · 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) 调用
native_init
后进入android_media_MediaPlayer.cpp
执行初始化方法,JNI会调用Java层MediaPlayer
获取到mNativeContext
然后调用postEventFromNative
静态方法,从而把Native事件回调到Java层检查软引用MediaPlayer
正常。
构建函数
静态方法实现后接着是MediaPlayer
的构造方法,在构造方法中会执行native_setup
实现C++
中MediaPlayer
对象创建以及回调监听设置等。
- MediaPlayer()
- native_step()
播放资源设置
资源设置方法在底层会调用到nativeSetDataSource
方法还是由JNI接口实现。
- setDataSource()
- nativeSetDataSource
nativeSetDataSource
方法在cpp文件中并没有具体方法而是由动态注册方法实现。因为_setDataSource有重载方法,通过映射形式调用不同实现方法。例如Http形式传入映射到android_media_MediaPlayer_setDataSourceAndHeaders
Surface视图设置
设置Surface
同样也会调用到JNI接口在C++
底层创建surface对象来做展示。底层由android_view_Surface.cpp
实现创建窗口。
准备prepared
播放视频前调用prepareAsync()
方法进入准备状态。
- prepareAsync() C++代码中调用
prepareAsync
会进入到MediaPlayer
服务进程,在MediaPlayerService.cpp
中最终调用到mediaplayer.cpp
的prepareAsync_l()
方法。而最终底层实体播放器是AwesomePlayer
还是NuPlayer
就要看Android FrameWork
版本。
MediaPlayer服务
在setDataSource
函数中会有getMediaPlayerService
方法获取服务创建播放器。MediaPlayerService
创建方法内部会new Client
,该Client
是Java层的MediaPlayer
。底层服务通过IPC机制通信,Service创建Client使用相应播放器类型设置资源内容。
时序总流程
总体调用关系如下所示,通过Java向JNI接口调用C++代码。mediaPlayerService
作为服务根据上层逻辑通过Factory
找到对应播放器实例化实现播放器能力。 MediaPlayer.java -> android_media_mediaPlayer.cpp -> mediaplayer.cpp -> ServiceManager -> mediaPlayerService -> MediaPlayerFactory -> NuPlayer
源码参考
其他参考
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/20632.html