MediaPlayer+SeekBar暂停快进快退

    • 首先是,如何能够播放一个视频(网络权限小伙伴们自己盘上)
    • 然后是进度条Seekbar
    • 然后是点击时改变视频播放进度
    • 最后是暂停和继续,
  • INTERESTING!!!

今天学习了音乐播放器超低配版,但是我已经很满足了,因为她没有广告…
话不多说让我们来看一下实现过程吧
首先供上布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:padding="20dp"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><FrameLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><SurfaceViewandroid:id="@+id/surfaceView"android:layout_width="match_parent"android:layout_height="400dp" /><ProgressBarandroid:id="@+id/progressBar"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center" /></FrameLayout><LinearLayoutandroid:layout_above="@id/mypro"android:layout_width="match_parent"android:layout_height="wrap_content"><ImageViewandroid:id="@+id/left_i"android:layout_width="50dp"android:layout_height="50dp"android:layout_marginRight="80dp"android:background="@drawable/back"/><ImageViewandroid:id="@+id/cen"android:layout_width="50dp"android:layout_height="50dp"android:layout_marginRight="80dp"android:background="@drawable/a7r" /><ImageViewandroid:id="@+id/right_i"android:layout_width="50dp"android:layout_height="50dp"android:background="@drawable/goon"/></LinearLayout><SeekBarandroid:id="@+id/mypro"style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"/>
</RelativeLayout>

出来是这么个样子

颜值方面尽力了,她要是长的比我好看了我就该酸了

然后来上代码实现,先来个整体的,然后分开说一下

public class MainActivity extends AppCompatActivity {private SurfaceView surfaceView;private MediaPlayer player;private SurfaceHolder holder;private ProgressBar progressBar;private SeekBar mypro;ImageView left,right,cen;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);surfaceView = (SurfaceView) findViewById(R.id.surfaceView);progressBar= (ProgressBar) findViewById(R.id.progressBar);mypro = findViewById(R.id.mypro);cen = findViewById(R.id.cen);left = findViewById(R.id.left_i);right = findViewById(R.id.right_i);//视频链接可能已失效String uri="http://vfx.mtime.cn/Video/2019/03/19/mp4/190319125415785691.mp4";player=new MediaPlayer();try {player.setDataSource(this, Uri.parse(uri));holder=surfaceView.getHolder();holder.addCallback(new MyCallBack());player.prepare();player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {@Overridepublic void onPrepared(MediaPlayer mp) {progressBar.setVisibility(View.INVISIBLE);player.start();player.setLooping(true);}});} catch (IOException e) {e.printStackTrace();}mypro.setMax(player.getDuration());final Handler handler = new Handler();final Runnable updateThread = new Runnable() {public void run() {if (player != null) {mypro.setProgress(player.getCurrentPosition());handler.postDelayed(this, 100);}}};new Thread(updateThread).start();mypro.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {handler.removeCallbacks(updateThread);}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {player.seekTo(seekBar.getProgress());handler.postDelayed(updateThread, 1000);}});cen.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (player.isPlaying()) {player.pause();//暂停播放cen.setImageResource(R.drawable.a7r);} else {player.start();//继续播放cen.setImageResource(R.drawable.a7v);}}});left.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {handler.removeCallbacks(updateThread);player.seekTo(player.getCurrentPosition()-1000);handler.postDelayed(updateThread, 1000);}});right.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {handler.removeCallbacks(updateThread);player.seekTo(player.getCurrentPosition()+2000);handler.postDelayed(updateThread, 1000);}});}private class MyCallBack implements SurfaceHolder.Callback {@Overridepublic void surfaceCreated(SurfaceHolder holder) {player.setDisplay(holder);}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {}}
}

抱歉没能养成打注释的好习惯,我们就来看一下吧

首先是,如何能够播放一个视频(网络权限小伙伴们自己盘上)


通过给播放器设置Uri数据源,先prepare准备然后打开监听通过start播放
Loogping设置为循环播放,有其他需求的小伙伴可以做,但是需要另外在线程加判断了

然后是进度条Seekbar


这是一个进度条实时更新监听,通过handle接收,线程中没0.1秒跟进一次

然后是点击时改变视频播放进度


这个地方没什么可说的,就是在点击时先断掉监听,然后重新设置进度,再打开监听
快进慢进的实现和这个原理一样,后面我就不单独拿出来了,需要的去上面找

最后是暂停和继续,


先通过isPlaying判断当前的状态
然后分别调用pause和start,同时改变图标样式m
因为是在不会发动图没法给各位看效果,抱歉喽

INTERESTING!!!

MediaPlayer+SeekBar暂停快进快退相关推荐

  1. Android FFmpeg系列——7 实现快进/快退功能

    Android FFmpeg系列--0 编译.so库 Android FFmpeg系列--1 播放视频 Android FFmpeg系列--2 播放音频 Android FFmpeg系列--3 C多线 ...

  2. vue项目视频实现键盘快进快退,音量调大小及监听播放事件

    直接上代码 <div style="padding-top:56.25%" ><video style="width:100%;height:672px ...

  3. Silverlight 5 beta新特性探索系列:9.视频快进快退和TextSearch对象对文字项查询

    本节讲诉两个新特性:一.在Silverlight 5中可以控制MediaElement对象播放的视频进行快进快退控制.二.在Silverlight 5中的文字项进行搜索查询. 一.对于MediaEle ...

  4. python 循环播放音乐_python gstreamer实现视频快进/快退/循环播放功能

    这篇文章主要介绍了python gstreamer 实现视频快进/快退/循环播放功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 Gstreamer到底是个啥? ...

  5. 安卓平板倍速_推荐:安卓上本地音频播放器,可实现5秒快进快退和倍速播放...

    前一篇文章推荐过一个app,但那app没倍速播放功能.我又找到了一个更完美的app 安卓手机上我自己需要这样一款app,主要用来听电子书,知识音频等.需要能实现快进快退几秒钟的以及倍速播放功能.这功能 ...

  6. 十、FFmpeg视频播放之快进快退

    1.处理快进快退(seek)命令 本章我将给大家讲解怎么给我们的播放器添加快进.快退.定位功能,这也是几乎所有播放器都有的功能.为实现此功能,我们要用到av_seek_frame函数,这个函数非常简单 ...

  7. Java后端处理video快进快退播放以及断点续传的原理和代码

    video 快进快退的原理: 通过对所在服务器上的流媒体进行skip操作,然后再response的header里设置相应的Content-Range以及其他属性,来控制视频流的快进快退的功能. 断点续 ...

  8. ts, mp4文件快进快退(seek)原理

    最近用potplayer播放一些ts文件,seek(快进快退)发现会有卡顿问题,但是同一个文件用mp4转封装之后seek就很快很流畅了.所以抽空研究了ffplay 对mp4文件和ts文件的 seek ...

  9. ffmpeg播放器快进快退(七)

    指导7:快进快退 处理快进快退命令 现在我们来为我们的播放器加入一些快进和快退的功能,因为如果你不能全局搜索一部电影是很让人讨厌的.同时,这将告诉你av_seek_frame函数是多么容易使用. 我们 ...

最新文章

  1. 怎么解释三线圈直流电机工作原理更好?
  2. docker 容器退出自动删除 一次性运行
  3. eclipse中插件修改svn用户名密码
  4. Python中@staticmethod和@classmethod之间的区别
  5. python 控制手机摄像头_python+open cv调用手机摄像头,保存文件
  6. 从M2M迁移到IIoT工业物联网
  7. 使用HTML5开发手机离线应用
  8. springmvc java中转发_springmvc实现转发和重定向
  9. ASP.NET Web API 跨域访问(CORS)要注意的地方
  10. django进阶03静态文件和模板
  11. 构建小型Linux跟文件系统镜像(Ext2 或 Ext3)
  12. 「代码随想录」494. 目标和【动态规划】力扣详解!
  13. 读书笔记《计算机是怎样跑起来的》
  14. 小程序之父子组件传值详解
  15. ARouter路由简单使用以及源码解析
  16. 开启nexus出现If you insist running as root, then set the environment variable RUN_AS_USER=root
  17. 市场调研-全球与中国安全摄像头芯片市场现状及未来发展趋势
  18. 英文文章单词自动查找脚本
  19. android rom包修改工具,自己修改安卓的ROM包(非官方) | 寒山烟雨
  20. 科学计算机程序 字表处理软件都是,计算机应用基础知识--1

热门文章

  1. 提升搜索效率-----使用chatGPT插件让搜索结果直接展示在谷歌界面右侧
  2. SolidWorks Motion学习笔记1
  3. 从虚拟个人助理到AI开放平台 李志飞欲用“问问”定义下一代人机交互
  4. 什么是ISO,为什么企业都在做ISO9001认证?
  5. 微软放弃的Lumia950XL成功用上Win11系统
  6. linux下网卡bonding配置
  7. 子网掩码的计算方法(实例)
  8. c语言 结构体 初始化,C语言结构体初始化
  9. 如何学习自动化测试?
  10. Nginx 内存池剖析