Android引入Ijkplayer"/>
Android引入Ijkplayer
我们先通过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=""xmlns:app=""xmlns: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
发布评论