一、简介

下面简单介绍一下VideoView:

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

二、VideoView常用方法

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呼出。默认上一个,下一个按钮隐藏。

三、使用VideoView实现视频播放

下面我们将展示如何使用VideoView播放香港卫视的视频流:

1. 声明权限

需要在AndroidManifest.xml添加两条权限。

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

两条权限分别为:网络访问权限、访问文件系统的权限。

2. 编写VideoView布局

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><VideoViewandroid:id="@+id/video_view"android:layout_width="match_parent"android:layout_height="wrap_content" /></LinearLayout>
</android.support.constraint.ConstraintLayout>

3. 编写播放视频代码

VideoView videoView = findViewById(R.id.video_view);
videoView.setVideoPath("http://live.hkstv.hk.lxdns.com/live/hks/playlist.m3u8");  // 香港卫视地址
videoView.start();
//使视频能够暂停、播放、进度条显示等控制
MediaController mediaController = new MediaController(this);
videoView.setMediaController(mediaController);
mediaController.setMediaPlayer(videoView);

//对视频进行判断处理-仅作为个人记录
final VideoView videoView = headerView.findViewById(R.id.question_video);
videoView.setVisibility(View.VISIBLE);
Uri videoUri = null;
String videostring;//视频地址
String videoUrl = dataItem.getVideoUrl();//视频完整地址
if (!TextUtils.isEmpty(videoUrl)) {boolean httpvideo = videoUrl.startsWith("http");//视频地址是否包含httpif (httpvideo) {//包含则是全路径,截取最后视频地址videostring = videoUrl.substring(videoUrl.lastIndexOf("/") + 1);//截取视频地址} else {//半路径赋值为全路径videostring = videoUrl;}if (FileUtil.isFileExists(ConstStudent.MP4_PATH + videostring)) {videoUri = Uri.parse(ConstStudent.MP4_PATH + videostring);} else {if (httpvideo) {videoUri = Uri.parse(dataItem.getVideoUrl());} else {videoUri = Uri.parse("http://misc.dyhoa.com/assets/mp4/" + dataItem.getVideoUrl());}}
}
videoView.setVideoURI(videoUri);
//开始播放
videoView.start();
//播放完毕,重新开始播放
videoView.setOnCompletionListener(new OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {videoView.start();}
});

4. 效果图

完成代码编写的工作后启动App应该就能够如上图的香港卫视的视频内容啦。是不是感觉很简单啊,那是因为VideoView封装了MediaPlayer和SurfaceView,所有的生命周期都包装好了,所以使用的时候当然就简单啦。下面我们就解析一下VideoView了解其背后的事情。

四、VideoView 播放状态说明

下面的代码是VideoView声明的播放器声明的状态:

// all possible internal states
private static final int STATE_ERROR = -1;
private static final int STATE_IDLE = 0;
private static final int STATE_PREPARING = 1;  
private static final int STATE_PREPARED = 2;
private static final int STATE_PLAYING = 3;
private static final int STATE_PAUSED = 4;
private static final int STATE_PLAYBACK_COMPLETED = 5;

为什么会声明这些状态,这就不得不提到MediaPlayer的生命周期了,看下图,应该就稍微理解了吧:

在这里我们先不具体针对这个图讲MediaPlayer的生命周期的内容。只是为了证明VideoView的状态的生命是有依据的。

private int mCurrentState = STATE_IDLE;
private int mTargetState = STATE_IDLE;

上面的代码声明了两个状态变量,分别是当前的状态和目标状态。通过这两个变量结合上面提到的常量,我们可以很清楚的知道VideoView类就是围绕这这两个状态来进行相应的操作的。而我们处理一些回调也是基于这些状态之间的变化设计的,如:

  • OnCompletionListener -- STATE_PLAYBACK_COMPLETED
  • OnPreparedListener -- STATE_PREPARED
  • OnErrorListener -- STATE_ERROR

五、使用VideoView 可能遇到的问题及解决方案

1. 视频播放时会有短暂的黑屏时间:

产生原因:

视频文件加载到内存中是需要时间,这个时间可能导入VideoView全黑。

解决方法:

(1):给VideoView添加MediaPlayer.OnPreparedListener 监听事件,在其onPrepared(MediaPlayer mp) 方法回调中播放视频这个时候视频已经完成了加载。
(2):在VideoView执行start() 方法时视频的预览图不是立即消失而是延迟几百毫秒之后消失,这是视频已经加载完成,当然体验上有些不好。

2. 跳转到其他界面回来后视频播放区域黑屏:

产生原因:

VideoView被回收掉,而自己没做VideoView的状态保存处理

解决方法:

在VideoView所在的Activity或者Fragment的生命周期中处理VideoView视频播放和暂停。(查看VideoView的生命周期相关的方法)

VideoView介绍相关推荐

  1. Android Studio 实现播放本地/网络视频

    Android Studio 实现播放本地/网络视频 目的 工具及环境 功能设计 VideoView 简介 常用方法 代码解释 本地视频播放器 activity_main.xml MainActivi ...

  2. Android自定义一个播放器控件

    介绍 最近要使用播放器做一个简单的视频播放功能,开始学习VideoView,在横竖屏切换的时候碰到了点麻烦,不过在查阅资料后总算是解决了.在写VideoView播放视频时候定义控制的代码全写在Actv ...

  3. android 伸缩工具栏,看,这个工具栏能伸缩折叠——Android CollapsingToolbarLayout使用介绍...

    我非常喜欢Material Design里折叠工具栏的效果,bilibili Android客户端视频详情页就是采用的这种设计.这篇文章的第二部分我们就通过简单的模仿bilibili视频详情页的实现来 ...

  4. [Android基础] VideoView

    项目需要做一个简单的播放视频功能demo,后期会换成公司自己的组件,所以就没考虑使用第三方库了,直接上系统的VideoView,在这里记录下操作; 顺便吐槽下:一直都听说简书编辑器好用,第一次使用,有 ...

  5. Android视频播放之VideoView

    Android视频播放之VideoView 1.VideoView类介绍 Android的VideoView组件可以从不同的来源(例如资源文件或内容提供器)读取图像,计算和维护视频的画面尺寸以使其适用 ...

  6. android videoview属性,Android VideoView

    VideoView,用于播放一段视频媒体,它继承了SurfaceView,位于"android.widget.VideoView",是一个视频控件. 既然是播放一段视频,那么不可避 ...

  7. Android--使用VideoView播放视频

    VideoView VideoView,用于播放一段视频媒体,它继承了SurfaceView,位于"android.widget.VideoView",是一个视频控件. 既然是播放 ...

  8. 系出名门Android(7) - 控件(View)之ZoomControls, Include, VideoView, WebView, RatingBar, Tab

    [索引页] [×××] 系出名门Android(7) - 控件(View)之ZoomControls, Include, VideoView, WebView, RatingBar, Tab, Spi ...

  9. Android之使用VideoView组件播放一个简单的视频

    1.在Android开发中,提供了VideoView组件用来播放视频文件.首先,要使用这个组件来播放视频,必须在布局文件下添加VideoView组件,然后再到Activity里获取这个组件,然后调用这 ...

最新文章

  1. 【论文复现与改进】针对弱标注数据多标签矩阵恢复问题,改进后的MCWD算法,让你的弱标注多标签数据赢在起跑线上
  2. 【计算机网络】核心知识归纳总结
  3. C语言中宏定义和函数的取舍
  4. Linux文件系统与文本处理常用命令总结
  5. 报错:1130-host ... is not allowed to connect to this MySql server 开放mysql远程连接 不使用localhost...
  6. Vmware View Client登陆后无法使用键盘输入
  7. Java游戏外挂基础
  8. php 项目反应理论,科学网—好文 | 纽约石溪大学:机器学习中基于项目反应理论的集成学习 - 陈培颖的博文...
  9. 【C++进阶:二叉树进阶】二叉搜索树的操作和key模型、key/value模型的实现 | 二叉搜索树的应用 | 二叉搜索树的性能分析
  10. protonmail邮箱注册
  11. jetson xavier nx 系统及相关环境配置(cuda,torchvision,torch,tensorflow,opencv)
  12. html5无法播放腾讯视频教程,电脑中无法打开腾讯视频的解决方法
  13. 图形图形处理方面的一位微软专家的主页,
  14. Linux——LDAP(相当于Windows下的AD)
  15. 15 款 Windows 的数据恢复工具
  16. 算法笔记 (四)算法的逻辑结构和物理结构
  17. android7玩法,QQ for Android v7.6.5 正式版发布 红包互动又双叒叕出新玩法
  18. Word文档中的文字下红色波浪线如何取消?
  19. python报错AttributeError module ‘scipy.misc‘ has no attribute ‘imresize‘和 ‘imread‘
  20. Python数据库及ORM框架对比选择

热门文章

  1. Java 性能优化之—— JIT 如何影响 JVM 的性能
  2. 函数和方法的本质区别
  3. phpstorm安装+新建项目+phpstorm中文版
  4. Linux驱动 | DHT11驱动
  5. 【数据分享】1901-2021年1km分辨率逐月总降水栅格数据(全国/分省/免费获取)
  6. java如何将英文日期转成中文_中文字符串日期改成英文的日期格式
  7. 大数据Hadoop(二十):MapReduce的排序和序列化
  8. 计算机前景 英语作文,计算机与我英语作文范文 The Computer and I
  9. Leetcode 875. 爱吃香蕉的珂珂
  10. 命令行启动kate||cmd启动kate|| 一行命令用kate编辑文件