Android 中Textureview和SurfaceView使用问题总结

TextureView是Android 4.0之后加入的,低版本么这个类。TextureView必须工作在开启硬件加速的环境中,也即配置文件里Activity的设置项里:android:hardwareAccelerated="true" 默认的这个属性就是true,因此不用再写了。但如果写成false,可以看到onSurfaceTextureAvailable()这个回调就进不来了;

有两点跟Surfaceview不同。第一,TextureView创建过程中没有进到onSurfaceTextureSizeChanged()这个函数里。而SurfaceView在创建过程中,从无到有的时候会进到大小发生变化回调里。第二,onSurfaceTextureUpdated()这个函数每上来一帧数据,这块就进来一次。这是跟Surfaceview相比,最伟大的一个地方。通过这个接口,可以将上来的SurfaceTexture送给OpenGL再去处理。

SurfaceTexture和TextureView的关系:

如果说TextureView是一幅画的话,那SurfaceTexture就是画布,真正渲染的载体是SurfaceTexture。

TextureView可以像一般View执行各种变化,其中有个textureView.setAlpha(1.0f)默认不写这句话,它的alpha也是1.0f,即不透明。如果设成透明0.0f,可以看到啥都看不到了,这一点跟Surfaceview刚好相反。Surfaceview的SurfaceHolder一般要设一下Transparent即透明。但TextureView因为是个view,任何一个png的照片透明度设成0肯定啥都看不到。

SufaceView不建议使用,因为有些手机有属性动画,会造成部分手机用户体验不好

TextureView在退出后台再次进入到应用中,不会立即加载数据,还有就是复杂的点击事件会有问题

使用MediaMetadataRetriever 的getFrameAtTime()方法, 如下:

getFrameAtTime方法有几个重载形式, 其中type参数有如下几种取值:

可以根据需要选择是否选取关键帧. 以及优先取前面的还是后面的.

还提供了指定尺寸的重载方法.

这种方法效率最高, 速度最快!

需要注意的是, 这个办法对很多格式不规整的视频文件不能很好的支持, 有些文件只有一个关键帧, 或者关键帧很少. 导致很难获取到正确的截图.

使用MediaExtractor,MediaCodec和opengl抽取mp4视频文件的帧缩略图.

具体实现可以参考 https://www.jianshu.com/p/567d7ce47f52

这个方法速度中等, 但是对视频文件的格式支持兼容性较好, 只要能播放, 基本都能搞定.

将视频渲染到TextureView上, 然后通过将TextureView内容转换为bitmap来获得指定时间点的截图.

具体实现参考: https://www.jianshu.com/p/0f6578362e58

这个方法效率最低, 必须要把视频在TextureView上播放出来, 才能截图. 虽然可以通过调节播放倍速来加快截图效率, 但是这种方式仍然是最慢的.

通过ffmpeg实现, 这个能做, 但是没用过, 不多说了.


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11476120.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存