1.初始化准备
1.1 应用层的初始化准备
IjkVideoView.setVideoURI-->
IjkVideoView.openVideo {
// 将各类监听回调接口设置给IjkMediaPlayer。IjkVideoView对外也提供设置这些监听器的接口
mMediaPlayer = createPlayer(mSettings.getPlayer());
mMediaPlayer.setOnPreparedListener(mPreparedListener);
mMediaPlayer.setOnVideoSizeChangedListener(mSizeChangedListener);
mMediaPlayer.setOnCompletionListener(mCompletionListener);
mMediaPlayer.setOnErrorListener(mErrorListener);
mMediaPlayer.setOnInfoListener(mInfoListener);
mMediaPlayer.setOnBufferingUpdateListener(mBufferingUpdateListener);
mMediaPlayer.setOnSeekCompleteListener(mSeekCompleteListener);
mMediaPlayer.setOnTimedTextListener(mOnTimedTextListener);
}
2.消息回调机制实现过程
2.1 c层发送消息:通过jni回调java层函数:入口c层各种消息机制,如果msg_queue_put
msg_queue_put-->
inline static void post_event(JNIEnv *env, jobject weak_this, int what, int arg1, int arg2)
{
// 使用jni回调java层的IjkMediaPlayer.postEventFromNative
J4AC_IjkMediaPlayer__postEventFromNative(env, weak_this, what, arg1, arg2, NULL);
}
2.2 IjkMediaPlayer分发消息:入口IjkMediaPlayer.postEventFromNative
// 1.应用层接收到消息
@CalledByNative
private static void postEventFromNative(Object weakThiz, int what,
int arg1, int arg2, Object obj) {
@SuppressWarnings("rawtypes")
IjkMediaPlayer mp = (IjkMediaPlayer) ((WeakReference) weakThiz).get();
if (what == MEDIA_INFO && arg1 == MEDIA_INFO_STARTED_AS_NEXT) {
mp.start();
}
if (mp.mEventHandler != null) {
// 发送消息到EventHandler处理器
Message m = mp.mEventHandler.obtainMessage(what, arg1, arg2, obj);
mp.mEventHandler.sendMessage(m);
}
}
// 事件消息处理:真正的处理逻辑
private static class EventHandler extends Handler {
@Override
public void handleMessage(Message msg) {
IjkMediaPlayer player = mWeakPlayer.get();
switch (msg.what) {
case MEDIA_PREPARED:
player.notifyOnPrepared();
return;
case MEDIA_PLAYBACK_COMPLETE:
player.stayAwake(false);
player.notifyOnCompletion();
return;
case MEDIA_SEEK_COMPLETE:
// 调用播放器各类事件处理:先前“1.1 应用层的初始化准备”设置进来的回调函数
player.notifyOnSeekComplete();
return;
}
// 3.调用seekComplete处理这类事件
protected final void notifyOnSeekComplete() {
if (mOnSeekCompleteListener != null)
mOnSeekCompleteListener.onSeekComplete(this);
}
总结
1.IjkVideoView设置各类事件回调接口给IjkMediaPlayer
2.C调用IjkMediaPlayer的postEventFromNative处理消息
3.postEventFromNative将消息以消息形式发送给Handler,Handler处理消息的方式:分别调用之前 步骤1 设置进来的各类消息处理接口处理各类消息