VideoView介绍
一、简介
下面简单介绍一下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介绍相关推荐
- Android Studio 实现播放本地/网络视频
Android Studio 实现播放本地/网络视频 目的 工具及环境 功能设计 VideoView 简介 常用方法 代码解释 本地视频播放器 activity_main.xml MainActivi ...
- Android自定义一个播放器控件
介绍 最近要使用播放器做一个简单的视频播放功能,开始学习VideoView,在横竖屏切换的时候碰到了点麻烦,不过在查阅资料后总算是解决了.在写VideoView播放视频时候定义控制的代码全写在Actv ...
- android 伸缩工具栏,看,这个工具栏能伸缩折叠——Android CollapsingToolbarLayout使用介绍...
我非常喜欢Material Design里折叠工具栏的效果,bilibili Android客户端视频详情页就是采用的这种设计.这篇文章的第二部分我们就通过简单的模仿bilibili视频详情页的实现来 ...
- [Android基础] VideoView
项目需要做一个简单的播放视频功能demo,后期会换成公司自己的组件,所以就没考虑使用第三方库了,直接上系统的VideoView,在这里记录下操作; 顺便吐槽下:一直都听说简书编辑器好用,第一次使用,有 ...
- Android视频播放之VideoView
Android视频播放之VideoView 1.VideoView类介绍 Android的VideoView组件可以从不同的来源(例如资源文件或内容提供器)读取图像,计算和维护视频的画面尺寸以使其适用 ...
- android videoview属性,Android VideoView
VideoView,用于播放一段视频媒体,它继承了SurfaceView,位于"android.widget.VideoView",是一个视频控件. 既然是播放一段视频,那么不可避 ...
- Android--使用VideoView播放视频
VideoView VideoView,用于播放一段视频媒体,它继承了SurfaceView,位于"android.widget.VideoView",是一个视频控件. 既然是播放 ...
- 系出名门Android(7) - 控件(View)之ZoomControls, Include, VideoView, WebView, RatingBar, Tab
[索引页] [×××] 系出名门Android(7) - 控件(View)之ZoomControls, Include, VideoView, WebView, RatingBar, Tab, Spi ...
- Android之使用VideoView组件播放一个简单的视频
1.在Android开发中,提供了VideoView组件用来播放视频文件.首先,要使用这个组件来播放视频,必须在布局文件下添加VideoView组件,然后再到Activity里获取这个组件,然后调用这 ...
最新文章
- 【论文复现与改进】针对弱标注数据多标签矩阵恢复问题,改进后的MCWD算法,让你的弱标注多标签数据赢在起跑线上
- 【计算机网络】核心知识归纳总结
- C语言中宏定义和函数的取舍
- Linux文件系统与文本处理常用命令总结
- 报错:1130-host ... is not allowed to connect to this MySql server 开放mysql远程连接 不使用localhost...
- Vmware View Client登陆后无法使用键盘输入
- Java游戏外挂基础
- php 项目反应理论,科学网—好文 | 纽约石溪大学:机器学习中基于项目反应理论的集成学习 - 陈培颖的博文...
- 【C++进阶:二叉树进阶】二叉搜索树的操作和key模型、key/value模型的实现 | 二叉搜索树的应用 | 二叉搜索树的性能分析
- protonmail邮箱注册
- jetson xavier nx 系统及相关环境配置(cuda,torchvision,torch,tensorflow,opencv)
- html5无法播放腾讯视频教程,电脑中无法打开腾讯视频的解决方法
- 图形图形处理方面的一位微软专家的主页,
- Linux——LDAP(相当于Windows下的AD)
- 15 款 Windows 的数据恢复工具
- 算法笔记 (四)算法的逻辑结构和物理结构
- android7玩法,QQ for Android v7.6.5 正式版发布 红包互动又双叒叕出新玩法
- Word文档中的文字下红色波浪线如何取消?
- python报错AttributeError module ‘scipy.misc‘ has no attribute ‘imresize‘和 ‘imread‘
- Python数据库及ORM框架对比选择
热门文章
- Java 性能优化之—— JIT 如何影响 JVM 的性能
- 函数和方法的本质区别
- phpstorm安装+新建项目+phpstorm中文版
- Linux驱动 | DHT11驱动
- 【数据分享】1901-2021年1km分辨率逐月总降水栅格数据(全国/分省/免费获取)
- java如何将英文日期转成中文_中文字符串日期改成英文的日期格式
- 大数据Hadoop(二十):MapReduce的排序和序列化
- 计算机前景 英语作文,计算机与我英语作文范文 The Computer and I
- Leetcode 875. 爱吃香蕉的珂珂
- 命令行启动kate||cmd启动kate|| 一行命令用kate编辑文件