今天写一篇介绍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")注释方法是为了避免调用更高版本的方法时出现警告信息。