ijkplayer之start()方法介绍(ijkplayer播放器简介四)

今天写一篇介绍ijkplayer播放器的文章,同时也作为自己学习ijkplayer的记录和总结。言归正传,ijkplayer可以说是当今移动端播放器界的新宠,简单的接口设计,跨平台支持(同时支持IOS和Android),而且还开源,支持二次开发,基于这些优点,ijkplayer深受广大移动端音视频开发工作者的喜爱。

start()是ijkplayer开始播放媒体文件的接口方法,调用之后,纯音频文件播放音频(比如mp3),纯视频文件播放视频,音视频文件播放音频和视频,同时做好二者的同步播放工作。start()方法从java层调到native层的大致流程如下图所示:

start()在java层的具体实现:

public void start() throws IllegalStateException {
        stayAwake(true);
        _start();
    }

可以看出,最后还是调到了native方法_start(),后续的流程就如上图所示了。接下来我们可以聊一聊stayAwake()方法,它的定义:

@SuppressLint("Wakelock")
    private void stayAwake(boolean awake) {
        if (mWakeLock != null) {
            if (awake && !mWakeLock.isHeld()) {
                mWakeLock.acquire();
            } else if (!awake && mWakeLock.isHeld()) {
                mWakeLock.release();
            }
        }
        mStayAwake = awake;
        updateSurfaceScreenOn();
    }

这里ijkplayer通过调用stayAwake方法引入电量优化机制,并保证屏幕时钟亮起。因为Android系统本身会不断关闭各种硬件来延长手机的待机时间,如果在一段时间内没有任何操作,屏幕会逐渐变暗直至关闭,CPU进入低功耗的睡眠状态,系统这些机制都是为了节约更多的电量。在ijkplayer播放视频的过程中是不允许息屏的,为了防止屏幕自动变暗关闭,这里利用WakeLock保持CPU工作来防止屏幕关闭。WakeLock是一种锁的机制,只要应用拿着这个锁,CPU就无法进入休眠状态,一直处于工作状态。该方法最后会调到系统接口SurfaceHolder.setKeepScreenOn():

/**
     * Enable or disable option to keep the screen turned on while this
     * surface is displayed.  The default is false, allowing it to turn off.
     * This is safe to call from any thread.
     * 
     * @param screenOn Set to true to force the screen to stay on, false
     * to allow it to turn off.
     */
    public void setKeepScreenOn(boolean screenOn);

另外使用 @SuppressLint("Wakelock")注释方法是为了避免调用更高版本的方法时出现警告信息。