原为链接如下:
https://blog.csdn.net/Rookie_or_beginner/article/details/115129648
https://blog.csdn.net/Rookie_or_beginner/article/details/115129648
简单来说,就是Activity受到锁屏和切换界面的影响销毁了播放时的SurfaceHolder,重新进入程序后没有给播放器指定新的SurfaceHolder,导致没有画面或者画面全黑。
重新写一下解决方案!
使用MediaPlayer+SurfaceView来替换原有的VidwoView
在Activity的onCreate之前声明
private String VideoPath="";//视频的路径,我使用的时raw下的
private SurfaceView videoView;//layout新加SurfaceView
private MediaPlayer videoPlayer;//要在SurfaceView里去创建Media
private boolean IsSurfaceDestoryed=false;//是否被销毁
在Activity的onCreate里面给SurfaceView添加回调
videoView = (SurfaceView) findViewById(R.id.VideoSurfaceView);//id:VideoSurfaceView
videoView.getHolder().addCallback(new SurfaceViewCallback());//添加回调
//设置视频路径,直接播放raw文件夹下视频
VideoPath = "android.resource://" + getPackageName() + "/" + R.raw.back;
在Activity的类中添加SurfaceViewCallback
//surface 回调
class SurfaceViewCallback implements SurfaceHolder.Callback {
@Override
public void surfaceCreated(SurfaceHolder holder) {
if(videoPlayer==null) {
videoPlayer = new MediaPlayer();
try {
videoPlayer.setDataSource(MainActivity.this,Uri.parse(VideoPath));
} catch (IOException e) {
e.printStackTrace();
videoPlayer.setVideoScalingMode(MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
videoPlayer.setLooping(true);
videoPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
if (!videoPlayer.isPlaying()) {
if (IsSurfaceDestoryed) {
IsSurfaceDestoryed = false;
videoPlayer.setDisplay(holder);
videoPlayer.start();
//循环播放
videoPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mPlayer) {
// TODO Auto-generated method stub
mPlayer.start();
mPlayer.setLooping(true);
videoPlayer.setDisplay(holder);
videoPlayer.prepareAsync();
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
///释放
IsSurfaceDestoryed = true;
videoPlayer.release();
videoPlayer=null;
导致锁屏黑屏的原因:播放视频过程中锁屏不可见时,则SurfaceHolder对象会销毁,当切换可见时因为mediaPlayer.setDisplay()的SurfaceHolder对象不存在,所以只有声音没有视频。
解决方案:可以在初始化时通过surfaceView获取SurfaceHolder对象,通过addCallback监听SurfaceHolder.Callback接口,SurfaceHolder.Callback三个回调方法分别如下:
surfaceCreated
surfaceChanged
VideoView在Android视频播放中很常用,用法也比较简单。但是,我在使用VideoView时遇到一个很棘手的问题:VideoView播放本地视频的开始会出现短暂的黑屏。通常这种黑屏在新打开的页面中是勉强可以接受的,不过,如果是针对在应用的启动页播放视频这样的业务场景,这样的黑屏就很难以被接受了。
首先来看一下为什么会出现黑屏的现象。视频本地播放前短暂黑屏,是由于VideoView加载资源需要一定的耗时,视频加载到视频渲染到屏幕这个过程也是需要时间的。如何避免播放前的黑屏现象呢,下面就通过一
android VideoView播放视频前黑屏问题,亲测有效
今天选择本地视频上传的功能,用VideoView预览,在设置路径后是黑频状态,我想要的是显示最开始的视频画面,
在网上找都说用一个ImageView盖住,当设置视频时显示imageView,播放后再隐藏,感觉我就播放个视频,应该不用那么麻烦,经过一番尝试,发现一种方法可行
videoView.seekTo(1);//调整从第一毫秒进行播放
感觉这种方法比较方便,还比较灵活,如果视频前面有一段就是黑频(我发现我手机录频就有这个问题)还可以直接跳过
VideoView 在播放视频前会有黑屏,点击播放时,黑屏才会消失。原因是videoview加载资源需要一定的耗时,我们可以利用MediaMetadataRetriever来解决黑屏问题。
如何利用VideoView 播放视频呢?
一、mainfest.xml给入读SD的权限
二、绑定View
Mainfest.xml文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.and.
最近的项目中需要用到VideoView实现视频播放,自己花了一天多时间才能出来,有点想打自己再见,在学校的时候没好好学。
使用VideoView播放视频的步骤如下:
1) 在界面布局文件中定义VideoView组件,或在程序中创建VideoView组件。
2) 调用VideoView的如下两个方法来加载指定视频。
setVideoPath(String path):加载 path 文件所代表的视频。
setVideoURI(Uri uri):加载uri所对应的视频。
3) 调用VideoView的start()、stop()、pause()方法来控制视频播放。
实际上与VideoView