• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Android-视频播放器第三方框架之ijkplayer

android 搞代码 3年前 (2022-03-01) 13次浏览 已收录 0个评论
文章目录[隐藏]

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&#8230;

结尾:不要伪装致力,后果不会陪你演戏


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Android-视频播放器第三方框架之ijkplayer
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址