首页 > 其他分享 >Android视频播放器——DKVideoPlayer

Android视频播放器——DKVideoPlayer

时间:2023-12-13 17:11:06浏览次数:44  
标签:播放器 case VideoView DKVideoPlayer 播放 break controller Android videoView

DKVideoPlayer介绍:

  1. 标星5k的Android视频播放器,支持原生VideoView组件核心,Bilibili的IjkPlayer组件核心,ExoPlayer组件核心,可切换核心

  2. 视频组件自带播放暂停,进度条,全屏,播放开始,播放结束,重新播放等ui样式。也可自己修改界面样式和功能

  3. 可设置静音,轮播,倍速,小窗,锁定播放界面,边播边缓存,视频截图,连续播放视频集,调整显示比例,或无组件纯视频播放

  4. 支持raw,assert,file,url

  5. 可播放在线视频流

DKVideoPlayer地址:https://github.com/Doikki/DKVideoPlayer

  坐标:

    # 必选,内部默认使用系统mediaplayer进行解码
    implementation 'xyz.doikki.android.dkplayer:dkplayer-java:3.3.7'
    # 可选,包含StandardVideoController的实现
    implementation 'xyz.doikki.android.dkplayer:dkplayer-ui:3.3.7'
    # 可选,使用exoplayer进行解码
    implementation 'xyz.doikki.android.dkplayer:player-exo:3.3.7'
    # 可选,使用ijkplayer进行解码
    implementation 'xyz.doikki.android.dkplayer:player-ijk:3.3.7'
    # 可选,如需要缓存或者抖音预加载功能请引入此库
    implementation 'xyz.doikki.android.dkplayer:videocache:3.3.7'

  使用:

    1. 基本使用:

      1.1添加布局:  

<xyz.doikki.videoplayer.player.VideoView
        android:id="@+id/player"
        android:layout_width="match_parent"
        android:layout_height="300dp" />

      1.2设置视频地址和控制器:

//videoView.setUrl("https://www.baidu.com/a.mp4") //播放网络视频
//videoView.setUrl("android.resource://" + getPackageName() + "/" + R.raw.movie") //播放raw文件里视频资源,连接格式 android.resourcde://com.dueeeke.dkplayer/"+R.raw.moveid
//videoView.setUrl("file:///android_asset/test.mp4") //播放assert里的视频 连接格式 file://android_asset/test.mp4
//videoView.setUrl("/sdcard/Alarms/xxx.mp4") //播放安卓本地路径视频 /sdcard/xxx
videoView.setUrl(String url); //设置视频地址
StandardVideoController controller = new StandardVideoController(this); 
controller.addDefaultControlComponent("标题", false); //controller设置为默认控制器
videoView.setVideoController(controller); //设置控制器
videoView.start(); //开始播放,不调用则不自动播放

      1.3播放生命周期:(implements xyz.doikki.videoplayer.player.VideoView.OnStateChangeListener)

       @Override
        public void onPlayerStateChanged(int playerState) {
            switch (playerState) {
                case VideoView.PLAYER_NORMAL://小屏

                    break;
                case VideoView.PLAYER_FULL_SCREEN://全屏

                    break;
            }
        }

        @Override
        public void onPlayStateChanged(int playState) {
            switch (playState) {
                case VideoView.STATE_IDLE:

                    break;

                case VideoView.STATE_PREPARING: //准备播放中
                    //在STATE_PREPARING时设置setMute(true)可实现静音播放
                    //mVideoView.setMute(true);
                    break;
                    
                case VideoView.STATE_PREPARED: //准备播放后 

                    break;
                case VideoView.STATE_PLAYING: //播放中 
                    //需在此时获取视频宽高
                    int[] videoSize = mVideoView.getVideoSize();
                    L.d("视频宽:" + videoSize[0]);
                    L.d("视频高:" + videoSize[1]);
                    break;
                    
                case VideoView.STATE_PAUSED: //播放暂停

                    break;
                case VideoView.STATE_BUFFERING:

                    break;
                case VideoView.STATE_BUFFERED: 

                    break;

                case VideoView.STATE_PLAYBACK_COMPLETED: //播放完成

                    break;
                case VideoView.STATE_ERROR:

                    break;
            }
        }

videoView.addOnStateChangeListener(this); //添加该播放状态监听器

    1.4在Activity中

@Override
    protected void onPause() {
        super.onPause();
        videoView.pause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        videoView.resume();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        videoView.release();
    }
    

    @Override
    public void onBackPressed() {
        if (!videoView.onBackPressed()) {
            super.onBackPressed();
        }
    }

<!-- AndroidManifest.xml -->
<activity
    android:name=".PlayerActivity"
    android:configChanges="orientation|screenSize|keyboardHidden"
    android:screenOrientation="portrait" /> <!-- or android:screenOrientation="landscape"-->

     完整代码

public class DKVideoPlayerActivity extends AppCompatActivity implements View.OnClickListener ,VideoView.OnStateChangeListener {
    private String uri = "android.resource://com.ruidiculous.mywebviewdemo/"+R.raw.gta6;
    private VideoView videoView;
    
    private Button btnLoop , btnVoiceSilence, btnVoiceResume;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_d_k_video_player);
        VideoViewManager.setConfig(VideoViewConfig.newBuilder()
                //使用使用IjkPlayer解码
                .setPlayerFactory(IjkPlayerFactory.create())
                .build());
        videoView = findViewById(R.id.videoView);
        videoView.setUrl(uri); //设置视频地址

        // 视频界面:封面,全屏,底部控制条,播放暂停等等
        StandardVideoController controller = new StandardVideoController(this);
        controller.addDefaultControlComponent("标题", false);
        videoView.setVideoController(controller); //设置控制器

        videoView.addOnStateChangeListener(this);
        videoView.start(); //开始播放,不调用则不自动播放

        btnLoop = findViewById(R.id.btnLoop);
        btnVoiceSilence = findViewById(R.id.btnVoiceSilence);
        btnVoiceResume = findViewById(R.id.btnVoiceResume);

        btnLoop.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch ( v.getId() ){
            case R.id.btnLoop:
                videoView.setLooping(true);
                break;
            case R.id.btnVoiceSilence:
                videoView.setMute(true);
                break;
            case R.id.btnVoiceResume:
                videoView.setMute(false);
                break;
        }
    }

    @Override
    public void onPlayerStateChanged(int playerState) {
    }

    @Override
    public void onPlayStateChanged(int playState) {
        switch (playState) {
            case VideoView.STATE_IDLE:
                break;

            case VideoView.STATE_PREPARING: //准备中
                Toast.makeText(this,"准备中",Toast.LENGTH_SHORT).show();
                break;

            case VideoView.STATE_PREPARED:  //准备完成
                Toast.makeText(this,"准备完成",Toast.LENGTH_SHORT).show();
                break;

            case VideoView.STATE_PLAYING: //播放中
                //需在此时获取视频宽高
                int[] videoSize = videoView.getVideoSize();
                L.d("视频宽:" + videoSize[0]);
                L.d("视频高:" + videoSize[1]);
                break;

            case VideoView.STATE_PAUSED: //暂停
                Toast.makeText(this,"暂停",Toast.LENGTH_SHORT).show();
                break;

            case VideoView.STATE_BUFFERING:
                break;

            case VideoView.STATE_BUFFERED:
                break;

            case VideoView.STATE_PLAYBACK_COMPLETED: //播放完成
                 Toast.makeText(this,"播放完成",Toast.LENGTH_SHORT).show();
                 break;

            case VideoView.STATE_ERROR:
                break;
        }
    }
}

  2.功能:

     重复播放:

videoView.setLooping(true);

    声音静音:

videoView.setMute(true);

    取消全屏:

            case xyz.doikki.videoplayer.player.VideoView.PLAYER_FULL_SCREEN://全屏
                videoView.setScreenScaleType(xyz.doikki.videoplayer.player.VideoView.SCREEN_SCALE_DEFAULT);
                videoView.stopFullScreen();
                break;

    暂停播放:

videoView.pause();

    开始播放:

videoView.start();

    释放资源:

videoView.release();

    倍速播放:

mVideoView.setSpeed(1.0f);

    视频截图:

                ImageView imageView = findViewById(R.id.iv_screen_shot);
                Bitmap bitmap = mVideoView.doScreenShot();
                imageView.setImageBitmap(bitmap);

 

    设置基本控制器:

      创建控制器对象,调用控制器对象.addDefaultControlComponent("标题", false)为控制器进行基础设置

StandardVideoController controller = new StandardVideoController(this);
controller.addDefaultControlComponent("标题", false); //控制器进行默认设置
videoView.setVideoController(controller); //设置控制器

    视频控制器具体:

      通过添加多类别界面组合整个视频播放UI界面,分为:自动完成播放界面,错误界面,标题界面,点播控制条界面。

       这里不用默认,自行添加需要的界面。

//视频界面:封面,全屏,底部控制条,播放暂停等等
        StandardVideoController controller = new StandardVideoController(this);
        //controller.addDefaultControlComponent("标题", false);
        controller.addControlComponent(new CompleteView(this));//自动完成播放界面
        
        controller.addControlComponent(new ErrorView(this));//错误界面

        TitleView titleView = new TitleView(this);//标题栏
        titleView.setTitle("标题!");
        controller.addControlComponent(titleView);

        //根据是否为直播设置不同的底部控制条
        VodControlView vodControlView = new VodControlView(this);//点播控制条
        MyVodControlView myVodControlView = new MyVodControlView(this);
        controller.addControlComponent(vodControlView);

        GestureView gestureControlView = new GestureView(this);//滑动控制视图
        controller.addControlComponent(gestureControlView);
        //根据是否为直播决定是否需要滑动调节进度
        controller.setCanChangePosition(true);
        videoView.setVideoController(controller); //设置控制器
        videoView.addOnStateChangeListener(this);
        videoView.start(); //开始播放,不调用则不自动播放
        // 视频已实现暂停,继续,拖动

       2. 修改或扩展功能

        比如要修改点播控制条,去除全屏功能。

        1. 复制VodControlView代码

        2. 对内部组件进行修改比如 mFullxxx.setVisiable(GONE);

          3. 调用controller.addControlComponent(myVodControlView); 添加自定义视图

 

完整项目代码

public class DKVideoPlayerActivity extends AppCompatActivity implements View.OnClickListener ,VideoView.OnStateChangeListener {
    private String uri = "android.resource://com.ruidiculous.mywebviewdemo/"+R.raw.gta6;
    private VideoView videoView;private Button btnLoop , btnVoiceSilence, btnVoiceResume;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_d_k_video_player);

        VideoViewManager.setConfig(VideoViewConfig.newBuilder()
                //使用使用IjkPlayer解码
                .setPlayerFactory(IjkPlayerFactory.create())
                .build());
        videoView = findViewById(R.id.videoView);
        videoView.setUrl(uri); //设置视频地址

        //视频界面:封面,全屏,底部控制条,播放暂停等等
        StandardVideoController controller = new StandardVideoController(this);
        //controller.addDefaultControlComponent("标题", false);
        controller.addControlComponent(new CompleteView(this));//自动完成播放界面

        controller.addControlComponent(new ErrorView(this));//错误界面

        TitleView titleView = new TitleView(this);//标题栏
        titleView.setTitle("标题!");
        controller.addControlComponent(titleView);

        //根据是否为直播设置不同的底部控制条
        VodControlView vodControlView = new VodControlView(this);//点播控制条

        MyVodControlView myVodControlView = new MyVodControlView(this);
        controller.addControlComponent(vodControlView);

        GestureView gestureControlView = new GestureView(this);//滑动控制视图
        controller.addControlComponent(gestureControlView);
        //根据是否为直播决定是否需要滑动调节进度
        controller.setCanChangePosition(true);
        videoView.setVideoController(controller); //设置控制器
        videoView.addOnStateChangeListener(this);
        videoView.start(); //开始播放,不调用则不自动播放
        // 视频已实现暂停,继续,拖动

        btnLoop = findViewById(R.id.btnLoop);
        btnVoiceSilence = findViewById(R.id.btnVoiceSilence);
        btnVoiceResume = findViewById(R.id.btnVoiceResume);
        btnLoop.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch ( v.getId() ){
            case R.id.btnLoop:
                videoView.setLooping(true);
                break;
            case R.id.btnVoiceSilence:
                videoView.setMute(true);
                break;
            case R.id.btnVoiceResume:
                videoView.setMute(false);
                break;
        }
    }

    @Override
    public void onPlayerStateChanged(int playerState) {
    }
@Override public void onPlayStateChanged(int playState) { switch (playState) { case VideoView.STATE_IDLE: break; case VideoView.STATE_PREPARING: //准备中 Toast.makeText(this,"准备中",Toast.LENGTH_SHORT).show(); break; case VideoView.STATE_PREPARED: //准备完成 Toast.makeText(this,"准备完成",Toast.LENGTH_SHORT).show(); break; case VideoView.STATE_PLAYING: //播放中 //需在此时获取视频宽高 int[] videoSize = videoView.getVideoSize(); L.d("视频宽:" + videoSize[0]); L.d("视频高:" + videoSize[1]); break; case VideoView.STATE_PAUSED: //暂停 Toast.makeText(this,"暂停",Toast.LENGTH_SHORT).show(); break; case VideoView.STATE_BUFFERING: break; case VideoView.STATE_BUFFERED: break; case VideoView.STATE_PLAYBACK_COMPLETED: //播放完成 Toast.makeText(this,"播放完成",Toast.LENGTH_SHORT).show(); break; case VideoView.STATE_ERROR: break; } } }

 

 

标签:播放器,case,VideoView,DKVideoPlayer,播放,break,controller,Android,videoView
From: https://www.cnblogs.com/remix777/p/17898915.html

相关文章

  • Android 端音频变声方案
    音频变声实质上是通过调整PCM数据的音调、节拍等属性,实现听感上的变化。如果是mp3、aac等压缩音频,则需提前解码成PCM数据,Android端可以通过MediaExtractor及MediaCodec解码得到PCM,但调整音调、节拍仅靠Androidapi就无能为力了,只能集成第三方库来实现,常见的音频处理......
  • 车机 Android 调节音量的三种方式及底层代码逻辑
    注意:本文基于Android12/S进行分析Qidi2023.07.20(MarkDown&EnterpriseArchitect&Haroopad)0.车机环境下音量调节的特殊性车机环境下的音频使用场景,相较于原始Android的音频使用场景,存在这些特殊性:使用专门的aDSP芯片进行音效处理;需要播放/控制原始Android......
  • Android用Dialog作遮照层组件
    1Dialog作蒙版,多层遮罩,布局编写,背景点击,背景样式,,2EditText不可点击,隐藏光标,键盘隐藏,多行显示,3RecyclerView设置最大高度,滚动条显示,4.自定义单选框5.dkVideoPlay6.pdf意义:Android里使用Dialog组件作为遮罩层步骤:1.继承DialogFragment类2.重写onCreate() ......
  • 怎么在Android项目中导入ffmpeg库?
    1.前言在这里我以导入静态库(.a)为例进行分析,动态库(.so)是类似的。在导入前,各位要先编译好ffmpeg库,需要注意的是在编译的时候要开启交叉编译,目标平台为Android,其他平台的库(windows,linux)在Android平台使用不了,我这里编译的是armeabi-v7a架构的库。2.步骤(1)新建一......
  • 360度解析Android动画:哪个更引人注目?
    介绍动画是Android应用中不可或缺的一部分,它可以让应用更加生动、有趣,还可以提升用户体验。Android提供了多种动画实现方式,在本文中,我们将深入研究Android动画的方方面面。从基本的View动画和属性动画开始。我们将介绍高级动画技巧,包括使用自定义插值器、实现复杂效果,以及性能优化......
  • android随手记(六)
    23.后台弹出界面AndroidQ之后的后台弹出需要申请悬浮窗权限(6.0后悬浮窗权限默认关闭,需要动态申请),如果是小米,vivo,oppo需要另外申请权限/***小米后台弹出界面检测方法**@paramcontext*@return*/publicstaticbooleancanBackgroundStart(Contextcontext){AppOpsMana......
  • android重启app
    code//获取当前应用的包名和类名StringpackageName=getPackageName();StringclassName=getClass().getName();//创建IntentIntentintent=newIntent(curAct,MainActivity.class......
  • 关于Android studio新版本和NEW UI显示返回按钮的设置
    1.新版Androidstudio问题因为在新版本的AndroidStudio中,默认情况下是没有直接的选项来显示返回上一步按钮在状态栏上的,可以通过以下方法来实现返回上一步的功能:在AndroidStudio的顶部菜单栏中,选择"View"。在"View"菜单中,选择"Appearance"。在"Appearance"子菜单中,勾选"Toolbar"......
  • 车机 Android 环境下利用 CarAudioService 实现自定义 Java 服务自启动
    注意:本文基于Android11进行分析Qidi2023.11.28(MarkDown&Haroopad)0.简介AndroidRO(ResourceOverlay)机制Overlay实现的效果正如其字面意思,就是“在原有效果的基础上再叠加一些效果”。Android提供了两种实现方式:编译时:https://source.android.com/docs/set......
  • 车机 Android 环境下利用 CarAudioService 实现自定义 Java 服务自启动
    注意:本文基于Android11进行分析Qidi2023.11.28(MarkDown&Haroopad)0.简介AndroidRO(ResourceOverlay)机制Overlay实现的效果正如其字面意思,就是“在原有效果的基础上再叠加一些效果”。Android提供了两种实现方式:编译时:https://source.android.com/docs/set......