我们先通过gradle的方式进行引入,下一节我们讲一讲如何进行编译。

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

我们对ijkplayer封装成一个videoview

package com.yuanxuzhen.ijkplayerdemo;import tv.danmaku.ijk.media.player.IMediaPlayer;public abstract class VideoPlayerListener implements IMediaPlayer.OnBufferingUpdateListener, IMediaPlayer.OnCompletionListener, IMediaPlayer.OnPreparedListener, IMediaPlayer.OnInfoListener, IMediaPlayer.OnVideoSizeChangedListener, IMediaPlayer.OnErrorListener, IMediaPlayer.OnSeekCompleteListener {
}
package com.yuanxuzhen.ijkplayerdemo;import android.content.Context;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.FrameLayout;import androidx.annotation.NonNull;
import androidx.annotation.Nullable;import java.io.IOException;import tv.danmaku.ijk.media.player.IMediaPlayer;
import tv.danmaku.ijk.media.player.IjkMediaPlayer;public class VideoPlayerIJK extends FrameLayout {/*** 由ijkplayer提供,用于播放视频,需要给他传入一个surfaceView*/private IMediaPlayer mMediaPlayer = null;/*** 视频文件地址*/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, 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(String path) {if (TextUtils.equals("", mPath)) {//如果是第一次播放视频,那就创建一个新的surfaceViewmPath = path;createSurfaceView();} else {//否则就直接loadmPath = path;load();}}/*** 新建一个surfaceview*/private void createSurfaceView() {//生成一个新的surface viewsurfaceView = 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 {@Overridepublic void surfaceCreated(SurfaceHolder holder) {}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {//surfaceview创建成功后,加载视频load();}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {}}/*** 加载视频*/private void load() {//每次都要重新创建IMediaPlayercreatePlayer();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);}}
}

接下来开始使用

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"android:orientation="vertical"><com.yuanxuzhen.ijkplayerdemo.VideoPlayerIJKandroid:id="@+id/video_view"android:layout_width="match_parent"android:layout_height="200dp"/></LinearLayout>
package com.yuanxuzhen.ijkplayerdemo;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.util.Log;import java.io.File;import tv.danmaku.ijk.media.player.IMediaPlayer;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);VideoPlayerIJK videoPlayerIJK = findViewById(R.id.video_view);videoPlayerIJK.setListener(new VideoPlayerListener() {@Overridepublic void onBufferingUpdate(IMediaPlayer iMediaPlayer, int i) {Log.e("yuan", "onBufferingUpdate");}@Overridepublic void onCompletion(IMediaPlayer iMediaPlayer) {Log.e("yuan", "onCompletion");}@Overridepublic boolean onError(IMediaPlayer iMediaPlayer, int i, int i1) {Log.e("yuan", "onError");return false;}@Overridepublic boolean onInfo(IMediaPlayer iMediaPlayer, int i, int i1) {Log.e("yuan", "onInfo");return false;}@Overridepublic void onPrepared(IMediaPlayer iMediaPlayer) {Log.e("yuan", "onPrepared");}@Overridepublic void onSeekComplete(IMediaPlayer iMediaPlayer) {Log.e("yuan", "onSeekComplete");}@Overridepublic void onVideoSizeChanged(IMediaPlayer iMediaPlayer, int i, int i1, int i2, int i3) {Log.e("yuan", "onVideoSizeChanged");}});Log.e("yuan", "path="+DirUtil.getCacheDir(this) + File.separator +  "123.mp4");videoPlayerIJK.setVideoPath(DirUtil.getCacheDir(this) + File.separator + "123.mp4");videoPlayerIJK.start();}}

Android引入Ijkplayer相关推荐

  1. android无法播放视频文件格式,基于Android引入IjkPlayer无法播放mkv格式视频的解决方法...

    写在前面 项目中直接引用或者直接编译源码得到的ijkplayer在播放mkv文件时出现(-10000)的错误,去项目github查看了才知道,默认是不支持mkv和rmvb格式视频的播放的. 用了一天时 ...

  2. android 视频格式不能播放,Android引入IjkPlayer无法播放mkv格式视频的解决方案

    写在前面 项目中直接引用或者直接编译源码得到的ijkplayer在播放mkv文件时出现(-10000)的错误,去项目github查看了才知道,默认是不支持mkv和rmvb格式视频的播放的. 用了一天时 ...

  3. android引入开源库_为好目录引入开源:通过代码帮助公益组织

    android引入开源库 by Michael D. Johnson 迈克尔·约翰逊(Michael D.Johnson) 为好目录引入开源:通过代码帮助公益组织 (Introducing the O ...

  4. 解决方案:Android引入一个新的Module/AAR后,原APP的桌面图标改变

    问题描述: Android引入一个新的Module/AAR后,原APP的桌面图标改变了. 原因: 在创建工程时,Android Studio3.x会自动创建一个mipmap-anydpi-v26文件夹 ...

  5. Android 引入aar文件 Supplied String module notation ‘aar‘ is invalid

    Android 引入aar文件报错: Supplied String module notation 'aar' is invalid 解决 gradle中添加: repositories{flatD ...

  6. Android 引入OpenCL详细步骤

    鉴于为了演示搭建环境时遇到的坑和解决方法,本文写的非常长. 这篇文章是去年写完的,踩坑太多了,没舍得分享,今天还是拿出来帮帮大家. 提升native代码执行效率的方法主要有算法优化,比如for循环展开 ...

  7. android 基于ijkplayer项目进行的播放器

    jjdxm_ijkplayer 项目地址:jjdxm_ijkplayer 简介:基于 ijkplayer 简单的 UI 界面 当前项目是基于 ijkplayer 项目进行的播放器界面 UI 封装. 是 ...

  8. [JAR包] android引入JAR包,打包成JAR包,打包成Library项目,导入Library项目

    (1)项目导入JAR包: 1.在项目目录里建立一个libs目录,将外部jar包拷贝在里面. 2.右键点击项目,Bulid Path->Configure Build Path 3.在设置Libr ...

  9. android 引入 .so,android studio引入so库方法(示例代码)

    在Android Studio中引入so库,只需在app/jniLibs下放入so文件,然后在Module的build.gradle中加入: sourceSets { main { jniLibs.s ...

最新文章

  1. 她是直播聊学习成“网红”的北大博士,毕业后入职民办学校,年薪70万
  2. Matlab入门笔记
  3. webapi输出炜json_WebApi返回Json格式
  4. SpringBoot打包时提示:Perhaps you are running on a JRE rather than a JDK?
  5. Linux之CentOS防火墙及端口操作
  6. Sail(CodeForces - 298B )
  7. 寒窗苦读十多年,我的毕业论文只研究了一个「屁」
  8. 高仿真机器人助力临床医学发展
  9. Python 数据科学入门教程:NLTK
  10. aws python sns_使用AWS Lambd从AWS SNS读取时修改JSON消息
  11. LIBUV学习笔记(三)libuv中pipe/tty相关操作以及一个简单的unix域回射服务器/客户端例子...
  12. 智能DNS+双线机房
  13. 沸腾!阿里又开源了一项自研核心技术!
  14. 51单片机的定时器与计数器
  15. 51单片机之DS18B20
  16. 外挂制作--------NP认识
  17. win10计算机安全策略设置,win10系统重置本地安全策略所有设置的操作方法
  18. 粗浅看Struts2和Hibernate框架
  19. DotSoft.C3DTools.v7.0.0.3民用勘测地图和GIS工具集合
  20. 【CF613D】Kingdom and its Cities(虚树,动态规划)

热门文章

  1. 使用ASP.NET Core和Hangfire实现HTTP异步化方案
  2. 二、staticMetaObject’ is not a member of **
  3. Dialogs 介绍
  4. 微信小程序不同分享效果的实现
  5. 遍历列表的两种常见方式
  6. mysql 消息队列_一个简单的 MySQL 批量事务消息队列
  7. java利用xml生成excel_JAVA环境中基于XML的一种EXCEL报表生成方法
  8. 如何配置一个高效、漂亮、爱不释手的终端?
  9. face.evoLVe 人脸比对测试
  10. python网络爬虫从入门到实践 第5章 (二)