使用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制作视频播放器相关推荐

  1. Android本地视频播放器开发 - 搜索本地视频(1)

    这一章的主要内容是搜索手机本地视频,添加到ListView列表里,每一个表项含有这个视频的缩略图,视频的播放时间,视频的标题,在搜索本地视频(1)中我们先制作搜索功能.   Video.java--视 ...

  2. 实现在Android本地视频播放器开发

    在Android本地视频播放器开发中的搜索本地视频章节中,我们能够搜索本地视频并且显示每个视频的图片.标题.时间长度,当然如果需要添加其他的例如视频的长度和宽度可以使用Video类中的方法,既然我们获 ...

  3. Android本地视频播放器开发--视频解码

    在上一章Android本地视频播放器开发--SDL编译编译中编译出sdl的支持库,当时我们使用的2.0,但是有些api被更改了,所以在以下的使用者中我们使用SDL1.3的库,这个库我会传上源码以及编译 ...

  4. 基于android的视频播放器,基于Android的视频播放器的设计与实现-.doc

    基于Android的视频播放器的设计与实现- 基于Android的视频播放器的设计与实现 中 文 摘 要 如今,随着基于Android的智能手机的,.因此,设计一个基于android手机的多功能播放器 ...

  5. android 编译 sdl,SDL编译 - Android本地视频播放器开发_Linux编程_Linux公社-Linux系统门户网站...

    在上一章  Android本地视频播放器开发--ffmpeg解码视频文件中的音频(2)[http://www.linuxidc.com/Linux/2013-06/85955p5.htm]中使用Ope ...

  6. Android 节操视频播放器jiecaovideoplayer使用

    Android 节操视频播放器jiecaovideoplayer使用 特点: 全屏时启动新Activity实现播放器真正的全屏功能 能在ListView.ViewPager和ListView.View ...

  7. Android 全景视频播放器(VR视频播放器探索二)

        上次随便写着玩的  http://blog.csdn.net/ai_yong_jie/article/details/51159367   Android 全景视频播放器(VR视频播放器探索一 ...

  8. Android自定义视频播放器(三)

    参看:Android自定义视频播放器(一):https://blog.csdn.net/zxd1435513775/article/details/81507909 参看:Android自定义视频播放 ...

  9. Android本地视频播放器开发--NDK编译FFmpeg

    在Android本地视频播放器开发中的搜索本地视频章节中,我们能够搜索本地视频并且显示每个视频的图片.标题.时间长度,当然如果需要添加其他的例如视频的长度和宽度可以使用Video类中的方法,既然我们获 ...

  10. Android FFmpeg视频播放器三 音频封装格式解码播放

    Android FFmpeg视频播放器一解封装 Android Android FFmpeg视频播放器二 视频封装格式解码播放 视频解封装之后就会得到音频流和视频流,解封状得到的数据是AVPackag ...

最新文章

  1. 你自己不优秀,认识谁都是个屁
  2. 学php好不,怎么学好php
  3. Spark代码生成技术之现象CodeGenerator
  4. 【Oracle】数据库热备
  5. devcon 用法2
  6. pandas-综合练习
  7. teraterm linux环境,linux ssh telnet TeraTerm终端中文显示乱码解决方法
  8. 克拉夫斯曼高端定制 刘霞---【YBC中国国际青年创业计划】
  9. 用XOM编写GraphML?
  10. bilibil网站采集 返回视频下载地址【代码】
  11. Win8系统怎么看电脑是32位还是64位?
  12. 微信转发指定的图文消息到朋友圈(JAVA版)
  13. FineBI与FineReport对比 1
  14. 可编辑表格TableCell
  15. 跳槽字节跳动,从新手到Flutter架构师,一篇就够!深度好文
  16. 使用Nodejs搭建一个简易的留言簿(完结)
  17. 一文读懂「用户行为数据」的采集、分析和应用
  18. 今晚19:00,淘宝自研标准化协议库XQUIC开源直播!
  19. 分享几款超级好用的手机APP,你肯定能用到
  20. 7805输入电流有要求吗_7805怎样才能输出2A的电流啊?

热门文章

  1. 汇编语言 王爽 第四版 实验3
  2. 程序设计c语言答案pdf,C语言程序设计习题解答.pdf
  3. 基于SSM的景区旅游管理系统
  4. keli下使用断点调试
  5. mysql安装包配置方式_mysql安装包方式安装及配置(Windows)
  6. 苹果在中国的审核规律探索一
  7. 如何查看sqlserver数据库文件位置
  8. AndroidTV开发7实现仿小米电视和各种盒子TV焦点放大缩小效果
  9. Fatal error: Class 'GearmanClient' not found解决方法
  10. java什么是自动类型转换_java自动类型转换