Surface与SurfaceView、SurfaceHolder

Surface是Android提供的一个元素,用于显示视频、图片等内容。SurfaceView是一个Android组件,它内部包含一个Surface,可以在屏幕上绘制内容,常用于播放视频、实时相机预览等场景。SurfaceHolder也是一个Android接口,它与SurfaceView紧密相关,用于管理Surface的生命周期、控制Surface的大小、格式等。

使用SurfaceView播放视频的基本流程如下:

1. 创建SurfaceView:在XML中布局SurfaceView或者代码中使用SurfaceView的构造方法进行创建。

2. 获取SurfaceHolder:通过SurfaceView的getHolder()方法获取SurfaceHolder实例。

3. 设置SurfaceHolder回调:通过SurfaceHolder的addCallback()方法设置回调对象,实现surfaceCreated()、surfaceChanged() 和 surfaceDestroyed()三个方法。

4. 实现SurfaceHolder回调方法:在回调方法中进行Surface的初始化和释放操作,如在surfaceCreated()方法中创建MediaPlayer对象、设置SurfaceHolder的显示格式、将MediaPlayer与SurfaceHolder绑定等操作。在surfaceDestroyed()方法中释放MediaPlayer资源等操作。

5. 控制MediaPlayer的播放:在MediaPlayer中设置监听器,监听播放状态,根据需要进行控制,如暂停、播放、快进、快退等操作。

下面以播放本地视频为例,详细介绍如何使用SurfaceView实现视频播放。

1. 创建SurfaceView

在XML布局中添加一个SurfaceView:

```

android:id="@+id/surfaceView"

android:layout_width="match_parent"

android:layout_height="match_parent" />

```

在Java代码中获取SurfaceView实例:

```

SurfaceView surfaceView = findViewById(R.id.surfaceView);

```

2. 获取SurfaceHolder

通过SurfaceView的getHolder()方法获取SurfaceHolder实例:

```

SurfaceHolder holder = surfaceView.getHolder();

```

3. 设置SurfaceHolder回调

通过SurfaceHolder的addCallback()方法设置回调对象:

```

holder.addCallback(new SurfaceHolder.Callback() {

@Override

public void surfaceCreated(SurfaceHolder holder) {

// Surface创建时回调

}

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

// Surface尺寸发生变化时回调

}

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

// Surface销毁时回调

}

});

```

4. 实现SurfaceHolder回调方法

在surfaceCreated()方法中进行Surface的初始化和MediaPlayer对象的创建:

```

@Override

public void surfaceCreated(SurfaceHolder holder) {

// 获取视频文件路径

String videoPath = Environment.getExternalStorageDirectory().getPath() + "/test.mp4";

try {

// 创建MediaPlayer对象

mMediaPlayer = new MediaPlayer();

// 设置音视频数据源

mMediaPlayer.setDataSource(videoPath);

// 设置视频显示SurfaceHolder

mMediaPlayer.setDisplay(holder);

// 设置循环播放

mMediaPlayer.setLooping(true);

// 准备视频播放

mMediaPlayer.prepare();

// 开始播放视频

mMediaPlayer.start();

} catch (IOException e) {

e.printStackTrace();

}

}

```

在surfaceDestroyed()方法中释放MediaPlayer资源:

```

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

// 释放MediaPlayer资源

if (mMediaPlayer != null) {

mMediaPlayer.release();

mMediaPlayer = null;

}

}

```

5. 控制MediaPlayer的播放

在MediaPlayer中设置监听器,监听播放状态,根据需要进行控制,如暂停、播放、快进、快退等操作:

```

// 设置MediaPlayer监听器

mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {

@Override

public void onPrepared(MediaPlayer mp) {

// 视频准备完成时回调

}

});

mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

@Override

public void onCompletion(MediaPlayer mp) {

// 播放完成时回调

}

});

mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {

@Override

public boolean onError(MediaPlayer mp, int what, int extra) {

// 播放出错时回调

return false;

}

});

// 播放控制

mMediaPlayer.start();

mMediaPlayer.pause();

mMediaPlayer.seekTo(10000); // 快进10秒

```

总结:

使用SurfaceView播放视频需要先创建SurfaceView、获取SurfaceHolder、设置SurfaceHolder回调、实现SurfaceHolder回调方法和控制MediaPlayer播放。这种方式是通过Surface绘制视频帧实现的,具有高效、灵活、可控性强等优点,是Android视频播放的基础之一。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/

点赞(67) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部