版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liuzehn/article/details/89010961
今天写一篇介绍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")注释方法是为了避免调用更高版本的方法时出现警告信息。