我需要能够在屏幕上旋转视频,所以我创建了一个自定义TextureView,它在MediaPlayer上提供了一个类似于当前VideoView实现的方便层。这篇Android博客文章介绍了关于TextureView的以下内容:
因为SurfaceView的内容不存在于应用程序的窗口中,所以不能有效地转换(移动、缩放、旋转)。这使得在ListView或ScrollView中使用ScrollView变得很困难。SurfaceView也无法与UI工具包的某些特性进行适当的交互,例如渐变边缘或View.setAlpha()。 为了解决这些问题,Android4.0引入了一个名为TextureView的新小部件,它依赖于硬件加速的2D渲染管道和SurfaceTexture。TextureView提供了与SurfaceView相同的功能,但与SurfaceView不同,它是一个常规视图。例如,您可以使用TextureView来显示OpenGL场景或视频流。TextureView本身可以是动画、滚动等。
然而,看起来TextureView很难播放这些视频。我正在测试的目标设备有一个1.2Ghz Rockchip RK3066双核CPU,一个Quad核马里-400 GPU (ARM)和1GB内存。在此设备上使用VideoViews的代码执行得很好,但TextureViews要么在播放时“结巴”,要么根本不出现(左上角有白色方块的黑匣子),这取决于具体设备。TextureViews使用英特尔提供的x86“设备”在模拟器上执行良好的操作。
这种表现是预期的,还是我应该寻找其他地方来发现问题?谢谢
发布于 2013-04-26 00:35:05
是的,这是TextureView
的预期。TextureView使视频通过正常的视图--为呈现而进行合成,而不是直接在GPU中合成的SurfaceView (解码流水线直接呈现到放置SurfaceView
的屏幕区域)。虽然TextureView
呈现是硬件加速的,但它仍然需要经过更多的步骤才能获得更多的灵活性,而且性能也会受到一定的影响。此外,在UI线程上运行的任何代码都可能影响TextureView
(与SurfaceView
不同)。
其他信息:
发布于 2017-05-30 14:06:33
你可以看到这个文章
SurfaceView和TextureView填充了类似的角色,但是实现方式非常不同。要决定哪一种是最好的,就需要理解两者的权衡。因为TextureView是视图层次结构的适当公民,所以它的行为与任何其他视图一样,并且可以重叠或被其他元素重叠。您可以使用简单的API调用以位图的形式执行任意转换并检索内容。 对TextureView的主要打击是组合步骤的性能。使用SurfaceView,内容被写入一个单独的层,SurfaceFlinger组合,最好是一个覆盖层。使用TextureView,视图组合总是使用GLES执行,对其内容的更新也可能导致其他视图元素重绘(例如,如果它们位于TextureView之上)。在视图呈现完成后,应用程序UI层必须由SurfaceFlinger与其他层组合,因此您可以有效地组合每个可见像素两次。对于全屏视频播放器或任何其他实际上只是在视频之上分层的UI元素的应用程序,SurfaceView提供了更好的性能。
https://stackoverflow.com/questions/14590852
复制相似问题