/**

  • 视频文件地址
    */
    private String mPath = “”;

private SurfaceView surfaceView;

private VideoPlayerListener listener;
private Context mContext;

public VideoPlayerIJK(@NonNull Context context) {
super(context);
initVideoView(context);
}

public VideoPlayerIJK(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
initVideoView(context);
}

public VideoPlayerIJK(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) {
super(context, attrs, defStyleAttr);
initVideoView(context);
}

private void initVideoView(Context context) {
mContext = context;

//获取焦点,不知道有没有必要
setFocusable(true);
}

/**

  • 设置视频地址。
  • 根据是否第一次播放视频,做不同的操作。
  • @param path the path of the video.
    */
    public void setVideoPath(St 《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】 ring path) {
    if (TextUtils.equals(“”, mPath)) {
    //如果是第一次播放视频,那就创建一个新的surfaceView
    mPath = path;
    createSurfaceView();
    } else {
    //否则就直接load
    mPath = path;
    load();
    }
    }

/**

  • 新建一个surfaceview
    */
    private void createSurfaceView() {
    //生成一个新的surface view
    surfaceView = new SurfaceView(mContext);
    surfaceView.getHolder().addCallback(new LmnSurfaceCallback());
    LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT
    , LayoutParams.MATCH_PARENT, Gravity.CENTER);
    surfaceView.setLayoutParams(layoutParams);
    this.addView(surfaceView);
    }

/**

  • surfaceView的监听器
    */
    private class LmnSurfaceCallback implements SurfaceHolder.Callback {
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
    }

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
//surfaceview创建成功后,加载视频
load();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
}

/**

  • 加载视频
    */
    private void load() {
    //每次都要重新创建IMediaPlayer
    createPlayer();
    try {
    mMediaPlayer.setDataSource(mPath);
    } catch (IOException e) {
    e.printStackTrace();
    }
    //给mediaPlayer设置视图
    mMediaPlayer.setDisplay(surfaceView.getHolder());

mMediaPlayer.prepareAsync();
}

/**

  • 创建一个新的player
    */
    private void createPlayer() {
    if (mMediaPlayer != null) {
    mMediaPlayer.stop();
    mMediaPlayer.setDisplay(null);
    mMediaPlayer.release();
    }
    IjkMediaPlayer ijkMediaPlayer = new IjkMediaPlayer();
    ijkMediaPlayer.native_setLogLevel(IjkMediaPlayer.IJK_LOG_DEBUG);

//开启硬解码 ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, “mediacodec”, 1);

mMediaPlayer = ijkMediaPlayer;

if (listener != null) {
mMediaPlayer.setOnPreparedListener(listener);
mMediaPlayer.setOnInfoListener(listener);
mMediaPlayer.setOnSeekCompleteListener(listener);
mMediaPlayer.setOnBufferingUpdateListener(listener);
mMediaPlayer.setOnErrorListener(listener);
}
}

public void setListener(VideoPlayerListener listener) {
this.listener = listener;
if (mMediaPlayer != null) {
mMediaPlayer.setOnPreparedListener(listener);
}
}

/**

  • -------======--------- 下面封装了一下控制视频的方法
    */

public void start() {
if (mMediaPlayer != null) {
mMediaPlayer.start();
}
}

public void release() {
if (mMediaPlayer != null) {
mMediaPlayer.reset();
mMediaPlayer.release();
mMediaPlayer = null;
}
}

public void pause() {
if (mMediaPlayer != null) {
mMediaPlayer.pause();
}
}

public void stop() {
if (mMediaPlayer != null) {
mMediaPlayer.stop();
}
}

public void reset() {
if (mMediaPlayer != null) {
mMediaPlayer.reset();
}
}

public long getDuration() {
if (mMediaPlayer != null) {
return mMediaPlayer.getDuration();
} else {
return 0;
}
}

public long getCurrentPosition() {
if (mMediaPlayer != null) {
return mMediaPlayer.getCurrentPosition();
} else {
return 0;
}
}

public void seekTo(long l) {
if (mMediaPlayer != null) {
mMediaPlayer.seekTo(l);
}
}
}

我们这个控件继承自framelayout。这个控件负责存放一个surfaceView和一个IMediaPlayer 。

3,设置监听器,我自己定义了一个监听器,继承了IMediaPlayer的n个listener。

public abstract class VideoPlayerListener implements IMediaPlayer.OnBufferingUpdateListener, IMediaPlayer.OnCompletionListener, IMediaPlayer.OnPreparedListener, IMediaPlayer.OnInfoListener, IMediaPlayer.OnVideoSizeChangedListener, IMediaPlayer.OnErrorListener, IMediaPlayer.OnSeekCompleteListener {
}

当我们继承这个抽象类的时候,最重要的是在onPrepared()方法中,让视频开始播放:

ijkPlayer.setListener(new VideoPlayerListener() {
@Override
public void onBufferingUpdate(IMediaPlayer mp, int percent) {
}

@Override
public void onCompletion(IMediaPlayer mp) {
}

@Override
public boolean onError(IMediaPlayer mp, int what, int extra) {
return false;
}

@Override
public boolean onInfo(IMediaPlayer mp, int what, int extra) {
return false;
}

@Override
public void onPrepared(IMediaPlayer mp) {
// 视频准备好播放了,但是他不会自动播放,需要手动让他开始。
mp.start();
}

@Override
public void onSeekComplete(IMediaPlayer mp) {

}

@Override
public void onVideoSizeChanged(IMediaPlayer mp, int width, int height, int sar_num, int sar_den) {
//在此可以获取到视频的宽和高
}
});

  1. 在xml中放入播放器控件
  2. 在activity中加载so包,设置监听器,设置路径

//加载native库
try {
IjkMediaPlayer.loadLibrariesOnce(null);
IjkMediaPlayer.native_profileBegin(“libijkplayer.so”);
} catch (Exception e) {
this.finish();
}
ijkPlayer.setListener(…)
ijkPlayer.setVideoPath(path);

记得在onStop()方法中关闭native库

IjkMediaPlayer.native_profileEnd();

Android-超好用的播放器——ijkplayer相关推荐

  1. Android 超好用的播放器——ijkplayer

    前言 ijkplayer是b站开源的超级好用的视频播放器喔,相信大家都早有耳闻.ijkplayer Android和ios都可用,还支持多种视频的硬解码.人生苦短,不如快点试一试. ijkplayer ...

  2. Android 超好用的播放器ijkplayer

    ijkplayer的github地址 ijkplayer的编译 gradle 现在可以直接使用gradle引入ijkplayer了.但是,如果需要对更多格式进行支持,还是需要自己编译一次. allpr ...

  3. Android应用开发--MP3音乐播放器滚动歌词实现

    Android应用开发--MP3音乐播放器滚动歌词实现 2013年6月2日  简.美音乐播放器开发记录 -----前话 有网友给我博客评论说,让我借鉴好的Android代码,代码贴出来的时候最好整体先 ...

  4. Android之简单本地音乐播放器

    平台:Android studio APK:http://fir.im/apps/56ea5187e75e2d69af000042 本地的音乐播放器,主要功能就是可以播放音乐,能够读取本地的音乐,并显 ...

  5. 基于Android的MediaPlayer的音乐播放器的封装

    基于Android的MediaPlayer的音乐播放器的封装 使用过android原生的mediaplayer来做音频播放的同学们,肯定是经历过一些痛苦的,因为android提供了一个状态机,确实这个 ...

  6. Android studio怎么实现swf播放器

    使用Android studio 怎么实现swf播放器 比较着急 求

  7. LZH_IJKPlayer-一个最简单使用的视频播放器,集成于bilibili开源直播播放器(ijkplayer)

    随着视频直播APP的迅速发展,许多APP也都会加入直播的功能,提高用户量.在网上也是寻找了许多直播的播放器,无意间发现Bilibili开源了一款播放器ijkplayer,想从最开始的步骤集成的同学可以 ...

  8. 深入DIY,打造超苗条绿色REAL播放器

    转自:   http://hi.baidu.com/cankyo/item/aeb8ed10740996423b176e6d 深入DIY,打造超苗条绿色REAL播放器 自从Real视频编码(RM和RM ...

  9. android 存放音频文件夹里,Android 实现简单的音乐播放器效果(音频文件的三种存放)...

    Android 实现简单的音乐播放器效果(音频文件的三种存放).三种方法主要使用到的类 MediaPlayer.create() getAssets() new Mediaplayer() - 几个控 ...

  10. android使用阿里云推流播放器记录

    android使用阿里云推流播放器记录: 在这里扯一句,如何删除csdn自己上传的资源:(参考:https://blog.csdn.net/qq_38122230/article/details/79 ...

最新文章

  1. 关于JVM 内存的 N 个高频面试问题!
  2. Cytoscape: MCODE增强包的网络模块化分析
  3. #1045 - Access denied for user 'root'@'localhost' (using password: NO)
  4. Django   MVC
  5. Java solr 分词
  6. jquery : 动态构建表单自动提交请求
  7. 服务器mysql显示链接次数太多,服务器mysql显示链接次数太多
  8. html 分页_MySQL——优化嵌套查询和分页查询
  9. 博客园 文章和随笔区别
  10. php -- PDO异常处理
  11. Mysql数据库的mysql Schema 究竟有哪些东西 手工注入的基础要领
  12. apt-get install的默认安装路径是什么
  13. python十以内加减法_【小学】 生成10以内的加减法
  14. mysql数据库题库和答案2016_哪位大侠可以提供一些mysql数据库的题库,一定要带答案的!将感激不尽!!...
  15. CRA与craco配置移动端
  16. NETDMIS5.0建立坐标系举例2023
  17. JavaScript如何截取指定位置的字符串
  18. LNK2019解决思路
  19. 李宏毅Transformer
  20. 全方位保护您在 Amazon S3 的数据资产-访问控制详解

热门文章

  1. python获取图片坐标_python提取照片坐标信息的实例代码
  2. H5开发app解决输入文本时,软键盘遮盖掉页面
  3. office2007word文件多选右键打印出错
  4. UG8.0工厂塑胶模具设计全过程视频教程
  5. linux系统下“rwx“的概念及用法~
  6. php 动态 常量,php常量
  7. 一个安全的传输通道是如何建立的?
  8. 开一家美发店有哪些需求?
  9. Vue Cli4 热更新失效,浏览器不会自动刷新内容
  10. 无法删除文件的解决方法