android视频播放主要是两种方式1、系统封装好的videoplayer,有前进、后退、暂停/播放、拉动最基本的功能,够一般使用,操作办法也很简单,如果需要自定义程度高就需要用到第二种方法:SurfaceView+mediaplayer,显示通过surfaceView,使mediaplayer和surfaceview绑定

SurfaceView+mediaplayer,主要操作办法:1、监听surfaceview回调函数,等待surfaceview初始化完毕

surface.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
surface.getHolder().addCallback(new Callback() {// surface初始化的回调
// 发生改变
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
} // 创建完成
public void surfaceCreated(SurfaceHolder holder) {
Log.e("media", "surfaceView创建完成!");
preMediaplayer();
} // 销毁
public void surfaceDestroyed(SurfaceHolder holder) {
}
});

2、初始化完毕后就可以对mediaplayer进行操作了,需要了解mediaplayer的生命周期图

if (SinoAppliacation.mediaPlayer == null) {
SinoAppliacation.mediaPlayer = new MediaPlayer();
}
try {
SinoAppliacation.mediaPlayer.reset();
SinoAppliacation.mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
SinoAppliacation.mediaPlayer.setDisplay(surface.getHolder());
SinoAppliacation.mediaPlayer.setDataSource(url);
SinoAppliacation.mediaPlayer.setLooping(true);
SinoAppliacation.mediaPlayer.prepareAsync();

几项最基本的初始化操作,包括设置声音、和surfaceview绑定、设置播放地址、循环播放,异步准备。

在做几项最基本的监听:

SinoAppliacation.mediaPlayer.setOnInfoListener(new OnInfoListener() {// 等待缓冲监听
@Override
public boolean onInfo(MediaPlayer mp, int what, int extra) {
switch (what) {
case MediaPlayer.MEDIA_INFO_BUFFERING_START:
loading.setVisibility(View.VISIBLE);
break;
case MediaPlayer.MEDIA_INFO_BUFFERING_END:
// 缓存完成,继续播放
loading.setVisibility(View.INVISIBLE);
break;
}
return true;
}
});
SinoAppliacation.mediaPlayer.setOnErrorListener(new OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
mCurrentState = STATE_ERROR;
Log.e("mediaplay", "error");
Toast.makeText(BaseVideoPlayActivity.this, "亲,视频出错了!", 0).show();
return false;
}
});
SinoAppliacation.mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
initTimeAndBar();
SinoAppliacation.mediaPlayer.start();
}
});
} catch (Exception e) {
Log.e("media", e + "");
}

这里做了三项监听,当然还有其他监听这里不需要了。第一个是等待缓冲监听,当滑动进度条后还没有及时加载需要显示个progressbar就可以在这里设置。第二个是错误监听,当视频播放出错可以给用户提示。第三项是最重要的,当onPrepared时才是mediaplayer准备完毕可以进行播放了,通过调用start()方法执行播放。通过Pause()暂停。

基本就这些

做的过程中遇到的问题及解决办法:

1、加载时的监听。有两种方式,一个是加载的进度占总进度的比例,一般可以用两个进度条去做加载状态,可以 通过mediaplayer的mediaPlayer.setOnBufferingUpdateListener来监听。如果是拖动还未加载出当前视频,可以通过setOnInfoListener来监听。

2、竖屏切换横屏。有很多人提出这样的需求,但是貌似没有很好的解决办法,android貌似也没有ios那种无缝的一个页面切换的办法。我这里的解决办法是在application里存放一个静态的mediaplayer

public static MediaPlayer mediaPlayer;//视频播放静态类

竖屏和横屏是两个activity,但是切换时只是对静态mediaplayer执行pause,在获取到当前播放位置传递给第二个activity,在执行start播放

3、在切换页面时,直接给静态的mediaplayer调用start方法时会报错,或者从头播放。原因有两个,一、没判断surfaceview是否加载成功,重新进入activity也需要对surfaceview的准备状态进行监听,当执行surfaceCreated创建完成时才可继续操作。二、没有把surfaceview和mediaplayer重新绑定,必须执行setDisplay(surface.getHolder());后再去执行start才能正常播放!

android视频播放心得体会的更多相关文章

  1. 关于Solr的使用总结的心得体会

    摘要:在项目中使用Solr作为搜索引擎对大数据量创建索引,提供服务,本文是作者对Solr的使用总结的一点心得体会, 具体包括使用DataImportHandler从数据库中近实时同步数据.测试Solr ...

  2. Android 视频播放器切换到下个视频时残留上个视频画面的解决办法

    最近在做一个Android视频播放器,遇到一个问题:切换到下一个视频时,中间会停留上一个视频的残存画面.   这是怎么回事?   我在网上找了很多资料,终于找到了原因:我是用自定义一个surfacev ...

  3. 加快FineReport报表设计的几个心得体会

    加快FineReport报表设计的几个心得体会 一.从远程服务器大批量取数进行表样设计时,最好按“列顺序”取一个“空的SQL语句”,这样可提高设计速度.否则每次设计时模板均要从远程读取数据,速度相当慢 ...

  4. Android视频播放之VideoView

    Android视频播放之VideoView 1.VideoView类介绍 Android的VideoView组件可以从不同的来源(例如资源文件或内容提供器)读取图像,计算和维护视频的画面尺寸以使其适用 ...

  5. 十天来学习java的心得体会

    有关学习java是几天来的心得体会: 十天学习java遇到很多问题,每个问题都是经过反复的看书本以及上网查找资料来解决的,发现这一点真的需要自己来而不是去遇到什么问题就去依靠他人(师兄.同学).在其中 ...

  6. android视频播放器开发

    http://blog.csdn.net/u010181592/article/details/49301703 http://blog.csdn.net/qq_33291295/article/de ...

  7. Git的基本使用方法和安装&心得体会

    1. git的安装和github的注册.代码托管.创建organization.邀请member. (1)git的安装 因为我电脑是windows系统,所以下载的是git for windows.在官 ...

  8. "琳琅满屋"调查问卷 心得体会及结果分析

    ·关于心得体会       当时小组提出这个校园二手交易市场的时候,就确定了对象范围,仅仅是面向在校大学生,而且在我们之前就已经有了很多成功的商品交易的例子可以让我们去借鉴,再加上我们或多或少的有过网 ...

  9. 关于多本小说站的SEO—从”易读中文网”获得的心得体会

    从目前国内的网站流量来说,电影站,小说站,游戏站等的流量占总流量的比例还是很高的,许多站长把目光投入到了这几个方面,本文就着重来说对于小说站,尤其是多本小说站的SEO心得体会! 对于小说站来说,只要排 ...

随机推荐

  1. web.xml的说明

    <!--DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. Copyright 2000-2007 Sun Microsystems ...

  2. Tiny4412汇编流水灯代码,Tiny4412裸机LED操作[1]

    从今天开始就正式进入到tiny4412的开发学习中了,今天主要看了一下Tiny4412的启动流程及存储器映射及Exynos4412数据手册,用汇编写了一个跑马灯程序(后续会有C语言版本的出来),先说一 ...

  3. JAVA-----乱码的处理 乱码的解决方法总结

    为什么说乱码是程序员无法避免的话题呢?这个首先要从编码机制上说起,大家都是中文和英文的编码格式不是一样,解码也是不一样的!工作遇到各种各样的乱码的解决方法总结一下. 对于Java由于默认的编码方式是 ...

  4. 1650. Billionaires(线段树)

    1650 简单题 线段树的单点更新 就是字符串神马的 有点小繁琐 开两个map 一个存城市 一个存名字 #include <iostream> #include<cstdio> ...

  5. acdream 小晴天老师系列——苹果大丰收(DP)

    小晴天老师系列——苹果大丰收 Problem Description 小晴天的后花园有好多好多的苹果树,某天,苹果大丰收~小晴天总共摘了M个苹果,我们假设苹果之间是不可分辨的. 为了保存苹果,小晴天买 ...

  6. maven pom.xml加载不同properties配置

    1.pom.xml =========================== <!-- 不同的打包环境配置: test=开发/测试测试环境,  product=生产环境; 命令行方式: mvn c ...

  7. file的getPath getAbsolutePath和getCanonicalPath的区别

    转自:http://www.blogjava.net/dreamstone/archive/2007/08/08/134968.html file的这几个取得path的方法各有不同,下边说说详细的区别 ...

  8. APK中java代码反编译

    Android APK中的Java代码可以被反编译到什么程度主要看APK的加密程度. 第一种情况:无混淆无加密无加壳.直接利用Dex2jar和JD-GUI可把源码从APK里抠出来,代码逻辑清晰,基本上 ...

  9. Tomcat配置JNDI数据源

    经过3个多小时的努力,配置JNDI数据源(主要是通过DBCP连接池)终于搞定-还是Tomcat官方的说明好,不过全是英文的,大概还看得懂.百度上那么花花绿绿的太多了,一个也没成功!...本例使用的数据 ...

  10. Android学习系列(22)--App主界面比较

    本文算是一篇漫谈,谈一谈当前几个流行应用的主界面布局,找个经典的布局我们自己也来实现一个.不是为了追求到底有多难,而是为了明白我们确实需要这么做. 走个题,android的UI差异化市场依然很大,依然 ...