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

  • 目的
  • 工具及环境
  • 功能设计
  • VideoView
    • 简介
    • 常用方法
  • 代码解释
    • 本地视频播放器
      • activity_main.xml
      • MainActivity.java
    • 网络视频播放器
      • AndroidManifest.xml
      • MainActivity.java
  • 完整代码
    • activity_main.xml
    • AndroidManifest.xml
    • MainActivity.java
  • 最终效果
    • 本地视频播放器
    • 网络视频播放器
    • 暂停、停止视频
    • 拉动进度条
  • 关于VideoView的坑
  • 参考

目的

利用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或本地Uri
  • setMediaController(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。
<TextViewandroid: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。
 <VideoViewandroid:id="@+id/video"android:layout_width="300dp"android:layout_height="300dp"android:layout_gravity="center"android:layout_marginTop="40dp"/>
  • Button:设置两个用来控制视频播放和停止的按钮。
<Buttonandroid:id="@+id/playbutton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Play"android:layout_gravity="center"android:textSize="25sp"   />
<Buttonandroid: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找到相对应的控件。对播放和停止按钮定义监听事件。

@Overridepublic 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建立关联,再对按钮设置点击时触发的方法。

@Overrideclass mClick implements OnClickListener {@Overridepublic 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.xml

  • uses-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" ><TextViewandroid: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"/><VideoViewandroid:id="@+id/video"android:layout_width="300dp"android:layout_height="300dp"android:layout_gravity="center"android:layout_marginTop="40dp"/><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_marginTop="30dp"android:orientation="horizontal"><Buttonandroid:id="@+id/playbutton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Play"android:layout_gravity="center"android:textSize="25sp"   /><Buttonandroid: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" /><applicationandroid: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.java

package 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;@Overridepublic 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 {@Overridepublic 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.

作者:杨梦琳
原文链接:https://blog.csdn.net/RUHU_/article/details/106721171

Android Studio 实现播放本地/网络视频相关推荐

  1. Android VideoView 无法播放https网络视频问题

    最近项目里遇见一个奇葩问题,由于项目之前的服务器地址是http,然而最近又换成https的,本来从不安全的证书换成安全的证书一切应该ok,但重新打包运行却出现了新问题,(怀疑证书压根就是不安全的) 1 ...

  2. android 音乐播放器 获取sd卡所有音乐文件,Android Studio音乐播放器无法读取SD卡,只有内部存储器...

    我很抱歉,如果这原来是一个愚蠢的问题,它可能会成为一个快速修复,但我只是无法弄清楚.我在android studio中创建了音乐播放器,并且没有任何sdcard上的歌曲不会显示在列表视图中,只有内部内 ...

  3. iOS开发-ZFPlayer的简单使用 播放单个网络视频

    iOS开发-ZFPlayer的简单使用 播放单个网络视频 前言 开发准备 代码 注意 前言 关于ZFPlayer播放单个网络视频案例,它的网络列表视频案例在gitHub上面很多. 开发准备 podfi ...

  4. Android使用VideoView播放本地视频及网络视频Demo

    1.xm文件 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:and ...

  5. Android 使用MediaPlayer播放本地视频

    MediaPlayer可以播放视频和音频,并且它支持本地和网络文件的播放.本篇文章是使用MediaPlayer播放本地视频,如果觉得使用MediaPlayer比较麻烦,也可以选择VideoView播放 ...

  6. android播放mp3方法,Android之MediaPlayer播放音频与视频

    本节带来的是Android多媒体中的--MediaPlayer,我们可以通过这个API来播放音频和视频 该类是Androd多媒体框架中的一个重要组件,通过该类,我们可以以最小的步骤来获取,解码 和播放 ...

  7. android原生MediaPlayer播放本地的m3u8

    背景 遇到某个需求,需要播放百度网盘的视频.但是通过百度网盘的sdk获取到的视频url是由若干个ts片段组成的m3u8播放源.然后把这个m3u8的播放源放在本地,也就是说m3u8是一个本地播放源.那么 ...

  8. android studio 本地html,android - 从当前HTML文件Android Studio中打开本地HTML文件? - 堆栈内存溢出...

    我在Android Studio上制作了一个WebView应用. 它会正确打开我的默认索引HTML页面 @Override protected void onCreate(Bundle savedIn ...

  9. opencv打开mp4文件_OpenCV 实现播放本地mp4视频或远程服务mp4视频

    上代码: import cv2 # 获得视频的格式 videoCapture = cv2.VideoCapture('./mac-bruce-tpl-cn-2018_1280x720h.mp4') # ...

最新文章

  1. 字节一面:如何从 100 亿 URL 中找出相同的 URL?
  2. 逻辑心理测试题:三囚分汤
  3. hadoop 023.0与hadoop 1.0 io.serializable分析
  4. 八、word-space与letter-space
  5. POJ 3104 Drying 二分
  6. 编程科普|你知道的关于 Python 的那些知识,可能全错了!
  7. Mac环境下安装Sass
  8. Object_id用法
  9. 东北大学计算机 大一物理考试题,2010-2011东北大学物理考试题及答案
  10. QQ 邮箱漂流瓶将下线;华为美国公司起诉美商务部;Ubuntu 不会放弃 32 位应用程序支持 | 极客头条...
  11. matlab实现图片类型的转换
  12. 博科:物理与虚拟网络的统一管理
  13. 求和函数计算机语言,在 Excel 中,计算求和的函数是 ____。
  14. Papervision3d QuadTree四叉树相机的示例
  15. 毕业设计所用到的工具,需要了解的神器,不妨来看看,工具基本全了
  16. Java Stream API概述
  17. 新型脑刺激疗法治疗重度抑郁症
  18. php实现下雪场景,下雪的唯美短句 下雪的场景写一段话
  19. Mac之间的 远程控制
  20. java图形打字机_Android模仿打字机效果的自定义View实现

热门文章

  1. uni-app 输入框类型
  2. [2]十道算法题【Java实现】
  3. Windows下利用Chrome调试IOS设备页面
  4. 关于vue路由模式导致微信jssdk授权问题的正确解决姿势
  5. linux 2048移动代码,2 的威力,Linux 的威力:终端中的 2048
  6. GCN的Python实现与源码分析
  7. oracle表空间不足影响,oracle表空间不足
  8. java中控制反转_Java如何利用IOC控制反转的三种设计模式详解
  9. 巴克莱、高盛支持区块链衍生品领域的ISDA标准
  10. 使用Lua GD库动态生成验证码图片(2)