利用AndroID Studio 设计一个可以对本地视频或网络视频进行播放、暂停、停止的视频播放器。
工具及环境使用Java语言编写代码, 在AndroID Studio平台上进行开发。
功能设计先对界面视图和功能按钮进行设计,再实现加载视频进行播放,暂停,停止视频的功能。
VIDeoVIEw简介简单介绍一下VIDeoVIEw:
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或本地UrisetMediaController(MediaController controller):设置MediaController控制器setonCompletionListener(MediaPlayer.onCompletionListener l):监听播放完成的事件setonErrorListener(MediaPlayer.OnErrorListener l):监听播放发生错误时候的事件setonPreparedListener(MediaPlayer.OnPreparedListener l):监听视频装载完成的事件更多功能详见: 官方文档.
代码解释本地视频播放器activity_main.xml这里的布局文件我用的是linearLayout布局进行嵌套 *** 作。整体的linearLayout布局包含TextVIEw和VIDeoVIEw,嵌套的linearLayout布局包含Play按钮和Stop按钮。外层布局是垂直(androID:orIEntation=“vertical”),内层布局是水平(androID:orIEntation=“horizontal”)。
TextVIEw:作为播放器的标题。设置TextVIEw控件在其父控件中位于水平居中的位置并且控件外边距距离父布局顶端20dp。<TextVIEw androID:ID="@+ID/tv" androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" androID:layout_gravity="center_horizontal" androID:text="VIDeo Player" androID:textSize="30sp" androID:layout_margintop="20dp"/>
VIDeoVIEw:视频播放器。设置VIDeoVIEw控件在其父控件中位于居住的位置并且控件外边距距离父布局顶端40dp。 <VIDeoVIEw androID:ID="@+ID/vIDeo" androID:layout_wIDth="300dp" androID:layout_height="300dp" androID:layout_gravity="center" androID:layout_margintop="40dp"/>
button:设置两个用来控制视频播放和停止的按钮。<button androID:ID="@+ID/playbutton" androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" androID:text="Play" androID:layout_gravity="center" androID:textSize="25sp" /><button androID:ID="@+ID/stopbutton" androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" androID:text="Stop" androID:layout_marginleft="30sp" androID:layout_gravity="center" androID:textSize="25sp" />
MainActivity.java创建VIDeoVIEw,button,MediaController类型对应的变量,MediaController是视频的控制条(不需要可以不设置)。
private VIDeoVIEw mVIDeoVIEw;private button playBtn, stopBtn;MediaController mMediaController;
创建VIDeoVIEw,MediaController对象并通过设置ID找到相对应的控件。对播放和停止按钮定义监听事件。
@OverrIDe public voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main); mVIDeoVIEw = new VIDeoVIEw(this); mVIDeoVIEw = (VIDeoVIEw) findVIEwByID(R.ID.vIDeo); mMediaController = new MediaController(this); playBtn = (button) findVIEwByID(R.ID.playbutton); stopBtn = (button) findVIEwByID(R.ID.stopbutton); playBtn.setonClickListener(new mClick()); stopBtn.setonClickListener(new mClick()); }
加载指定的视频文件后,将VIDeoVIEw与MediaController建立关联,再对按钮设置点击时触发的方法。
@OverrIDe class mClick implements OnClickListener { @OverrIDe public voID onClick(VIEw v) { String uri = "androID.resource://" + getPackagename() + "/" + R.raw.hoshi; mVIDeoVIEw.setVIDeoURI(Uri.parse(uri)); mMediaController.setMediaPlayer(mVIDeoVIEw); mVIDeoVIEw.setMediaController(mMediaController); if (v == playBtn) { mVIDeoVIEw.start(); } else if (v == stopBtn) { mVIDeoVIEw.stopPlayback(); } } }
视频路径解释:
将视频放置在res/raw/目录下。如果我们想访问res/raw/hoshi.mp4文件,可以使用"androID.resource://package_name/" + R.raw.hoshi.mp4 这个Uri,其中package_name是你工程的包名,用getPackagename()方法得到包名。网络视频播放器
activity_main.xml:对网络视频播放的页面布局文件activity_main.xml和本地视频播放器的布局文件相同,这里就不重复放置代码。
AndroIDManifest.xmluses-permission是AndroIDManifest.xml中最常用的一项配置,它用来声明一个app在运行时所需要的权限。如果我们要播放网络视频进行网络连接的话,需要网络访问权限,我们要在AndroIDManifest.xml 文件中添加以下权限。分别是获取文件读写权限和获取internet访问权限。<uses-permission androID:name="androID.permission.READ_EXTERNAL_STORAGE" /><uses-permission androID:name="androID.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission androID:name="androID.permission.INTERNET" />
MainActivity.java在本地播放MainActivity.java文件的基础上,添加一个uri2为网络视频的uri,再用setVIDeoURI设置视频源就可以运行播放网络视频。
String uri2 = "https://flv2.bn.netease.com/vIDeolib1/1811/26/OqJAZ893T/HD/OqJAZ893T-mobile.mp4";mVIDeoVIEw.setVIDeoURI(Uri.parse(uri2));
完整代码activity_main.xml<?xml version="1.0" enCoding="utf-8"?><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="fill_parent" androID:layout_height="fill_parent" androID:orIEntation="vertical" > <TextVIEw androID:ID="@+ID/tv" androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" androID:layout_gravity="center_horizontal" androID:text="VIDeo Player" androID:textSize="30sp" androID:layout_margintop="20dp"/> <VIDeoVIEw androID:ID="@+ID/vIDeo" androID:layout_wIDth="300dp" androID:layout_height="300dp" androID:layout_gravity="center" androID:layout_margintop="40dp"/> <linearLayout androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" androID:layout_gravity="center" androID:layout_margintop="30dp" androID:orIEntation="horizontal"> <button androID:ID="@+ID/playbutton" androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" androID:text="Play" androID:layout_gravity="center" androID:textSize="25sp" /> <button androID:ID="@+ID/stopbutton" androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" androID:text="Stop" androID:layout_marginleft="30sp" androID:layout_gravity="center" androID:textSize="25sp" /> </linearLayout></linearLayout>
AndroIDManifest.xml<?xml version="1.0" enCoding="utf-8"?><manifest xmlns:androID="http://schemas.androID.com/apk/res/androID" package="com.example.blogs"> <uses-permission androID:name="androID.permission.READ_EXTERNAL_STORAGE" /> <uses-permission androID:name="androID.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission androID:name="androID.permission.INTERNET" /> <application androID:allowBackup="true" androID:icon="@mipmap/ic_launcher" androID:label="@string/app_name" androID:roundIcon="@mipmap/ic_launcher_round" androID:supportsRtl="true" androID:theme="@style/Apptheme" androID:requestLegacyExternalStorage="true"> <activity androID:name=".MainActivity"> <intent-filter> <action androID:name="androID.intent.action.MAIN" /> <category androID:name="androID.intent.category.LAUNCHER" /> </intent-filter> </activity> </application></manifest>
MainActivity.javapackage com.example.blogs;import androID.app.Activity;import androID.net.Uri;import androID.os.Bundle;import androID.vIEw.VIEw;import androID.vIEw.VIEw.OnClickListener;import androID.Widget.button;import androID.Widget.MediaController;import androID.Widget.VIDeoVIEw;public class MainActivity extends Activity { private VIDeoVIEw mVIDeoVIEw; private button playBtn, stopBtn; MediaController mMediaController; @OverrIDe public voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main); mVIDeoVIEw = new VIDeoVIEw(this); mVIDeoVIEw = (VIDeoVIEw) findVIEwByID(R.ID.vIDeo); mMediaController = new MediaController(this); playBtn = (button) findVIEwByID(R.ID.playbutton); stopBtn = (button) findVIEwByID(R.ID.stopbutton); playBtn.setonClickListener(new mClick()); stopBtn.setonClickListener(new mClick()); } class mClick implements OnClickListener { @OverrIDe public voID onClick(VIEw v) { String uri = "androID.resource://" + getPackagename() + "/" + R.raw.hoshi; //本地 //String uri2 = "https://flv2.bn.netease.com/vIDeolib1/1811/26/OqJAZ893T/HD/OqJAZ893T-mobile.mp4"; //网络 mVIDeoVIEw.setVIDeoURI(Uri.parse(uri)); //本地 //mVIDeoVIEw.setVIDeoURI(Uri.parse(uri2)); //网络 mMediaController.setMediaPlayer(mVIDeoVIEw); mVIDeoVIEw.setMediaController(mMediaController); if (v == playBtn) { mVIDeoVIEw.start(); } else if (v == stopBtn) { mVIDeoVIEw.stopPlayback(); } } }}
最终效果运行起来的视频都是可以出声音的!!!这里放gif图的效果!
本地视频播放器网络视频播放器暂停、停止视频拉动进度条关于VIDeoVIEw的坑
关于播放网络视频时视频的uri,我试了好多才找到这一个能打开的。我搜索了一下,很多人都以为这可能是网络访问权限或者是其他的问题,但是其实并不是。因为现在网上很多视频都有保护机制我们无法随便用其链接打开,所以只能打开特定的网络视频。一般这种情况的解决办法是可以选择自己上传视频。
String uri2 = "https://flv2.bn.netease.com/vIDeolib1/1811/26/OqJAZ893T/HD/OqJAZ893T-mobile.mp4";
参考AndroID Studio——简易视频播放器: link.
VIDeoVIEw介绍: link.
以上是内存溢出为你收集整理的Android Studio 实现播放本地/网络视频全部内容,希望文章能够帮你解决Android Studio 实现播放本地/网络视频所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)