使用Android制作视频播放器
使用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);}}}
总结
针对不同情况选择适合的视频播放器插入方法,但是如果可以像平常使用腾讯、爱奇艺在视频播放角落处设置一个全屏按钮,不用进行页面跳转的话会更好。具体实现还在学习中。
使用Android制作视频播放器相关推荐
- Android本地视频播放器开发 - 搜索本地视频(1)
这一章的主要内容是搜索手机本地视频,添加到ListView列表里,每一个表项含有这个视频的缩略图,视频的播放时间,视频的标题,在搜索本地视频(1)中我们先制作搜索功能. Video.java--视 ...
- 实现在Android本地视频播放器开发
在Android本地视频播放器开发中的搜索本地视频章节中,我们能够搜索本地视频并且显示每个视频的图片.标题.时间长度,当然如果需要添加其他的例如视频的长度和宽度可以使用Video类中的方法,既然我们获 ...
- Android本地视频播放器开发--视频解码
在上一章Android本地视频播放器开发--SDL编译编译中编译出sdl的支持库,当时我们使用的2.0,但是有些api被更改了,所以在以下的使用者中我们使用SDL1.3的库,这个库我会传上源码以及编译 ...
- 基于android的视频播放器,基于Android的视频播放器的设计与实现-.doc
基于Android的视频播放器的设计与实现- 基于Android的视频播放器的设计与实现 中 文 摘 要 如今,随着基于Android的智能手机的,.因此,设计一个基于android手机的多功能播放器 ...
- android 编译 sdl,SDL编译 - Android本地视频播放器开发_Linux编程_Linux公社-Linux系统门户网站...
在上一章 Android本地视频播放器开发--ffmpeg解码视频文件中的音频(2)[http://www.linuxidc.com/Linux/2013-06/85955p5.htm]中使用Ope ...
- Android 节操视频播放器jiecaovideoplayer使用
Android 节操视频播放器jiecaovideoplayer使用 特点: 全屏时启动新Activity实现播放器真正的全屏功能 能在ListView.ViewPager和ListView.View ...
- Android 全景视频播放器(VR视频播放器探索二)
上次随便写着玩的 http://blog.csdn.net/ai_yong_jie/article/details/51159367 Android 全景视频播放器(VR视频播放器探索一 ...
- Android自定义视频播放器(三)
参看:Android自定义视频播放器(一):https://blog.csdn.net/zxd1435513775/article/details/81507909 参看:Android自定义视频播放 ...
- Android本地视频播放器开发--NDK编译FFmpeg
在Android本地视频播放器开发中的搜索本地视频章节中,我们能够搜索本地视频并且显示每个视频的图片.标题.时间长度,当然如果需要添加其他的例如视频的长度和宽度可以使用Video类中的方法,既然我们获 ...
- Android FFmpeg视频播放器三 音频封装格式解码播放
Android FFmpeg视频播放器一解封装 Android Android FFmpeg视频播放器二 视频封装格式解码播放 视频解封装之后就会得到音频流和视频流,解封状得到的数据是AVPackag ...
最新文章
- 你自己不优秀,认识谁都是个屁
- 学php好不,怎么学好php
- Spark代码生成技术之现象CodeGenerator
- 【Oracle】数据库热备
- devcon 用法2
- pandas-综合练习
- teraterm linux环境,linux ssh telnet TeraTerm终端中文显示乱码解决方法
- 克拉夫斯曼高端定制 刘霞---【YBC中国国际青年创业计划】
- 用XOM编写GraphML?
- bilibil网站采集 返回视频下载地址【代码】
- Win8系统怎么看电脑是32位还是64位?
- 微信转发指定的图文消息到朋友圈(JAVA版)
- FineBI与FineReport对比 1
- 可编辑表格TableCell
- 跳槽字节跳动,从新手到Flutter架构师,一篇就够!深度好文
- 使用Nodejs搭建一个简易的留言簿(完结)
- 一文读懂「用户行为数据」的采集、分析和应用
- 今晚19:00,淘宝自研标准化协议库XQUIC开源直播!
- 分享几款超级好用的手机APP,你肯定能用到
- 7805输入电流有要求吗_7805怎样才能输出2A的电流啊?