我来为你详细讲解“Android基于IJKPlayer视频播放器简单封装设计”的完整攻略。
一、概述
IJKPlayer是一款基于 FFmpeg 的高度定制化的多媒体播放框架,是 Android 平台上一款非常好用的音视频播放器,它支持几乎所有主流的音视频格式,且能够实时解码播放视频流,非常适合用来开发直播相关的应用。本文将会对 IJKPlayer 的基础使用进行简单介绍,并介绍如何对其进行简单的封装设计,以便更好地适用于实际项目。
二、环境搭建
在开始使用 IJKPlayer 之前,需要先进行环境搭建。在项目中添加 IJKPlayer 库的方法有多种,下面分别介绍两种方法:
方法一:利用 gradle 添加 IJKPlayer 库
在项目的 build.gradle 文件中添加以下代码,引用 IJKPlayer 库:
allprojects {
repositories {
maven { url "https://jitpack.io" }
}
}
dependencies {
implementation 'com.github.Rex570:ijkplayer:v0.8.8'
}
方法二:手动下载并导入 IJKPlayer
从 IJKPlayer GitHub 仓库 中下载所需版本的 IJKPlayer,解压后将其中的 libs 文件夹中的所有库文件添加到项目中即可。
三、基础使用
IJKPlayer 提供了丰富的 API 接口,可以方便地实现播放控制、画面渲染等功能。下面介绍 IJKPlayer 最基础的使用,完整示例代码如下:
import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.widget.FrameLayout;
import androidx.annotation.Nullable;
import tv.danmaku.ijk.media.player.IjkMediaPlayer;
import tv.danmaku.ijk.media.player.IjkMediaPlayer.OnCompletionListener;
import tv.danmaku.ijk.media.player.IjkMediaPlayer.OnErrorListener;
import tv.danmaku.ijk.media.player.IjkMediaPlayer.OnPreparedListener;
import tv.danmaku.ijk.media.player.IjkVideoView;
public class MainActivity extends Activity implements OnPreparedListener, OnCompletionListener, OnErrorListener {
private IjkVideoView mVideoView;
private FrameLayout mLayout;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mLayout = findViewById(R.id.layout);
mVideoView = new IjkVideoView(this);
mLayout.addView(mVideoView);
mVideoView.requestFocus();
IjkMediaPlayer.loadLibrariesOnce(null);
IjkMediaPlayer.native_profileBegin("libijkplayer.so");
mVideoView.setVideoURI(Uri.parse("your video url")); // 播放网络视频
mVideoView.setMediaController(new MediaController(this)); // 设置控制器
mVideoView.setOnPreparedListener(this); // 播放器准备完成监听
mVideoView.setOnCompletionListener(this); // 播放完毕监听
mVideoView.setOnErrorListener(this); // 播放出错监听
}
// 播放器准备完成回调方法
@Override
public void onPrepared(IMediaPlayer mp) {
mVideoView.start(); // 开始播放
}
// 播放完毕回调方法
@Override
public void onCompletion(IMediaPlayer mp) {
mVideoView.seekTo(0); // 重新播放
}
// 播放出错回调方法
@Override
public boolean onError(IMediaPlayer mp, int what, int extra) {
return false;
}
@Override
protected void onPause() {
super.onPause();
mVideoView.pause();
}
@Override
protected void onDestroy() {
super.onDestroy();
mVideoView.stopPlayback();
mVideoView.release(true);
mVideoView.stopBackgroundPlay();
IjkMediaPlayer.native_profileEnd();
}
}
上述代码为一个最基础的视频播放器实现。其中,IjkVideoView
是 IJKPlayer 提供的视频播放器控件, setVideoURI
方法用于设置播放的视频地址,setMediaController
方法用于设置播放控制器,setOnPreparedListener
方法用于监听播放器是否准备完成等,此处只是一个最简单的实现,更多 API 的使用详见官方文档。
四、封装设计
对 IJKPlayer 进行封装可以更好地适用于实际项目的需求,提高代码的可读性和维护性。下面给出一个简单的封装示例,封装后的播放器不再需要每次都写 IJKPlayer 的一堆代码,只需要简单的调用封装好的方法即可。
import android.content.Context;
import android.net.Uri;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import tv.danmaku.ijk.media.player.IjkMediaPlayer;
import tv.danmaku.ijk.media.player.IjkMediaPlayer.OnCompletionListener;
import tv.danmaku.ijk.media.player.IjkMediaPlayer.OnErrorListener;
import tv.danmaku.ijk.media.player.IjkMediaPlayer.OnPreparedListener;
import tv.danmaku.ijk.media.player.IjkVideoView;
public class IJKPlayerView extends FrameLayout implements OnPreparedListener, OnCompletionListener, OnErrorListener {
private IjkVideoView mVideoView;
private OnPlayerListener mListener;
public IJKPlayerView(@NonNull Context context) {
this(context, null);
}
public IJKPlayerView(@NonNull Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public IJKPlayerView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
LayoutInflater.from(context).inflate(R.layout.view_ijk_player, this, true);
mVideoView = findViewById(R.id.video_view);
mVideoView.setOnPreparedListener(this);
mVideoView.setOnCompletionListener(this);
mVideoView.setOnErrorListener(this);
mVideoView.requestFocus();
}
// 开始播放视频
public void start(String url) {
if (mVideoView != null) {
mVideoView.stopPlayback();
mVideoView.setVideoURI(Uri.parse(url));
}
}
// 视频准备完成回调方法
@Override
public void onPrepared(IMediaPlayer mp) {
mVideoView.start(); // 开始播放
if (mListener != null) {
mListener.onStart();
}
}
// 播放完毕回调方法
@Override
public void onCompletion(IMediaPlayer mp) {
if (mListener != null) {
mListener.onCompletion();
}
}
// 播放出错回调方法
@Override
public boolean onError(IMediaPlayer mp, int what, int extra) {
if (mListener != null) {
mListener.onError();
}
return false;
}
// 设置播放回调监听器
public void setOnPlayerListener(OnPlayerListener listener) {
this.mListener = listener;
}
// 释放播放器资源
public void release() {
mVideoView.stopPlayback();
mVideoView.release(true);
mVideoView.stopBackgroundPlay();
IjkMediaPlayer.native_profileEnd();
}
// 播放回调监听器
public interface OnPlayerListener {
void onStart(); // 开始播放回调方法
void onCompletion(); // 播放完成回调方法
void onError(); // 播放出错回调方法
}
}
上述代码中 IJKPlayerView
是对 IJKPlayer 的简单封装,使用时只需要调用该控件的 start
方法即可开始播放视频。同时还通过 setOnPlayerListener
方法设置播放回调监听器,可以在播放开始、播放完成、播放出错等时刻回调相应的方法。
五、总结
本文主要介绍了 IJKPlayer 的基础使用和简单封装设计,希望能够对需要开发视频播放器或直播相关应用的开发者有所帮助。在实际开发中,还需按照项目需求灵活运用 IJKPlayer 提供的 API 并进行更加深入的封装设计。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android基于IJKPlayer视频播放器简单封装设计 - Python技术站