1、使用MediaPlayer和SurfaceView播放视频会闪黑屏一下
解决办法 :先用一个缩略图挡一下 监听MediaPlayer的OnInfoListener事件
public boolean onInfo(MediaPlayer mp, int what, int extra) {
super.onInfo(mp, what, extra);
if(what == mp.MEDIA_INFO_VIDEO_RENDERING_START){
//隐藏缩略图
}
return false;
}
2、常见的监听事件回调有哪些?
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.setOnCompletionListener(mCompletionListener);
mMediaPlayer.setOnErrorListener(mErrorListener);
mMediaPlayer.setOnErrorExtraListener(mErrorExtraListener);
mMediaPlayer.setOnInfoListener(mInfoListener);
mMediaPlayer.setOnBufferingUpdateListener(mBufferingUpdateListener);
mMediaPlayer.setOnSeekCompleteListener(this);
mMediaPlayer.setOnStartListener(onStartListener);
3、SurfaceView的使用,及生命周期
SurfaceView的基本使用 - 张英爱 - 博客园
public class SurfaceViewTemplate extends SurfaceView implements SurfaceHolder.Callback,Runnable{
private SurfaceHolder mHolder;
private Canvas mCanvas;
private boolean mIsDrawing;
//构造方法
public SurfaceViewTemplate(Context context) {
super(context);
initView();
}
public SurfaceViewTemplate(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SurfaceViewTemplate(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
private void initView() {
mHolder=getHolder();
mHolder.addCallback(this);
setFocusable(true);
setFocusableInTouchMode(true);
this.setKeepScreenOn(true);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
mIsDrawing=true;
new Thread(this).start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mIsDrawing=false;
}
@Override
public void run() {
while (mIsDrawing){
draw();
//通过线程休眠以控制刷新速度
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private void draw() {
try {
mCanvas=mHolder.lockCanvas();
//初始化画布并在画布上画一些东西
}catch (Exception e){
}finally {
//判断画布是否为空,从而避免黑屏情况
if(mCanvas!=null){
mHolder.unlockCanvasAndPost(mCanvas);
}
}
}
}
4、有声音没有图像 视频播放有声音没图像也许是在使用MediaPlayer最容易出现的问题,几乎所有使用MediaPlayer的新手都会遇到。视频播放的图像呈现需要一个载体,需要利用MediaPlayer.setDisplay设置一个展示视频画面的SurfaceHolder,最终视频的每一帧图像是要绘制在Surface上面的。通常,设置给MediaPlayer的SurfaceHolder未被创建,视频播放就注定没有图像。 * 比如你先调用了setDisplay,但是这个时候holder是没有被创建的。视频就没有图像了。 * 或者你在setDisplay的时候holder确保了holder是被创建了,但是当因为一些原因holder被销毁了,视频也就没有图像了。 * 再者,你没有给展示视频的view设置合适的大小,比如都设置wrap_content,或者都设置0,也会导致SurfaceHolder不能被创建,视频也就没有图像了。 4、视频图像变形 Surface展示视频图像的时候,是不会去主动保证和呈现出来的图像和原始图像的宽高比例是一致的,所以我们需要自己去设置展示视频的View的宽高,以保证视频图像展示出来的时候不会变形。我认为比较合适的做法就是利用FrameLayout嵌套一个SurfaceView或者其他拥有Surface的View来作为视频图像播放的载体View,然后再OnVideoSizeChangeListener的监听回调中,对载体View的大小做更改。 5、切入后台后声音还在继续播放 这个问题只需要在onPause中暂停播放即可 6、切入后台再切回来,视频黑屏 诸如此类的黑屏问题,多是因为surfaceholder被销毁了,再切回来时,需要重新给MediaPlayer设置holder。 7、播放时会有一小段时间的黑屏 视频准备完成后,调用play进行播放视频,承载视频播放的View会是黑屏状态,我们只需要在播放前,给对应的Surface绘制一张图即可。 8、多个SurfaceView用来播放视频,滑动切换时会有上个视频的残影 当视频切换出界面,设置surfaceView的visiable状态为Gone,界面切回来时再设置为visiable即可。
相关学习:Android MediaPlayer+SurfaceView播放视频 (异常处理)_李建国的博客-CSDN博客