使用Android制作视频播放器

article/2025/9/22 23:36:20

使用Android制作视屏播放器

目录

  • 使用Android制作视屏播放器
  • 前言
  • 一、展示预览
  • 二、详细步骤
    • 1.准备工作
    • 2、主界面设计
    • 3、主界面java文件
    • 4、全屏界面设计
  • 总结

前言

Android小作业,含实现本地视频播放界面,实现全屏播放视频界面,两个界面所采用的的控件不同,可进行比较学习,作为大作业参考代码。

一、展示预览

第一界面:主要使用VideoView、button、mediaConrtroller类
在这里插入图片描述

第二界面:SurfaceView控件和MediaPlayer共同放视频
在这里插入图片描述

将这两个界面进行跳转只需要在跳转的button中设置intent事件即可(具体代码看两个java文件中intent部分)

二、详细步骤

1.准备工作

准备一张背景图,作为界面1背景,命名为bg;准备一个.mp4格式的视频light。如果是其他格式,可以通过【格式工厂】进行格式转换,若无,点击前往下载……

文件界面如图:
文件界面如图

2、主界面设计

确定布局为约束布局,为了方便控制视频的开始与结束,设置两个button来控制播放和暂停,id为start和pause; 通过VideoView将视频导入,id为videoView;

主界面布局代码如下:

<?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"android:background="@drawable/bg"><VideoViewandroid:id="@+id/videoView"android:layout_width="match_parent"android:layout_height="250dp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.239"tools:layout_editor_absoluteX="0dp" /><Buttonandroid:id="@+id/start"android:layout_width="204dp"android:layout_height="71dp"android:text="播放"android:backgroundTint="@color/black"android:textColor="@color/white"android:textSize="25dp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.0"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.0" /><Buttonandroid:id="@+id/pause"android:layout_width="204dp"android:layout_height="68dp"android:backgroundTint="@color/black"android:textColor="@color/white"android:text="暂停"android:textSize="25dp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="1.0"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.004" /><Buttonandroid:id="@+id/all"android:layout_width="match_parent"android:layout_height="71dp"android:backgroundTint="@color/black"android:text="点击全屏播放>>"android:textColor="@color/white"android:textSize="25dp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.0"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.586" />
</androidx.constraintlayout.widget.ConstraintLayout>

3、主界面java文件

要想让视频播放,需要在java文件设置对应的方法。需要修改对应的id以及包名、文件名。
代码如下:

package com.example.miao1115;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.MediaController;
import android.widget.VideoView;public class MainActivity extends AppCompatActivity {VideoView videoview;Button start;Button pause;MediaController mediaController;Button all;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);videoview=findViewById(R.id.videoView);all=findViewById(R.id.all);mediaController= new MediaController(this);initview();//跳转全屏界面all.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent backmain = new Intent(MainActivity.this, MainActivity2.class);startActivity(backmain);finish();}});}private  void initview(){start=findViewById(R.id.start);pause=findViewById(R.id.pause);start.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {init();}});pause.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {videoview.stopPlayback();}});}private void init(){//启动视频播放的方法String uri="android.resource://"+getPackageName()+"/"+R.raw.light;videoview.setVideoURI(Uri.parse(uri));videoview.setMediaController(mediaController);mediaController.setMediaPlayer(videoview);videoview.requestFocus();//设置视频控制组件传入videoview对象videoview.start();//设置开始播放}}

4、全屏界面设计

主要应用的是SurfaceView控件和MediaPlayer共同放视频,可以大大减少内存,避免视频卡顿。

使用SurfaceView好处:

  • 使用了双缓存技术
  • 两个线程来完成 一个线程来显示页面 另一个线程来后台计算
  • 两个线程完成任务后,可以实现两个线程交替计算。
  • 可避免线程阻塞

全屏播放界面只需要设置一个返回按钮回到主界面即可,代码如下:

<?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=".MainActivity2"android:id="@+id/cl"android:background="@color/black"><SurfaceViewandroid:id="@+id/sv"android:layout_width="fill_parent"android:layout_height="fill_parent"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintHorizontal_bias="0.0"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.0" /><SeekBarandroid:id="@+id/sbar"style="?android:attr/progressBarStyleHorizontal"android:layout_width="fill_parent"android:layout_height="wrap_content"android:max="100"android:progress="0"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintHorizontal_bias="0.0"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.977" /><ImageViewandroid:id="@+id/play"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:layout_centerVertical="true"android:onClick="click"android:src="@android:drawable/ic_media_pause"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /><Buttonandroid:id="@+id/back"android:layout_width="143dp"android:layout_height="70dp"android:backgroundTint="@color/black"android:text="返回"android:textColor="@color/white"android:textSize="25dp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.0"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.0" />
</androidx.constraintlayout.widget.ConstraintLayout>

5、全屏布局
注意:在默认情况下全屏是竖屏,显然这不是我们想要的结果。
有两种方法进行调整,第一种方法是在AndroidManifest文件中加入以下语句:

android:screenOrientation="landscape"

但是加过去后,我发现因为这是全局配置文件,会影响主界面也变成横屏,所以如果不是想要所有界面都采用横屏应该采用第二种方法。

第二种办法是在Java文件中设置全屏,为了更为稳定,常常需要一个if语句来对原本是否横屏进行判断,如果不是横屏,就进行横屏设置。加入代码如下:

if(this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)
{setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}

全屏界面Java完整代码如下:

package com.example.miao1115;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import android.content.ContentResolver;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.Toast;
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity2 extends AppCompatActivity implements SurfaceHolder.Callback, SeekBar.OnSeekBarChangeListener {private SurfaceView sv;private SurfaceHolder holder;private MediaPlayer mediaplayer;private ConstraintLayout cl;private Timer timer;private TimerTask task;private SeekBar sbar;private ImageView play;private Button back;@Overrideprotected void onCreate(Bundle savedInstanceState) {if(this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);}super.onCreate(savedInstanceState);setContentView(R.layout.activity_main2);sv = (SurfaceView) findViewById(R.id.sv);// 得到SurfaceView的容器,界面内容是显示在容器里面的cl = (ConstraintLayout) findViewById(R.id.cl);play = (ImageView) findViewById(R.id.play);sbar = (SeekBar) findViewById(R.id.sbar);back = findViewById(R.id.back);sbar.setOnSeekBarChangeListener(this);holder = sv.getHolder();// 过时的APT,如果4.0以上的系统不写没问题,否则必须要写holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);holder.addCallback(this);// 初始化计时器timer = new Timer();back.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent backmain = new Intent(MainActivity2.this, MainActivity.class);startActivity(backmain);finish();}});task = new TimerTask(){@Overridepublic void run(){if (mediaplayer != null && mediaplayer.isPlaying()){int total = mediaplayer.getDuration();sbar.setMax(total);int progress = mediaplayer.getCurrentPosition();sbar.setProgress(progress);}else{play.setImageResource(android.R.drawable.ic_media_play);}}};// 设置TimerTask延迟500ms,每隔500ms执行一次timer.schedule(task, 500, 500);}//播放暂停按钮的点击事件public void click(View view){if (mediaplayer != null && mediaplayer.isPlaying()){mediaplayer.pause();play.setImageResource(android.R.drawable.ic_media_play);} else{mediaplayer.start();play.setImageResource(android.R.drawable.ic_media_pause);}}@Overridepublic void surfaceCreated(@NonNull SurfaceHolder holder){try {mediaplayer = new MediaPlayer();mediaplayer.setAudioStreamType(AudioManager.STREAM_MUSIC);Uri uri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE+"://"+getPackageName()+"/"+R.raw.light);try {mediaplayer.setDataSource(MainActivity2.this,uri);} catch (IOException e) {Toast.makeText(MainActivity2.this,"播放失败",Toast.LENGTH_SHORT).show();e.printStackTrace();}mediaplayer.setDisplay(holder);mediaplayer.prepareAsync();mediaplayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener(){@Overridepublic void onPrepared(MediaPlayer mp) {mediaplayer.start();}});} catch (Exception e) {Toast.makeText(MainActivity2.this, "播放失败",Toast.LENGTH_SHORT).show();e.printStackTrace();}}@Overridepublic void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) { }@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {if(mediaplayer. isPlaying()){mediaplayer.stop();    }                   }@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) { }@Overridepublic void onStopTrackingTouch(SeekBar seekBar){int position = seekBar.getProgress();if (mediaplayer != null){mediaplayer.seekTo(position);}}}

总结

针对不同情况选择适合的视频播放器插入方法,但是如果可以像平常使用腾讯、爱奇艺在视频播放角落处设置一个全屏按钮,不用进行页面跳转的话会更好。具体实现还在学习中。


http://chatgpt.dhexx.cn/article/b8bPiEfp.shtml

相关文章

自制计算机教程视频教程,教学视频如何制作/怎么做视频

随着网络的普及&#xff0c;电脑上已经不再单单只有影视剧等由专业人士拍摄与制作的高精良视频&#xff0c;越来越多的普通人也将自己的一些人生小经验或者将一些自己所擅长的知识领域制作成教学视频传入网上&#xff0c;甚至有些老师都将自己所讲授的课程录制成视频传入网上&a…

画中画视频如何制作

最近网络上很流行这个种画中画视频&#xff0c;如何自己可以制作出来一个令人满意画中画视频呢&#xff0c;其他很简单哦&#xff0c;只要找到方法就可以制作出来&#xff0c;不用羡慕别人呢&#xff0c;自己也可以呢&#xff0c;小编现在分享下操作步骤&#xff0c;看下大家有…

滚动字幕怎么制作,视频的滚动字幕如何制作?

相信看到这篇文章的小伙伴都想要给自己的视频添加上滚动字幕的效果&#xff0c;接下来小编就来给大家分享一个可以快速批量制作滚动字幕视频的简单操作方法&#xff0c;一起来看看吧&#xff01; 第一步&#xff0c;运行媒体梦工厂&#xff0c;切换到【任务剪辑】页面&#xff…

盗版视频网站原理

几年前&#xff0c;包括现在&#xff0c;视频网站各种VIP,VVIP,SUPERVIP&#xff0c;整得跟国内三大运营商的各种逗逼套餐一样让人眼花缭乱。 于是&#xff0c;自己就花了些时间&#xff0c;研究了下盗版的视频网站&#xff0c;并且在自己购买的个人服务器上搭建了成功了。 常…

透明背景视频的制作与应用

基于AR实践的需求&#xff0c;某些项目会需要用到透明视频。本篇介绍透明视频在AE中的制作方法以及在blender中作为材质贴图的应用。 目录 1. AE中透明视频素材的制作 2. 透明视频导入Blender作为模型材质贴图 AE中透明视频素材的制作 【3分钟学会】抠出动漫中动态的人物动…

沙雕短视频制作

1.用到软件&#xff1a; 方法一&#xff1a;使用AE、AI、PS这三个专业软件&#xff0c;优点是你可以随心所欲的创作&#xff0c;有很多特效可以使用&#xff0c;缺点是需要较长的时间学习。 方法二&#xff1a;使用AN、AI、PS这三个专业软件&#xff0c;优点是AN简单好上手&a…

好听又好看!歌曲视频制作,手把手教你制作音乐视频

好听又好看的图片+音乐形式的歌曲视频,简单3步快速搞定,手把手教你具体制作歌曲视频的方法。用到的制作歌曲/音乐视频的工具是数码大师,新手或小白可以很快做好,因为它有很多转场模板而且插入图片、视频、音乐或歌词都很方便。想要亲手制作一份具有纪念意义的歌曲/音乐视频…

web 前端学习之制作网页视频

制作网页视频 1. 准备视频文件2. 引用视频文件3. 完整代码如下4. 问题解决 1. 准备视频文件 先准备好视频文件&#xff0c;放入 img 目录下 2. 引用视频文件 video 是HTML的视频标签&#xff1b; <video width"320" height"240" controls autoplay…

视频剪辑如何快速制作图文视频

手机上如何制作图文视频&#xff0c;我们首先在手机上安装“王者剪辑app”&#xff0c;启动工具并进入智能创作中的“图文视频”&#xff0c; 导入图片源素材或选择自动网络配图&#xff0c;接着输入视频内容文案和配置视频参数&#xff0c;然后点击界面右上角对勾按钮&#…

用python代码制作视频

文章目录 前言安装一个小例子最后 前言 之前制作视频一般都是pr或者是在线制作视频&#xff0c;然后昨天偶然看到了一个python的库—moviepy&#xff0c;现在我们可以写代码来制作视频了。 安装 这个库安装起来很简单&#xff0c;还是老样子pip install moviepy 不过使用win…

同款视频一键制作生成微信小程序源码下载恶搞视频,特效视频,唯美视频等等

大家好给大家带来一款视频制作小程序 这款视频呢可以根据视频模板导入照片或者文字然后一键生成对应的视频 里面包含了N种模板,大家使用过剪映那些软件应该都熟悉吧 这个小程序就相当于里面的一键制作同款视频的功能一样 每一种模板所需的照片或者文字啥的都不同,都会对应生…

AR视频制作

最近在做一个AR视频的项目&#xff0c;就是扫描图片出相应的视频 需要的插件有&#xff1a;高通Vuforia&#xff0c;VideoPlayback 一、资源下载&#xff1a; 这里我们需要准备的资料如下&#xff1a; 1.一段视频&#xff1a; 因为视频一般较大&#xff0c;所以建议大家用格式…

如何搭建视频网站

一、视频网站和普通网站的区别 搭建视频网站和搭建普通网站&#xff0c;在技术实现方案上有很大的差别&#xff0c;因此&#xff0c;当有人问我是否可以采用搭建普通网站的方法搭建视频网站时&#xff0c;我会明确的告诉他们不可以&#xff0c;否者就贻笑大方了。 视频网站与…

搭建视频网站的技术方案

一、视频网站和普通网站的区别 搭建视频网站和搭建普通网站&#xff0c;在技术实现方案上有很大的差别&#xff0c;因此&#xff0c;当有人问我是否可以采用搭建普通网站的方法搭建视频网站时&#xff0c;我会明确的告诉他们不可以&#xff0c;否者就贻笑大方了。 视频网站与普…

设计实现一个漂亮的视频网站

一、任务描述 单位最近要设计开发一个全新的视频网站&#xff0c;用于存放和展示公司的宣传视频和培训视频。具体要求是&#xff1a;1)保存和管理公司现存的2000个左右的视频资源&#xff0c;约5TB的数据量。2)视频播出要清楚流畅&#xff0c;可以在企业内网和互联网上播放3)能…

chrome升级后无法访问iframe页面

现象&#xff1a; Google chrome升级&#xff0c;升级后版本 修改下面设置&#xff1a; chrome://flags/#same-site-by-default-cookies &#xff0c;设置为 Disabled chrome://flags/#cookies-without-same-site-must-be-secure &#xff0c;设置为 Disabled 重启浏览器 …

phpstudy升级apache

目前windows下的phpstudy的最新版本是8.1.0.6&#xff0c;其自带的apache版本是2.4.39。 经过绿盟的安全扫描&#xff0c;爆出近10个漏洞。 怎么修复漏洞呢&#xff1f; 一种方法是下载源码重新编译&#xff0c;这个比较麻烦。 下载最新版的apache可执行文件替换是最好的了。…

Gitlab升级(12.2.1到14.6.4)

背景介绍那些乱七八糟的就跳过吧&#xff0c;直接上干货 一、准备 1.1&#xff1a;确定安装方式 开始纠结于到底是rpm还是yum&#xff0c;后来知道yum相当于对rpm进行了一系列的加壳&#xff0c;目的是解决rpm的依赖问题。那么就果断选择yum方式即可。 当前操作系统环境为c…

简述Synchronized以及锁升级

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; 简述Synchronized以及锁升级 ⏱️ 创作时间&#xff1a; 2022年4月29日…

chrome 浏览器升级后接口无法正常访问

问题&#xff1a;chrome 浏览器升级后接口无法正常访问(后端已经设置好相关跨域设置) 现象&#xff1a;接口请求不成功&#xff0c;如下图&#xff1a; 解决办法&#xff1a; 地址览输入chrome://flags ,找到 Block insecure private network request ,设置Default为 Disabled…