android 播放器封装,Android基于IJKPlayer视频播放器简单封装设计

播放器的简单设计

播放器基于IJKPlayer来设计的, 播放器大致分三层

1.播放内核(基于ijkMediaplayer)

2.播放器View

3.播放器的MediaController

1、封装播放内核

我们都知道需要播放一个视频需要三个过程 1.create MediaPlayer 2.MediaPlayer prepare 3.MediaPlayer 与 Surface 绑定

xinvideoplayer中使用了VideoManager来控制ijkmediaplayer 所有的操作

三个过程 我们使用 HandlerThread + Hander 来实现 第一个过程创建大致可能需要100ms左右,严重影响UI线程!!!

第一个过程: create MediaPlayer

new IjkMediaPlayer() 设置一些播放器回调方法

//IJK 的 Mediaplayer api 类似 Android 系统播放器api

//IMediaPlayer.class

public interface IMediaPlayer{

void setOnPreparedListener(IMediaPlayer.OnPreparedListener var1); //prepareAsync 之后回调方法

void setOnCompletionListener(IMediaPlayer.OnCompletionListener var1); //播放完成回调方法

void setOnBufferingUpdateListener(IMediaPlayer.OnBufferingUpdateListener var1);//当播放网络的数据流的buffer发生变化的时候

void setOnSeekCompleteListener(IMediaPlayer.OnSeekCompleteListener var1);//当seek定位操作完成后

void setOnVideoSizeChangedListener(IMediaPlayer.OnVideoSizeChangedListener var1);//当视频的大小第一次被知道或者发生改变时

void setOnErrorListener(IMediaPlayer.OnErrorListener var1);//当有发生错误

void setOnInfoListener(IMediaPlayer.OnInfoListener var1);//当有信息或者警告

void setOnTimedTextListener(IMediaPlayer.OnTimedTextListener var1); //当媒体的时间数据需要被显示

}

第二个阶段 prepare

mediaPlayer.prepareAsync(); 等待回调 IMediaPlayer.OnPreparedListener#onPrepare()

第三个阶段 给IJKMediaPlayer 绑定 Surface 呈现画面

mediaPlayer.setSurface();

2、播放器View

实现 播放器基本方法(IViewPlayer)和 播放内核回调方法(IMediaPlayerListener)

IMediaPlayerListener 是包装 IMediaPlayer所有接口并通过 Handle 发送到主线程中实现

//IVideoPlayer.java

interface IVideoPlayer{

void start();//开始播放

void pause();//暂停播放

void seekTo(long time); //seekto time

void release();//关闭播放

void setVideoPath();//设置视频路径

void onStartFullScreen();//全屏播放

void onBackFullScreen(); //退出全屏

void onResumeVideo();//播放器后台唤起

void onPauseVideo();//切换后台

int getCurrentState();//视频的当前状态

int getCurrentScreenState(); //当前屏幕的状态 例如小屏,大屏,竖屏

long getTcpSpeed();//获取网速

void switchVideoSource(String url,long delay);//切换清晰度 并流畅的切换

}

public interface MediaPlayerListenerextends IVideoPlayer{

void onPrepared();

void onAutoCompletion();

void onCompletion();

void onBufferingUpdate(int percent);

void onSeekComplete(long currentPosition);

void onError(int what, int extra);

void onInfo(int what, int extra);

void onVideoSizeChanged();

}

以上接口大致满足了所有播放器的功能要求!!

3.MediaController

public interface IVideoController{

//顾名思义

ViewbindPlayer(IVideoPlayer player);

void onChangeVideoStatus(IVideoPlayer player,int old_status, int new_status);

void onChangeScreenStatus(IVideoPlayer player,int old_status, int new_status);

boolean onChangedNetWork(int currentNetState);

void onVideoProgress(int percent, long curr_position, long duration);

void unbindPlayer(IVideoPlayer player);

boolean isLock();

void onVideoDefinitionSwitched();

void show();

void hide();

boolean isShowing();

BaseVideoPlayer#setVideoController()

播放器的简单接入使用

videoplayer.setVideoPath(url);

videoplayer.start();//开始播放

//如果需要后台暂停唤起继续播放

videoplayer.onVideoResume();

videoplayer.onVideoPause();

//如果需要后台暂停唤起继续播放

全屏时控制返回键问题:

if (!VideoPlayerUtils.onBackPressed()) {

//返回的正常逻辑

}

...

播放器的内部实现

eb450eb4a43cd231d25cae7b6e88f35a.png

预加载需求 & 复用播放器

69fca7e8fe563b0a6bd9eade6368285e.png

智能后台&唤起处理

0a24e1f081893e635a1b166cccf5e0c1.png

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值