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. Android:实现无标题的两种方法

    实现无标题的两种方法:配置xml文件和编写代码设置 1.在AndroidManifest.xml文件中进行配置 实现全屏效果: android:theme="@android:style/T ...

  2. 使用IntelliJ Idea创建Spring MVC项目

  3. JMS基础(2)

    1.  JMS基本概念 JMS(Java Message Service) ,即Java消息服务.JMS是SUN提出的旨在统一各种消息中间件(MOM)系统接口的规范.它提供标准的产生.发送.接收消息的 ...

  4. 【转】android资源目录---assets与res/raw区别

    blog.csdn.net/hshm20517/article/details/6461890 assets:用于存放需要打包到应用程序的静态文件,以便部署到设备中.与res/raw不同点在于,ASS ...

  5. 关于Firefox浏览器如何支持ActiveX控件,一个小的Hellow World

    今天尝试开发一个Firefox的插件.虽然比较简单,网上也有很多教程,但是感觉一些教程写的比较麻烦,在初步的开发过程中并没有用到那些东西,于是自己把开发过程记录下来.我是根据Mozilla官方教程开发 ...

  6. C语言中的位拷贝与值拷贝浅谈(转载)

    注:C语言实现的PHP变量的赋值过程中,就涉及到了 深拷贝和浅拷贝 位拷贝拷贝的是地址(也叫浅拷贝),而值拷贝则拷贝的是内容(深拷贝).深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象 ...

  7. CodeForces Good Bye 2014 B. New Year Permutation

    可能是因为这次没有分Div.1和Div.2,所以感觉题的难度比较大. 题意: 给出一个1~n的排列和一个邻接矩阵A,Aij = 1表示可以交换排列的第i项和第j项,问经过若干次交换后,求能够得到最小字 ...

  8. python扩展实现方法--python与c混和编程

    前言 需要扩展Python语言的理由: 创建Python扩展的步骤 1. 创建应用程序代码 2. 利用样板来包装代码 a. 包含python的头文件 b. 为每个模块的每一个函数增加一个型如PyObj ...

  9. Java [leetcode 21]Merge Two Sorted Lists

    题目描述: Merge two sorted linked lists and return it as a new list. The new list should be made by spli ...

  10. (3)java棧

    java棧和函数调用的关系图 [名词解释]--->java棧是一块线程的私有空间--->java的棧是先进后出的数据结构.函数返回,则该函数的棧帧被弹出.--->一个函数对应一个棧帧 ...