一个简单的视频控制播放,使用原生控件进行视频处理,可以根据需要可以自行扩展。

效果图:

遇到的问题1:mediaPlay.setOnPreparedListener()第一次播放无法初始化问题 这个方法不知道什么情况,第二次之后就正常了。使用了异步的方法进行UI数据更新,也是不行。所以另找了方法去实现时间和seekbar拖动控制播放的功能。如果不需要控制,只是显示,就无所谓了、

解决方法:

使用mediaPlay.setOnPreparedListener()代替,内部调用setOnBufferingUpdateListener()方法进行数据更新,然后搞个线程将UI更新一下就ok了,效果还行。

代码片段(因为写demo喜欢写一起,有点乱,就先只放代码片段,需要完整的私聊发邮箱地址):

    private SurfaceView surfaceview;private MediaPlayer player;SurfaceHolder holder;private SeekBar video_seekbar;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);video_seekbar = (SeekBar) findViewById(R.id.video_seekbar);surfaceview = (SurfaceView) findViewById(R.id.surfaceview);video_time = (TextView) findViewById(R.id.video_time);holder = surfaceview.getHolder();player = new MediaPlayer();holder.addCallback(new SurfaceHolder.Callback() {@Overridepublic void surfaceCreated(SurfaceHolder holder) {//开始运行时,就直接播放Play();}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {//当画面发生变化执行}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {
//当画面不见得时候执行stop();}});video_seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int i, boolean b) {}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {int progress = seekBar.getProgress();//在当前位置播放player.seekTo(progress);}});}private void Play() {//一定要先重置!!!player.reset();//播放模式player.setAudioStreamType(AudioManager.STREAM_MUSIC);try {//放视频Uri uri = Uri.parse("https://sy.hyylm.com/ff0c98f290ed496597e392c2befacae1.mp4");player.setDataSource(MainActivity.this, uri);//把视频放到surfaceview上player.setDisplay(holder);//准备工作player.prepare();player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {@Overridepublic void onPrepared(MediaPlayer mediaPlayer) {mediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {@Overridepublic void onBufferingUpdate(MediaPlayer mediaPlayer, int i) {Log.e("test_mediaPlayer", mediaPlayer.getCurrentPosition() + "");
//                            video_seekbar.setProgress(mediaPlayer.getCurrentPosition());video_seekbar.setMax(mediaPlayer.getDuration());new Thread(new Runnable() {@Overridepublic void run() {while (video_seekbar.getProgress() <= video_seekbar.getMax()) {int currentPosition = 0;try {try {if (mediaPlayer != null) {if (mediaPlayer.isPlaying()) {currentPosition = mediaPlayer.getCurrentPosition();video_seekbar.setProgress(currentPosition);int duration2 = mediaPlayer.getDuration();//获取音乐总时长int position = mediaPlayer.getCurrentPosition();//获取当前播放的位置
//                                        handler.sendEmptyMessage(0);Message msg = Message.obtain();msg.what = 0;//创建BundleBundle bundle = new Bundle();bundle.putString("key", calculateTime(position / 1000) + " / " + calculateTime(duration2 / 1000));//为Message设置Bundle数据msg.setData(bundle);//发送消息handler.sendMessage(msg);}}} catch (IllegalStateException e) {}} catch (Exception e) {e.printStackTrace();}}}}).start();}});}});//开始了player.start();} catch (Exception e) {e.printStackTrace();}}/*** 停止视频播放的方法*/public void stop() {try {if (player != null) {player.pause();player.stop();}} catch (Exception e) {e.printStackTrace();} finally {
//            canProgress = false;if (player != null) {player.release();player = null;}}}@Overrideprotected void onDestroy() {super.onDestroy();stop();}//计算播放时间public String calculateTime(int time) {int minute;int second;if (time >= 60) {minute = time / 60;second = time % 60;//分钟在0~9if (minute < 10) {//判断秒if (second < 10) {return "0" + minute + ":" + "0" + second;} else {return "0" + minute + ":" + second;}} else {//分钟大于10再判断秒if (second < 10) {return minute + ":" + "0" + second;} else {return minute + ":" + second;}}} else {second = time;if (second >= 0 && second < 10) {return "00:" + "0" + second;} else {return "00:" + second;}}}

布局文件也比较简单:

<RelativeLayout 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:orientation="vertical"android:layout_height="match_parent"tools:context=".MainActivity"><uk.co.senab.photoview.PhotoViewandroid:id="@+id/image_sf"android:layout_width="match_parent"android:layout_height="match_parent"android:src="@mipmap/ic_launcher"android:visibility="gone"/><com.youth.banner.Bannerandroid:id="@+id/testBanner"android:layout_width="match_parent"android:layout_height="match_parent"android:visibility="gone"/><RelativeLayoutandroid:id="@+id/rl"android:layout_width="match_parent"android:layout_height="250dp"android:visibility="visible"><SurfaceViewandroid:id="@+id/surfaceview"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="8" /></RelativeLayout><SeekBarandroid:id="@+id/video_seekbar"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_marginRight="5dp"android:layout_weight="1"android:max="100"android:maxHeight="1.0dip"android:minHeight="1.0dip"android:progress="0" /><TextViewandroid:id="@+id/video_time"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:text="播放时间"android:paddingTop="40dp"/></RelativeLayout>

代码那里贴的部分代码,只要代码片段就是监听部分,其他的就没什么了。最大的优点应该就是因为是用系统原始控件搞得,不至于像第三方那么大,宽展难受。如果是对视频播放要求比较高的,建议使用第三方的去弄,毕竟方便。

Android SurfaceView+MediaPlayer+SeekBar实现视频控制播放相关推荐

  1. Android播放器自定义,android surfaceView+mediaPlayer 自定义视频播放器

    你可以参考我的写法,注意点就是你自定义的MyCallBack()里面要回调,也就是我写的SurfaceCallBack()里面的SurfaceCreated()函数要实现你写的setOnPrepare ...

  2. Android SurfaceView+MediaPlayer视频按比例缩放,视频添加同比例描点标记tag

    视频切换横竖屏参考文章: https://blog.csdn.net/csdnwr/article/details/121141056 第一步:圈定画布为 宽400像素. 高度videoScale计算 ...

  3. Android之MediaPlayer加载视频慢

    问题:Android系统播放器MediaPlayer播放网络视频,加载慢...缓冲慢... 结论:视频元数据位置不对 简单解释就是,大部分的视频格式是MP4,MP4格式的视频是由一个个Box组成的.这 ...

  4. Android FFmpeg系列——5 音视频同步播放

    https://blog.csdn.net/JohanMan/article/details/83176144

  5. android语音播放工具类,Android开发之MediaPlayer多媒体(音频,视频)播放工具类

    本文实例讲述了Android开发之MediaPlayer多媒体(音频,视频)播放工具类.分享给大家供大家参考,具体如下: package com.android.imooc.chat; import ...

  6. Android 使用MediaPlayer播放网络音频

    一.前言 MediaPlayer是Android自带的一个多媒体播放类,可以播放音视频流或者本地音视频文件.MediaPlayer方法的调用需要在一定的状态下,下图是一个MediaPlayer对象被支 ...

  7. Android_listview_video安卓列表视频直接播放

    今天给以下效果来提供一点思路 常能看到listview中有一个视频文件(或者视频图片,就是那种没有播放的视频预览图),点击之后直接可以在listview上播放出来 一般的效果是: 1.在播放一个视频的 ...

  8. Android之MediaPlayer播放网络视频的实现方法

    前段时间忙于工作,现在有时间来分享一下: 这篇文章主要介绍了Android的MediaPlayer播放网络视频的实现方法,是一个非常实用的功能,需要的朋友可以参考下 前面讲解了MediaPlayer播 ...

  9. android通过点击播放视频,Android通过MediaPlayer实现播放视频实例

    最进想通过MediaPlayer实现播放一个视频,并且SeekBar可拖动的功能,记录下来,以便查阅! 实现效果如下: android:layout_width="fill_parent&q ...

最新文章

  1. [Pulgin] 利用swfupload实现java文件批量上传
  2. Uva5009 Error Curves
  3. Oracle监听器Server端与Client端配置实例
  4. Linux 解决ssh连接慢的问题
  5. Linux上线程开发API概要(线程)
  6. robot:List变量的使用注意点
  7. 如何设置多级标题_办公技巧|标题样式amp;多级列表结合,再也不用手动修改1.1、1.2 ...!...
  8. OpenJDK内存错误
  9. 多线程编程学习总结(转载)
  10. 编译openjdk时cygwin需要下载的内容
  11. ATmega128A 串口问题
  12. 资深HR告诉你到底怎么写一份好的简历(非常全面)
  13. 圆柱体积怎么算立方公式_圆柱的体积换算立方怎么算
  14. android局域网 nas,华为手机通过群晖NAS备份时提示“本机和您的NAS设备需处于同一局域网”的解决方法...
  15. 计算机仿真和vr的区别,扫盲科普:今天才知道VR和AR的区别
  16. 软考基础知识—操作系统
  17. centos上搭建nginx视频点播服务器(nginx+vod+lua http发送鉴权消息)
  18. Pascal triangle 帕斯卡三角形 杨辉三角形 二项式定理
  19. 猿创征文|我的Python成长之路
  20. vue+echarts的组件封装

热门文章

  1. 数据分析,从入门到崩溃
  2. 书店图书销售管理系统
  3. LabVIEW使用移位寄存器计算平均值
  4. 仿站小工具 V10.5
  5. 练习-编程实现交换数组a和数组b中的对应元素
  6. 数据结构二叉排序树建立_数据结构101什么是二叉搜索树
  7. 在精读英文文献时有哪些好习惯?
  8. 西安电子科技大学通院811电院821考研上岸经验分享(四)
  9. 如何把ACCESS的数据导入到Mysql中
  10. 磁卡、条码卡、IC卡、CPU卡、RFID等常识