SurfaceView和TextureView的区别和优缺点等, 相关的资料很多. 从Android低延时播放器实现角度来看, 总结了下主要区别有:
1. MediaCodec输出到SurfaceView延时一般比到TextureView更低.
2. MediaCodec用SurfaceView比TextureView占用的资源一般更少些(CPU和内存都小一些, 不过还是有Android设备SurfaceView表现更差些).
3. MediaCodec输出到TextureView上的画面做缩放、旋转等变换时很方便,如果调用TextureView.getBitmap()成功的话,也可以将视频画面保存为jpeg图片(抓图方便).
4. SurfaceView和TextureView 清屏方式不一样.
5. SufraceView从自绘切到MediaCodec输出的处理方式和TextureView不一样(直接切换MediaCodec会报错)。
另外不使用MediaCodec直接输出到Surface上, 或用其他decoder,就需要yuv转rgb后再输出到SurfaceView或TextureView上.
播放器的实现,上面列出来的这些需要注意,具体代码实现过程中,细节问题也不少,遇到再处理.
监控场景下, 9宫格16宫格或者更多路同时播放,点击一路画面全屏或者放大观看,小宫格可以用SurfaceView输出(占用资源少), 点击小宫格画面放大看时可以动态切到TextureView上显示,这样实现局部画面缩放,抓图都方便。
为方便集成调用,我的播放器对外提供一个设置和切换Surface的接口:
/*
* Copyright (C) 1130758427@qq.com. All rights reserved.
* 问题沟通微信:ldxevt
*/
public class SmartPlayerJniV2 {
// .......其他接口
// 设置或者播放时动态切换Surface接口
public native int SetSurface(long handle, android.view.Surface surface,
int surface_codec_media_color_format,
int disable_codec_render_surface,
int disable_sdk_render_surface);
// ........其他接口
}
测试时先创建了一个TextureView, 然后在TextureView上有叠了一个小的SurfaceView, 播放时点击按钮来回切换View。
MediaCodec+TextureView:
点击:"切换到SURFACEVIEW"按钮,切到MediaCodec+SurfaceView:
软解也可以动态切View,上面展示的是单路播放切换View的例子, 多路播放或其他问题请联系qq: 1130758427, 微信:ldxevt 。