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. 第十七章 委托 第十八章 Attribute 第十九章 可空值类型

    1.委托揭秘 定义一个委托,编译器会生成一个继承自System.MulticastDelegate的类,所有的委托都继承自该类. 由于委托是类,所以能定义类的地方,都能定义委托. 委托内部有一个tar ...

  2. Django用户认证系统(三)组与权限

    Django的权限系统很简单,它可以赋予users或groups中的users以权限. Django admin后台就使用了该权限系统,不过也可以用到你自己的代码中. User对象具有两个ManyTo ...

  3. linux netcat命令

    netcat是网络工具中的“瑞士军刀”,它能通过TCP和UDP在网络中读写数据.通过与其他工具结合和重定向,你可以在脚本中以多种方式使用它.使用netcat命令所能完成的事情令人惊讶. netcat所 ...

  4. Linux Shell常用命令手册(Updating)

    检查远程端口是否对bash开放: nc -nvv $IP $PORT telnet $IP $PORT 当前任务的前后台切换: Ctrl + z fg 截取变量前5个字符: ${variable:0: ...

  5. Git版本控制使用介绍

    Git是什么? Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git与SVN的最主要的区别? Git是分布式的,SVN不是 Git没有一个全局的版本号,而SVN有 ...

  6. maven打包源代码sources.jar和javadoc.jar帮助文档

    maven中如何打包源代码 *-sources.jar 方式一 :   命令行方式 进入cmd命令行,进入项目工程pom.xml所在路径目录,运行mvn source:jar 和 mvn javado ...

  7. poj 3026 Borg Maze (最小生成树+bfs)

    有几个错误,调试了几个小时,样例过后 1Y. 题目:http://poj.org/problem?id=3026 题意:就是让求A们和S的最小生成树 先用bfs找每两点的距离,再建树.没剪枝 63MS ...

  8. SGU185 - Two Shortest

    原题地址:http://acm.sgu.ru/problem.php?contest=0&problem=185 题目大意:给出一个无向图,求出从 1 到 n 的两条没有相同边的最短路径(允许 ...

  9. [原]Unity3D深入浅出 - GUI控件

    Unity的GUI类提供了丰富的界面控件,通过组合这些控件,完成和用户交互的界面. Lable:绘制文本和图片 Box:绘制一个图形框 Button:绘制一个响应单击事件的按钮 RepeatButto ...

  10. 对同一个项目下的多个数据库Context进行迁移Migrations

    PM> Enable-Migrations -MigrationsDirectory "Migrations\ContextA" -ContextTypeName MyPro ...