Android 视频播放器第三方框架之ijkplayer
一:介绍
ijkplayer是b站开源的超级好用的视频播放器喔,置信大家都早有耳闻。ijkplayer Android和ios都可用,还反对多种视频的硬解码
二:应用
第一步:增加依赖
dependencies { //个别这2个曾经足够用了,这是增加了一个armv7a的cpu架构,反对armv7a和arm64笼罩了大部分手机 //required, enough for most devices. implementation 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8' implementation 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8' // Other ABIs: optional //这里x86 x86_64针对平板和模拟器 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' //ExoPlayer as IMediaPlayer: optional, experimental implementation 'tv.danmaku.ijk.media:ijkplayer-exo:0.8.8' }
第二步:增加3个so库
看到咱们是在libs下配置的·so库
须要app在build.gradle下
android{ defaultConfig{ ndk { //抉择要增加的对应cpu类型的.so库。,打包编译只会减轻一个armeabi-v7a,so库 abiFilters 'armeabi-v7a' } } //应为在libs下配置的须要定位到,如果是在src/main创立jniLibs文件夹就须要上面 sourceSets { main { jniLibs.srcDirs = ['libs'] } } }
三个so库libijkffmpeg.so封装解码的应用,libijkplayer.so视频播放的,libijksdl.so
第三步:创立一个View
public class MyIjkVideoView extends FrameLayout { private Context mContext;//上下文 private IMediaPlayer mMediaPlayer = null;//视屏播放 private TextView subtitleDisplay;//字幕View private SurfaceView surfaceView;//视图次要实用于被动更新,例如频繁地刷新 private VideoPlayerListener listener;//jiant /** * 视频文件地址 */ private String mPath = ""; private boolean mEnableBackgroundPlay = false;//是否开启后盾服务 public MyIjkVideoView(@NonNull Context context) { super(context); initVideoView(context); } public MyIjkVideoView(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); initVideoView(context); } public MyIjkVideoView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initVideoView(context); } /** * 初始化VideoView */ private void initVideoView(Context context) { mContext = context; //是否开启后盾播放,如果开启了后盾播放,就启动一个Service来做后盾播放。 initBackground(); //初始化渲染器,创立SurfaceView或TextureView,并addView()。(IjkVideoView是FrameLayout) initRenders(); //焦点 setFocusable(true); setFocusableInTouchMode(true); requestFocus(); //字幕View subtitleDisplay = new TextView(context); subtitleDisplay.setTextSize(24); subtitleDisplay.setGravity(Gravity.CENTER); FrameLayout.LayoutParams layoutParams_txt = new FrameLayout.LayoutParams( FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM); addView(subtitleDisplay, layoutParams_txt); } private void initRenders() { } private void initBackground() { //这里相当于没有进去,具体须要再解决 if (mEnableBackgroundPlay) { MediaPlayerService.intentToStart(getContext()); mMediaPlayer = MediaPlayerService.getMediaPlayer(); } } /** * 设置视频地址。 * 依据是否第一次播放视频,做不同的操作。 * * @param path the path of the video. */ public void setVideoPath(String 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(@NonNull SurfaceHolder holder) { //在SurfaceView创立 } @Override public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) { //在SurfaceView扭转,加载视屏 load(); } @Override public void surfaceDestroyed(@NonNull SurfaceHolder holder) { //在SurfaceView销毁 } } /** * 加载视屏 */ private void load() { //每次都要从新创立IMediaPlayer createPlayer(); try { mMediaPlayer.setDataSource(mPath); } catch (IOException e) { e.printStackTrace(); } //给mediaPlayer设置视图 mMediaPlayer.setDisplay(surfaceView.getHolder()); mMediaPlayer.prepareAsync(); } 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.setOnErrorListener(listener); mMediaPlayer.setOnCompletionListener(listener); } } public void setListener(VideoPlayerListener listener) { this.listener = listener; if (mMediaPlayer != null) { mMediaPlayer.setOnPreparedListener(listener); } } public interface VideoPlayerListener extends IMediaPlayer.OnPreparedListener, IMediaPlayer.OnCompletionListener, IMediaPlayer.OnErrorListener { } /**上面配置一些暂停,开始,进行等办法*/ public boolean isPlaying() { if (mMediaPlayer != null) { return mMediaPlayer.isPlaying(); } return false; } public void start() { if (mMediaPlayer != null) { mMediaPlayer.start(); } } 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 void release() { if (mMediaPlayer != null) { mMediaPlayer.reset(); mMediaPlayer.release(); mMediaPlayer = null; } } }
在布局中应用View
<com.ruan.mygitignore.MyIjkVideoView android:id="@+id/ijk_video" android:layout_width="match_parent" android:layout_height="match_parent"/>
第四步:调用
MyIjkVideoView ijkVideoView=findViewById(R.id.ijk_video); String url = "https://wdl.wallstreetcn.com/41aae4d2-390a-48ff-9230-ee865552e72d"; //加载本地库 IjkMediaPlayer.loadLibrariesOnce(null); IjkMediaPlayer.native_profileBegin("libijkplayer.so"); //监听 ijkVideoView.setListener( new MyIjkVideoView.VideoPlayerListener() { @Override public void onCompletion(IMediaPlayer iMediaPlayer) { Log.d("aa","实现"); } @Override public boolean onError(IMediaPlayer iMediaPlayer, int i, int i1) { Log.d("aa","失败"); return false; } @Override public void onPrepared(IMediaPlayer iMediaPlayer) { Log.d("aa","筹备"); } }); //设置门路 ijkVideoView.setVideoPath(url); //开始加载 ijkVideoView.start();
上面是一个gitHub上官网的例子
https://github.com/Bilibili/i…
结尾:不要伪装致力,后果不会陪你演戏