Android中Surfaceview的简单使用

使用Surfaceview绘制图形:
1.方法一:创建一个类继承于SurfaceView,并继承接口surface.Callback。重写surfaceCreated(),surfaceChanged(),surfaceDestroyed()方法

class MyView extends SurfaceView implements Callback
{
    code。。。。。。
}

方法二:不继承接口,在新创建的类内部创建一个callback

Callback callback = new Callback() {
        @Override
        public void surfaceDestroyed(SurfaceHolder arg0) {
        }
        @Override
        public void surfaceCreated(SurfaceHolder arg0) {
            draw();//创建时调用方法
        }
        @Override
        public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
        }
    };

2

private Paint paint = null;//需要一个画笔

    public MyView(Context context) {
        super(context);
        paint = new Paint();
        paint.setColor(Color.RED);
        getHolder().addCallback(this);//添加回调方法
    }

    public void draw() { //写一个画图方法
        Canvas canvas = getHolder().lockCanvas();//先必须锁定
        canvas.drawColor(Color.WHITE);
        canvas.drawRect(0, 0, 100, 100, paint);
        getHolder().unlockCanvasAndPost(canvas);//最后记得解锁

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android使用FFmpeg和SurfaceView可以实现视频的解码和显示。下面是一个简单的示例: 首先,你需要在Android项目集成FFmpeg库。可以参考引用的链接,按照指导进行编译和配置。 接下来,你可以使用FFmpeg的解码功能将视频文件解码为YUV格式的数据。然后,使用FFmpeg提供的像素格式转换接口将YUV数据转换为RGB格式的数据。具体的代码示例如下: ```java // 初始化FFmpeg FFmpeg ffmpeg = FFmpeg.getInstance(context); ffmpeg.loadBinary(new LoadBinaryResponseHandler() { @Override public void onStart() { // 加载FFmpeg库成功 } @Override public void onFailure() { // 加载FFmpeg库失败 } @Override public void onSuccess() { // 加载FFmpeg库成功 } @Override public void onFinish() { // 加载FFmpeg库完成 } }); // 解码视频文件 ffmpeg.execute("-i input.mp4 -pix_fmt yuv420p output.yuv", new ExecuteBinaryResponseHandler() { @Override public void onStart() { // 开始解码 } @Override public void onProgress(String message) { // 解码进度 } @Override public void onFailure(String message) { // 解码失败 } @Override public void onSuccess(String message) { // 解码成功 } @Override public void onFinish() { // 解码完成 } }); // 将YUV数据转换为RGB数据 ffmpeg.execute("-pix_fmts", new ExecuteBinaryResponseHandler() { @Override public void onStart() { // 开始转换 } @Override public void onProgress(String message) { // 转换进度 } @Override public void onFailure(String message) { // 转换失败 } @Override public void onSuccess(String message) { // 转换成功 } @Override public void onFinish() { // 转换完成 } }); ``` 最后,你可以使用SurfaceView和ANativeWindow来显示RGB格式的视频数据。具体的代码示例如下: ```java // 创建SurfaceView SurfaceView surfaceView = new SurfaceView(context); // 获取SurfaceHolder SurfaceHolder surfaceHolder = surfaceView.getHolder(); // 设置SurfaceHolder的类型为SURFACE_TYPE_PUSH_BUFFERS surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // 获取ANativeWindow ANativeWindow nativeWindow = surfaceHolder.getSurface(); // 设置ANativeWindow的格式为RGB nativeWindow.setFormat(PixelFormat.RGBA_8888); // 使用ANativeWindow显示RGB数据 nativeWindow.lockCanvas(null); // 在这里绘制RGB数据到Canvas nativeWindow.unlockCanvasAndPost(canvas); ``` 通过以上步骤,你可以在Android使用FFmpeg和SurfaceView实现视频的解码和显示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值