AndroidN SurfaceView新特性

之前的博文SurfaceView 基础用法对SurfaceView做了基础的介绍,但没有对其不足的地方进行说明,本篇讲SurfaceView的不足之处,已及AndroidN上SurfaceView的新特性。

SurfaceView的不足

与普通View不同,surfaceview有自己的Surface。一般的Activity包含的多个View会组成View hierachy的树形结构,只有最顶层的DecorView,也就是根结点视图,才是对WMS可见的。surfaceview不在View hierachy中,它的显示也不受View的属性控制,所以在Android7.0之前不能进行平移,缩放等变换。例如,通过surfaceview来显示一个视频,此时对surfaceview进行缩放处理,视频内容是不会跟着surfaceview进行缩放的。这点可以结合图-1直观的看。

图-1

可以看到普通View旋转后,View的内容也跟着同步做了旋转,但SurfaceView在旋转之后,其显示内容并没有跟着一起旋转。这就好比在墙上开了一个窗(Surface),通过窗口可以看外面的花花世界,但窗口无论怎样变化,窗外面的世界是不会跟着窗口一同变化。
在罗神的博客 Android视图Surfa
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值