简介

在Android开发中许多应用都需要用到视频播放,VideoView是最简单的视频播放器,学会使用VideoView是Android开发中必备的技能。

  • VideoView是使用MediaPlayer来对视频文件进行控制的。
  • VideoView只支持mp4、avi、3gp格式的视频,支持格式相对单一,VideoView支持的格式可以参考MediaPlayer。
  • VideoView可以播放网络视频,支持的网络视频的协议为:Http协议和RTSP协议两种。

常用方法

Android VideoView类为我们提供了十分方便的视频播放API,其主要方法如下:

  • setVideoPath:设置要播放的视频文件的位置
  • start:开始或继续播放视频
  • pause:暂停播放视频
  • resume:将视频从头开始播放
  • seekTo:从指定的位置开始播放视频
  • isPlaying:判断当前是否正在播放视频
  • getCurrentPosition:获取当前播放的位置
  • getDuration:获取载入的视频文件的时长
  • setVideoPath(String path):以文件路径的方式设置VideoView播放的视频源
  • setVideoURI(Uri uri):以Uri的方式设置视频源,可以是网络Uri或本地Uri
  • setMediaController(MediaController controller):设置MediaController控制器
  • setOnCompletionListener(MediaPlayer.onCompletionListener l):监听播放完成的事件
  • setOnErrorListener(MediaPlayer.OnErrorListener l):监听播放发生错误时候的事件
  • setOnPreparedListener(MediaPlayer.OnPreparedListener l):监听视频装载完成的事件

除了简单的操作和丰富的API以外,我们在装载视频时,无需进行编码,播放完成后也无需手动回收资源。

除了播放视频,Media Controller类则为我们提供了一个悬浮的操作栏,包含了播放,暂停,快进,快退,上一个,下一个等功能键。甚至连拖动进度条至某处播放都已经实现。在使用前VideoView和MediController需要相互指定控件。其内置方法有如下:

  • boolean isShowing:当前悬浮控制栏是否显示
  • setMediaPlayer(MediaController.MediaPlayerControl player):设置控制的组件
  • setPrevNextListeners(View.OnClickListener next,View.OnClickListener prev):设置上一个视频、下一个视频的切换事件。

默认情况下,Media Controller悬浮显示3s后隐藏,触摸响应的VideoView呼出。默认上一个,下一个按钮隐藏。

使用示例

播放在线视频流

声明权限

播放在线视频流需要使用网络权限,播放视频需要使用存储权限,将以下两行代码放到Mainfest.xml中

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

1670037171602.webp

将VideoView添加到一个Activity中

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <VideoView
        android:id="@+id/my_video"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

</androidx.constraintlayout.widget.ConstraintLayout>

如果想要设置该Activity横屏,可以看这篇文章

https://hash070.top/android-activity-orientation.html

编写播放视频代码

VideoView videoView = findViewById(R.id.video_view);
videoView.setVideoPath("http://live.bilibili.com");  //方式一:播放视频流.随便写一个视频播放地址
Uri uri = Uri.parse("/sdcard/Download/test.mp4");//方式二:将视频路径解析到uri,设定videoview的uri
videoview.setVideoURI(uri);

videoView.start();
MediaController mediaController = new MediaController(this);
videoView.setMediaController(mediaController);
mediaController.setMediaPlayer(videoView);

Q.E.D.