[Android]简易播放视频

作者: Coair_Scarlet | 来源:发表于2019-08-24 16:08 被阅读6次

    播放视频

    使用kotlin

    使用MediaController+VideoView实现方式视频播放和常用控制
    这种方式是最简单的实现方式,是Android原生框架提供的方法,有比较好的兼容性

    VideoView继承了SurfaceView同时实现了MediaPlayerControl接口,直接在layout中放置即可
    MediaController则是安卓封装的辅助控制器,带有暂停,播放,停止,进度条等控件,在播放前和VideoView关联即可

    demo介绍

    demo代码地址 https://git.dev.tencent.com/zhoulei26/coairPlayer.git
    demo整体介绍:
    一个MainActivity负责权限申请,layout中放置一个由navigation负责页面跳转的fragment。
    两个fragment,VideoFragment负责视频播放,VideoListFragment展示视频列表

    关键代码和解析

    下面通过关键点代码说明如何实现视频播放与控制 只展示关键代码
    布局文件 fragment_video.xml

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout 
        <VideoView
            android:id="@+id/videoView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            ... />
    
        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/btList"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="list"
            .../>
    
    
        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/btMode"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="单曲循环"  
            .../>
    
    
        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/btReplay"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="重播"
            .../>
    
    </androidx.constraintlayout.widget.ConstraintLayout>
    

    demo中有两个全局值,一个用于指示视频索引,一个是全部视频列表。项目中,可以封装到viewModle中

    /** 当前播放视频的索引 */
    var curIndexOfVideos = 0
    
    /** 视频地址列表 */
    val videoPathList = listOf(
        PathUtils.getExternalStoragePath() + File.separator + "routon" + File.separator +
                "3.avi",
        PathUtils.getExternalStoragePath() + File.separator + "routon" + File.separator +
                "1.mp4",
        PathUtils.getExternalStoragePath() + File.separator + "routon" + File.separator +
                "55747818-1-192.mkv"
    )
    
    关联VideoView与MediaController,播放视频
     /** 设置videoView视频地址 */
     fun setVideoPath() {
         videoView.setVideoPath(videoPathList[curIndexOfVideos])
     }
    
        
     override fun onActivityCreated(savedInstanceState: Bundle?) {
          ....
          setVideoPath()
         //创建MediaController对象
         val mediaController = MediaController(activity)
         //VideoView与MediaController建立关联
         videoView.setMediaController(mediaController)
         //让VideoView获取焦点
         videoView.requestFocus()
         //开始播放
         videoView.start()
         ...
    }
        
    
    播放控制
    下一曲\上一曲
    /** 播放下一曲 */
    fun palyNextView() {
        curIndexOfVideos++
        if (curIndexOfVideos == videoPathList.size) {
            curIndexOfVideos = 0
        }
        setVideoPath()
        videoView.start()
    }
    
    
     /** 播放上一曲 */
    fun playPrevVideo() {
        curIndexOfVideos--
        if (curIndexOfVideos < 0) {
            curIndexOfVideos = videoPathList.size - 1
        }
        setVideoPath()
        videoView.start()
    }
     //注册监听
    mediaController.setPrevNextListeners({
                //点击下一曲
                LogUtils.i("next")
                palyNextView()
            }, {
                 //点击上一曲
                LogUtils.i("prev")
                playPrevVideo()
            })
    
    暂停/播放 由MediaController自带实现
    循环模式
    //由一个标志位控制
    var singleCycle = false
    //点击bt控制该标志位
    btMode.apply {
        text = if (singleCycle) {
            "单曲循环"
        } else {
            "列表循环"
        }
        clickWithTrigger {
            singleCycle = !singleCycle
            text = if (singleCycle) {
                "单曲循环"
            } else {
                "列表循环"
            }
        }
    }
     //注册播放完成之后监听
    videoView.setOnCompletionListener {
        if (singleCycle) {
            //定位到开始位置,然后开始播放
            videoView.seekTo(0)
            videoView.start()
        } else {
             //播放下一曲
            palyNextView()
        }
    }
    
    重播
    btReplay.clickWithTrigger {
        //调用videoView自己方法
        videoView.resume()
    }
    
    列表点选播放

    一个简单的列表。点击修改全局变量curIndexOfVideos,然后返回视频界面

    相关文章

      网友评论

        本文标题:[Android]简易播放视频

        本文链接:https://www.haomeiwen.com/subject/tbdqectx.html