ijkplayer简介

基于FFmpeg的轻量级Android/iOS视频播放器

https://github.com/Bilibili/ijkplayer

导入方式

gradle导入


allprojects {repositories {jcenter()}
}dependencies {# required, enough for most devices.compile 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8'compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8'# Other ABIs: optionalcompile 'tv.danmaku.ijk.media:ijkplayer-armv5:0.8.8'compile 'tv.danmaku.ijk.media:ijkplayer-arm64:0.8.8'compile 'tv.danmaku.ijk.media:ijkplayer-x86:0.8.8'compile 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.8.8'# ExoPlayer as IMediaPlayer: optional, experimentalcompile 'tv.danmaku.ijk.media:ijkplayer-exo:0.8.8'
}

从github下载ijkplayer源码,进行编译

待实践

来个栗子

compile 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8'compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8'compile 'tv.danmaku.ijk.media:ijkplayer-armv5:0.8.8'compile 'tv.danmaku.ijk.media:ijkplayer-arm64:0.8.8'compile 'tv.danmaku.ijk.media:ijkplayer-x86:0.8.8'compile 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.8.8'compile 'tv.danmaku.ijk.media:ijkplayer-exo:0.8.8'

VideoPlayer(ijk没有给具体的view,需要我们自己封装)

public class VideoPlayer extends FrameLayout {private Context mContext;private IMediaPlayer mMediaPlayer;private SurfaceView surfaceView;public VideoPlayer(Context context) {super(context);}public VideoPlayer(Context context, AttributeSet attrs) {super(context, attrs);init(context);}private void init(Context context) {mContext = context;createSurfaceView();}private void createSurfaceView() {surfaceView = new SurfaceView(mContext);surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {@Overridepublic void surfaceCreated(SurfaceHolder holder) {}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {if (mMediaPlayer != null) {mMediaPlayer.setDisplay(holder);}}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {}});LayoutParams layoutParams =new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT,Gravity.CENTER);addView(surfaceView, 0, layoutParams);}//创建一个新的playerprivate IMediaPlayer createPlayer() {//todo 各个参数的含义IjkMediaPlayer ijkMediaPlayer = new IjkMediaPlayer();ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "opensles", 1);ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "overlay-format", IjkMediaPlayer.SDL_FCC_RV32);ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", 1);ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "start-on-prepared", 0);ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "http-detect-range-support", 1);ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_CODEC, "skip_loop_filter", 48);ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_CODEC, "min-frames", 100);ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "enable-accurate-seek", 1);ijkMediaPlayer.setVolume(1.0f, 1.0f);return ijkMediaPlayer;}//开始加载视频public void load(String mPath) throws IOException {if (mMediaPlayer != null) {mMediaPlayer.stop();mMediaPlayer.release();}mMediaPlayer = createPlayer();setListener(mMediaPlayer);mMediaPlayer.setDisplay(surfaceView.getHolder());mMediaPlayer.setDataSource(mContext, Uri.parse(mPath));mMediaPlayer.prepareAsync();}private void setListener(IMediaPlayer player) {player.setOnPreparedListener(new IMediaPlayer.OnPreparedListener() {@Overridepublic void onPrepared(IMediaPlayer iMediaPlayer) {if (mMediaPlayer != null) {mMediaPlayer.start();}}});player.setOnVideoSizeChangedListener(new IMediaPlayer.OnVideoSizeChangedListener() {@Overridepublic void onVideoSizeChanged(IMediaPlayer iMediaPlayer, int i, int i1, int i2, int i3) {}});}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();}}}

MainActivity

VideoPlayer videoPlayer = findViewById(R.id.video);try {videoPlayer.load("http://vjs.zencdn.net/v/oceans.mp4");} catch (IOException e) {Toast.makeText(this,"播放失败",Toast.LENGTH_SHORT);e.printStackTrace();}

效果:

参考资料

ijkplayer接入使用
https://www.jianshu.com/p/a57bbdd78798

ijkplayer踩坑记录
https://www.jianshu.com/p/0ae5924cc7d6*

ijkplayer系列1:ijkplayer介绍相关推荐

  1. 一步步实现windows版ijkplayer系列文章之二——Ijkplayer播放器源码分析之音视频输出——视频篇...

    一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...

  2. ijkplayer系列14:从入门到进阶问题树梳理

    ijkplayer系列14:从入门到进阶问题树梳理 基础准备 语法基础: C语言以及JNI开发是必备的能力 C语言语法简单复习 https://anacz.blog.csdn.net/article/ ...

  3. 一步步实现windows版ijkplayer系列文章之一Windows10平台编译ffmpeg 4.0.2,生成ffplay

    一步步实现windows版ijkplayer系列文章之一Windows10平台编译ffmpeg 4.0.2,生成ffplay 最近想研究下ffplay的代码,学习代码是枯燥无味的,也是抽象的,学习一个 ...

  4. 一步步实现windows版ijkplayer系列文章之三——Ijkplayer播放器源码分析之音视频输出——音频篇

    https://www.cnblogs.com/harlanc/p/9693983.html 目录 OpenSL ES & AudioTrack 源码分析 创建播放器音频输出对象 配置并创建音 ...

  5. automake java_一步步实现windows版ijkplayer系列文章之五——使用automake生成makefile

    #一步步实现windows版ijkplayer系列文章之五--使用automake一步步生成makefile 上一篇文章我们把ffmpeg库成功在windows平台下编译成dll了,ffmpeg的编译 ...

  6. SpringBoot 2.0 系列001 -- 入门介绍以及相关概念

    为什么80%的码农都做不了架构师?>>>    SpringBoot 2.0 系列001 -- 入门介绍以及相关概念 什么是SpringBoot? 项目地址:http://proje ...

  7. 提炼游戏引擎系列:开篇介绍

    前言 大家好!本系列记录了从炸弹人游戏中提炼2D游戏引擎YEngine2D雏形的实战过程,您可以通过本系列了解到引擎提炼的思想.引擎的设计以及引擎是如何从游戏中提炼的,学习引擎开发的知识.希望对您能有 ...

  8. WPF入门教程系列三——Application介绍(续)

    接上文WPF入门教程系列二--Application介绍,我们继续来学习Application 三.WPF应用程序的关闭 WPF应用程序的关闭只有在应用程序的 Shutdown 方法被调用时,应用程序 ...

  9. WPF入门教程系列四——Dispatcher介绍

    WPF入门教程系列四--Dispatcher介绍 一.Dispatcher介绍 微软在WPF引入了Dispatcher,那么这个Dispatcher的主要作用是什么呢? 不管是WinForm应用程序还 ...

  10. asp.net core 系列 19 EFCore介绍

    asp.net core 系列 19 EFCore介绍 原文:asp.net core 系列 19 EFCore介绍 一.概述 目前最新的EF Core版本是3.0,最稳定的EF Core版本是2.2 ...

最新文章

  1. [转载]去除文件中的^M
  2. 疯狂python讲义视频 百度云-每周一书《疯狂Python讲义》分享!
  3. 企业USB权限控制心得
  4. codeigniter在nginx安装配置及URL重写
  5. dos命令操作mysql数据库的常用语句
  6. “穿透”与“征兆”:长篇小说《环形女人》(一)
  7. nssl1209-奇怪的队列【贪心,权值线段树】
  8. ActionItemBadge:在actionbar上显示badge数字提示
  9. 36000+开发者,一周投稿超 23000 篇,谁能笑傲群雄?| 第4周周榜揭晓
  10. Android中Service的一个Demo例子
  11. 控制台——EventLog实现事件日志操作
  12. R语言中写入Excel的不同sheet表格
  13. 【TVM帮助文档学习】Relay的代数数据类型
  14. Android Provision源码分析
  15. 13万人12306信息泄露 小伙挨个发邮件通知
  16. 计算机开机最快设置,那些电脑开机速度击败全国99%的人,他们是怎么做到的?...
  17. 鼠标点击事件对象的clientX、pageX、offsetX、screenX、x
  18. button按钮的tittle 折行且居中显示
  19. matlab纵坐标两边标注,matlab纵坐标标注
  20. 技术人员帮助电商运营选择最合适的物流快递运输公司的5个切入点

热门文章

  1. 利用Karabiner和键盘修饰键修改MAC键盘,实现打字时双手不离开字母和数字区
  2. MySQL - 索引的数据结构
  3. 生日蛋糕(noi99)
  4. 最新上海个人养老保险缴费信息查询步骤
  5. 基本面分析中必须了解的88条避雷常识
  6. 命令行的迅雷,这样用会更香
  7. pytorch组队学习
  8. gdiPlus的imag::fromFile函数调用返回为空
  9. 浅谈动态规划 ——by cbw
  10. Android手机刷机介绍