美文网首页IM、视频直播、蓝牙专题随笔
Android实现使用MediaPlayer+SurfaceVi

Android实现使用MediaPlayer+SurfaceVi

作者: 王元 | 来源:发表于2016-06-30 15:28 被阅读3604次

最近由于项目需求,需要做一个视频播放器,起初想到的是使用VideoView,但是始终觉得这个控件不常用,而且对于开发过程中出现的问题,也不太好解决(这是个人直觉,并未经过实践验证,有兴趣的童鞋可以去实验一下),话不多说,做过Android开发的童鞋大家都知道,Android播放音频使用的是mediaPlayer,但是mediaPlayer没有提供播放的界面,其实mediaPlayer可以给设置一个SurfaceHolder来播放视频的画面,不知道的东西可以上Android开发者网站上看一下:https://developer.android.com/reference/android/media/MediaPlayer.html#Permissions

1,在做任何关于音视频播放的应用中都应该处理Android的audioFocus(具体的我会在另外一篇文章中介绍)

2,使用mediaPlayer加载视频文件

mMediaPlayer.setDataSource(mp3);

// 设置音频流的类型

mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

mMediaPlayer.prepareAsync(); 

3,初始化surfaceView,然后getHolder(),addCallback

SurfaceHoldermSurfaceHolder=mVideoSurFaceView.getHolder();

mSurfaceHolder.addCallback(this);

mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);`

4,Callback.surfaceCreated()是时候给mediaPlayer设置surfaceHolder,并设置资源文件(第二步)。最开始我也考虑过在activity.onresume的时候开始,但是这样的不好处很明显就是可能在开始声音之后,几秒才能看到画面。而在Callback.surfaceCreated()的时候,可以保证在surfaceView创建完成,这个时候,开始播放视频,画面和音频就不会出现前面说的情况

 mMediaPlayer.start();

 mMediaPlayer.setDisplay(holder);

在Callback.surfaceDestroyed()的时候,暂停播放,在activity销毁的时候停止播放并释放资源

5,需要注意的一点是,在开始和暂停或者停止播放前都需要多MediaPlayer判空

相关文章

网友评论

  • 0c28ba0c531d:最近在做android在线视频播放的时候发现在播放rtsp协议的时候mediaplayer的缓存回调onBufferingUpdate不能执行(代码没问题,http协议可以执行),同样在videoView中的缓存进度条也没有变化,并且不能缓存,不知道有没有遇到这个问题并且知道原因的人?

本文标题:Android实现使用MediaPlayer+SurfaceVi

本文链接:https://www.haomeiwen.com/subject/llffjttx.html