应用层-Ijk-ffmpeg消息实现机制

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 设置进来的各类消息处理接口处理各类消息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值