天道酬勤,学无止境

Android:是否可以在没有 SurfaceView 的情况下创建 SurfaceTexture?(Android: Is it possible to create a SurfaceTexture without a SurfaceView?)

问题

我想在类似于此答案的设置中创建一个带有我可以管理的 OpenGL 纹理的SurfaceTexture 。 (此处引用:)

  1. 通过OpenGL创建纹理
  2. 将此纹理传递给新 SurfaceTexture 的构造函数。
  3. 将这个新的 SurfaceTexture 赋予相机。
  4. 确保您使用的是 OES_External(有关详细信息,请参阅文档)。

但是,创建 OpenGL 纹理(如答案的第 1 步中所述)需要EGL context ,这需要将 EGLSurface 设为当前,这需要 SurfaceTexture。 似乎创建 EGL 上下文的唯一方法是创建一个 SurfaceView(或另一个具有 SurfaceTexture 的视图),并使用它来初始化 EGLSurface,然后使 EGLContext 成为当前。

我的目标是创建一个 EGLContext 并使其在后台线程中处于当前状态,对相机预览图像进行一些离屏计算(主要使用 NDK)。 我想创建一个库,并使其尽可能独立于 UI。 两个相关问题:

在 Java 方面,是否可以在没有预先创建 SurfaceTexture 的情况下创建 EGLContext?

在 NDK 方面,曾经有一个私有 API 调用来创建原生窗口android_createDisplaySurface() ,但它不再起作用了,而且它是一个私有 API。 有没有办法用 NDK 创建一个表面?

我对使用 EGL 还很陌生,我不明白为什么需要 EGLSurface 才能使 EGLContext 成为最新的。 在iOS中,可以先创建EAGLContexts,然后根据需要创建framebuffers。 使用 EGL 似乎您总是需要一个本机窗口。

回答1

您可以在 Grafika 中看到许多操作相机输出、SurfaceTexture 和 EGL 的示例。 “连续捕获”活动是其中之一,但它使用了您提到的技术:为了避免创建 EGLSurface,它只是从附近的 SurfaceView 借用了一个。

您确实需要有一个 EGLSurface,但它不需要是一个窗口表面。 您可以创建一个 1x1 pbuffer 表面并使用它。 这是通过eglCreatePbufferSurface()调用完成的; 有关示例,请参阅 Grafika 中的 EglCore 类。

这些示例是用 Java 编写的,但 Java 实现只是包装了本机 EGL/GLES 调用。

android_createDisplaySurface()是一个内部调用,正如您所发现的,它不适用于较新的设备。 而是在 NDK 中搜索ANativeWindow

更新:对于通过搜索到达这里的任何人, android_createDisplaySurface()依赖于一个名为FramebufferNativeWindow的内部类,在此更改中,该类在 Android 5.0 中被标记为过时。 在此更改中,使用基于 SurfaceFlinger 的替换更新了使用它的内部 OpenGL ES 测试代码。 测试代码的原始版本需要关闭 Android 应用程序框架,以便它可以获取帧缓冲区; 较新的版本只要求 SurfaceFlinger 提供一个覆盖屏幕并合成在其他所有内容之上的窗口。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 在没有预览的情况下从相机拍摄照片(Taking picture from camera without preview)
    问题 我正在编写一个Android 1.5应用程序,该应用程序在启动后立即启动。 这是一项Service ,应该在没有预览的情况下拍照。 这个程序将记录某些区域的光密度。 我可以拍照,但照片是黑色的。 经过很长时间的研究,我遇到了一个有关它的错误线程。 如果不生成预览,则图像将为黑色,因为Android相机需要预览才能设置曝光和对焦。 我已经创建了SurfaceView和侦听器,但是从未触发过onSurfaceCreated()事件。 我想原因是表面不是在视觉上创建的。 我还看到了一些使用MediaStore.CAPTURE_OR_SOMETHING静态调用相机的示例,该相机拍摄图片并用两行代码保存在所需的文件夹中,但它也不拍摄图片。 我需要使用IPC和bindService()来调用此函数吗? 还是有另一种方法来实现这一目标? 回答1 真的很奇怪,Android平台上的相机在提供有效的预览界面之前无法流式传输视频。 似乎该平台的架构师根本没有考虑过第三方视频流应用程序。 即使在增强现实的情况下,图片也可以呈现为某种视觉替代,而不是实时相机流。 无论如何,您只需将预览图面的大小调整为1x1像素,然后将其放置在小部件(可视元素)的一角即可。 请注意-调整预览表面的大小,而不是调整相机框架的大小。 当然,这种技巧并不能消除不必要的数据流(用于预览),该流会消耗一些系统资源和电池。
  • android-使用没有Surfaceview或TextureView的相机(android - use camera without surfaceview or textureview)
    问题 我一直在尝试找出是否有一种方法可以使用相机拍摄视频/图片而无需定义Surfaceview或TextureView。 我找到了此链接:使用不带表面视图的Android相机 我在Nexus Tablet上使用了textureview这个技巧,但是没有运气! 另外,http://handycodeworks.com/?p = 19表示此方法不适用于所有设备。 有没有人知道有没有办法做到这一点? 还是它只是android框架根本不支持的东西,而GUI必须在布局中包含一些表面/纹理元素? 然后,唯一的选择是仅操作布局,以便根据应用程序要求在屏幕上不可见。 编辑1:如上述链接http://handycodeworks.com/?p=19中所述,我尝试了以下代码: public class CameraCapture { // I pass the getApplicationContext() from the main activity. public void startCameraCapture(Context contx) { SurfaceView sv = new SurfaceView(contx); mCamera = Camera.open(); mCamera.setPreviewDisplay(sv.getHolder()); mCamera
  • 使用MediaProjection截屏(Take a screenshot using MediaProjection)
    问题 有了Android L中提供的MediaProjection API,就有可能 将主屏幕的内容(默认显示)捕获到Surface对象中,然后您的应用程序可以通过网络发送该对象 我设法使VirtualDisplay正常工作,并且SurfaceView正确显示了屏幕内容。 我要做的是捕获Surface显示的框架,并将其打印到文件中。 我已经尝试了以下方法,但是得到的只是一个黑色文件: Bitmap bitmap = Bitmap.createBitmap (surfaceView.getWidth(), surfaceView.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); surfaceView.draw(canvas); printBitmapToFile(bitmap); 关于如何从Surface检索显示的数据有任何想法吗? 编辑 因此,如@j__m所建议,我现在使用ImageReader的Surface设置VirtualDisplay : Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); displayWidth
  • Android MediaCodec:减小 mp4 视频大小(Android MediaCodec: Reduce mp4 video size)
    问题 我正在寻找一种“压缩”mp4 视频的方法。 为此,我想降低视频的分辨率和/或降低 FPS。 经过长时间的研究,我认为这样做的方法是使用 MediaCodec 和相关 API,如下所示: -> MediaExtractor 从 mp4 文件中提取编码的媒体数据。 -> MediaCodec (Decoder):解码每一帧以备后用。 -> MediaCodec (Encoder):此时,我想这就是我们应该建立视频分辨率等MediaFormat参数的地方,这应该有助于我们减少mp4文件的最终大小。 -> MediaMuxer 用于生成 mp4 文件(MinSDK 18,这可能是一个问题,但现在...好的)。 我不想使用 SurfaceView/TextureView。 关于音频,我不想对其进行处理以降低质量。 我一直在查看这里的所有示例:http://bigflake.com/mediacodec/ 我还看过 CTS 源代码模块。 我一直在看几个这样的项目:https://github.com/vecio/MediaCodecDemo/blob/master/src/io/vec/demo/mediacodec/DecodeActivity.java 当然,我已经阅读了许多关于 stackoverflow 的帖子。 问题是我还没有找到任何适合这个海豚的代码示例。
  • 当我的应用启动时,如何在不预览的情况下从相机拍摄照片?(How to take pictures from the camera without preview when my app starts?)
    问题 现在,我想要的是一个仅需在启动时从相机拍摄照片的应用程序。 没有布局,没有相机预览...什么都没有,只有一个简单的应用程序图标即可启动该应用程序。 一旦启动,相机应拍照。 这是预览图像,我不想出现在我的应用程序中。 我只想让我的应用程序单击此处图像中所包围的“拍摄照片”按钮: 拍照后,我需要将其保存在我的照片库中。 有人可以在这里引导我吗? 谢谢 这是我在模拟器和设备上尝试过的一些代码。 import java.io.IOException; import android.app.Activity; import android.hardware.Camera; import android.hardware.Camera.PictureCallback; import android.hardware.Camera.ShutterCallback; import android.os.Bundle; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.View.OnClickListener; import android.widget
  • 跨平台Web Canvas渲染引擎架构的设计与思考
    简介: 这篇文章主要从技术视角介绍下跨平台WebCanvas的架构设计以及一些关键模块的实现方案(以Android为主),限于作者水平,有不准确的地方欢迎指正或者讨论。 设计目标 标准化:Web Canvas标准主要指的是W3C的Canvas2D和WebGL。标准化的好处一方面是学习成本低,另一方面上层的游戏引擎也可以以很低的适配成本得到复用; 跨平台:跨平台主要目地是为了扩宽使用场景、提升研发效率、降低维护成本; 跨容器: 由于业务形态的不同,Canvas需要能够跑在多种异构容器上,如小程序、小游戏、小部件、Weex等等; 高性能: 正所谓「勿在浮沙筑高台」,上层业务的性能很大程度取决于Canvas的实现; 可扩展: 从下文的Canvas分层设计上可以看到,每一层的技术选型都是多样化的,不同场景可能会选择不同的实现方案,因此架构上需要有一定的可扩展性,最好能够做到关键模块可插拔、可替换。 Canvas渲染引擎原理概览 ▐ 工作原理 工作原理其实比较简单,一句话就可以说明白。首先封装图形API(OpenGL、Vulkan、Metal...)以支持WebGL和Canvas 2D矢量图渲染能力,对下桥接到不同操作系统和容器之上,对上通过language binding将渲染能力以标准化接口透出到业务容器的JS上下文。 举个例子,以下是淘宝小程序容器Canvas组件的渲染流程,省略了「亿
  • 跨平台Web Canvas渲染引擎架构的设计与思考
    简介: 这篇文章主要从技术视角介绍下跨平台WebCanvas的架构设计以及一些关键模块的实现方案(以Android为主),限于作者水平,有不准确的地方欢迎指正或者讨论。 设计目标 标准化:Web Canvas标准主要指的是W3C的Canvas2D和WebGL。标准化的好处一方面是学习成本低,另一方面上层的游戏引擎也可以以很低的适配成本得到复用; 跨平台:跨平台主要目地是为了扩宽使用场景、提升研发效率、降低维护成本; 跨容器: 由于业务形态的不同,Canvas需要能够跑在多种异构容器上,如小程序、小游戏、小部件、Weex等等; 高性能: 正所谓「勿在浮沙筑高台」,上层业务的性能很大程度取决于Canvas的实现; 可扩展: 从下文的Canvas分层设计上可以看到,每一层的技术选型都是多样化的,不同场景可能会选择不同的实现方案,因此架构上需要有一定的可扩展性,最好能够做到关键模块可插拔、可替换。 Canvas渲染引擎原理概览 ▐ 工作原理 工作原理其实比较简单,一句话就可以说明白。首先封装图形API(OpenGL、Vulkan、Metal...)以支持WebGL和Canvas 2D矢量图渲染能力,对下桥接到不同操作系统和容器之上,对上通过language binding将渲染能力以标准化接口透出到业务容器的JS上下文。 举个例子,以下是淘宝小程序容器Canvas组件的渲染流程,省略了「亿
  • 在Android中使用SurfaceTexture进行相机预览的示例(Example of Camera preview using SurfaceTexture in Android)
    问题 我正在尝试使用SurfaceTexture渲染相机预览。 我阅读了该文档,但无法理解其工作原理。 任何人都可以提供一个示例示例(非常基本的示例)或使用SurfaceTexture预览相机的链接。 我用谷歌搜索,但没有找到我想要的东西。 提前致谢。 回答1 如果要将Camera与TextureSurface一起使用,则可以实现SurfaceTextureListener接口。 您将必须实现4种方法: 1) onSurfaceTextureAvailable在这里设置相机 2) onSurfaceTextureSizeChanged在您的情况下,Android的相机将处理此方法 3) onSurfaceTextureDestroyed在这里您销毁了所有摄影机的东西。 4) onSurfaceTextureUpdated当您需要更改时,在此处更新您的纹理! 检查以下示例: public class MainActivity extends Activity implements SurfaceTextureListener{ private Camera mCamera; private TextureView mTextureView; @Override protected void onCreate(Bundle savedInstanceState) { super
  • Android TextureView 与 VideoView 性能(Android TextureView vs VideoView Performance)
    问题 我需要能够在屏幕上旋转视频,因此我创建了一个自定义 TextureView,它在 MediaPlayer 上提供了一个便利层,类似于 VideoView 的当前实现方式。 这篇 Android 博客文章对 TextureView 做了以下说明: 因为 SurfaceView 的内容不在应用程序的窗口中,所以它不能有效地转换(移动、缩放、旋转)。 这使得在 ListView 或 ScrollView 中使用 SurfaceView 变得困难。 SurfaceView 也无法与 UI 工具包的某些功能正确交互,例如淡入淡出的边缘或 View.setAlpha()。 为了解决这些问题,Android 4.0 引入了一个名为 TextureView 的新小部件,它依赖于硬件加速的 2D 渲染管道和 SurfaceTexture。 TextureView 提供与 SurfaceView 相同的功能,但与 SurfaceView 不同的是,它的行为与常规视图相同。 例如,您可以使用 TextureView 来显示 OpenGL 场景或视频流。 TextureView 本身可以设置动画、滚动等。 但是,看起来 TextureView 正在努力播放视频。 我正在测试的目标设备具有 1.2Ghz Rockchip RK3066 双核 CPU、四核 Mali-400 GPU (ARM) 和
  • OpenCV / Android BufferQueue错误:放弃表面纹理(OpenCV / Android BufferQueue Error: Surface Texture Has Been Abandoned)
    问题 Android和OpenCV的新功能。 一直在尝试实现新书《用实用的计算机视觉项目精通OpenCV》中的代码。 该应用程序基本上是使用OpenCV在摄像机预览上渲染卡通化图像的。 您可以触摸屏幕以保存卡通图像。 作者的源代码位于此处。 我对CartoonifierApp.java文件进行了少量修改(请参见下文),以便可以使用OpenCV Manager应用程序静态加载卡通化程序库(原始代码引发了UnsatisfiedLinkError)。 我面临的问题是,当我将应用程序加载到Galaxy Nexus(Android 4.1.1)上时,出现黑屏。 我的LogCat说: E / BufferQueue(4744):[unnamed-4744-0] setBufferCount:SurfaceTexture已被放弃! E / Cartoonifier :: SurfaceView(4744):startPreview()失败 我认为这是一个记忆问题。 我知道cpp代码可以工作是因为它在我的计算机上可以正常运行-尽管在相对较新的笔记本电脑(Asus U46E)上渲染速度很慢。 我不知道该如何解决。 我发现的唯一有用的建议是在这里。 如果我替换CatoonifierVewBase.java中的setPreview方法 if (Build.VERSION.SDK_INT >= Build
  • 【四】Android MediaPlayer整体架构源码分析 -【设置视频显示surface】
    承接上一章节分析:【三】Android MediaPlayer整体架构源码分析 -【设置数据源】【Part 1】 完整系列章节分析:【一】Android MediaPlayer整体架构源码分析 -【初始化和创建】 本系列文章分析的安卓源码版本:【Android 10.0 版本】 setDisplay方法实现流程分析 设置视频显示surface示例: // 先获取SurfaceHolder mSurfaceView = findViewById(R.id.surface_view); mSurfaceHolder = mSurfaceView.getHolder(); mSurfaceHolder.addCallback(mSurfaceHolderCallback); mMediaPlayer.setDisplay(mSurfaceHolder); 【后续有时间再详细分析关于SurfaceHolder/Surface/SurfaceTexture/SurfaceView相关源码实现】 简单总结:获取SurfaceView(图像显示)对象,调用其getHolder()方法获取当前SurfaceView中的Surface(图像数据)对应的SurfaceHolder(图像数据管理),SurfaceHolder开始对Surface进行控制管理。 SurfaceTexture(Android
  • java.lang.RuntimeException:takePicture失败(java.lang.RuntimeException: takePicture failed)
    问题 当我连续单击“捕获”按钮(不中断)时,出现“运行时异常”,我该如何解决此问题? 如果不可能,那么我该如何处理此异常? btnCapture = (ImageButton) findViewById(R.id.btnCapture); final MediaPlayer mp = MediaPlayer.create(CameraLauncherActivity.this, R.raw.button); btnCapture.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // line where getting RuntimeException camera.takePicture(null, null, mPicture); } }); 日志: 02-12 14:48:41.580: E/AndroidRuntime(6997): FATAL EXCEPTION: main 02-12 14:48:41.580: E/AndroidRuntime(6997): java.lang.RuntimeException: takePicture failed 02-12 14:48:41.580: E/AndroidRuntime(6997): at
  • 如何从Android中的自定义CameraView捕获图像?(How to capture image from custom CameraView in Android?)
    问题 我需要从屏幕的所需部分捕获图像。 从相机捕获图像。 当时的其他屏幕内容是这样。 这怎么可能? 回答1 尝试使用Surface View创建动态摄影机视图并在所需部分中进行设置。 以下代码尝试 变量设置类级别(全局) Button btn_capture; Camera camera1; SurfaceView surfaceView; SurfaceHolder surfaceHolder; public static boolean previewing = false; 在onCreate()方法中的以下代码 getWindow().setFormat(PixelFormat.UNKNOWN); surfaceView = new SurfaceView(this); surfaceHolder = surfaceView.getHolder(); surfaceHolder.addCallback(this); surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); btn_capture = (Button) findViewById(R.id.button1); surfaceView.setBackgroundResource(R.drawable.your_background_image)
  • MediaPlayer旋转时向前跳过约6秒(MediaPlayer skips forward about 6 seconds on rotation)
    问题 我在Fragment中有一个MediaPlayer,它在配置更改时保留了它的实例。 播放器正在播放从我的资产目录加载的视频。 我设置了一个场景,其目的是再现YouTube应用的回放,其中在配置更改期间音频会继续播放,并且显示器会分离并重新连接到媒体播放器。 当我开始播放并旋转设备时,位置会向前跳跃约6秒钟,并且在发生这种情况时(必要时)音频会被剪切掉。 之后,播放将正常继续。 我不知道是什么原因导致了这种情况的发生。 根据要求,下面是代码: public class MainFragment extends Fragment implements SurfaceHolder.Callback, MediaController.MediaPlayerControl { private static final String TAG = MainFragment.class.getSimpleName(); AssetFileDescriptor mVideoFd; SurfaceView mSurfaceView; MediaPlayer mMediaPlayer; MediaController mMediaController; boolean mPrepared; boolean mShouldResumePlayback; int mBufferingPercent
  • 在videoView中播放视频时出现java.lang.StringIndexOutOfBoundsException:Android v 4.2.1(java.lang.StringIndexOutOfBoundsException while playing video in videoView : Android v 4.2.1)
    问题 我在Android 4.2.1版的videoView上播放视频时遇到此崩溃。 我在Micromax Canvas A210设备上发现了这个问题。 它没有显示任何错误发生的消息。 这是应用程序中的错误还是错误? 崩溃日志如下: 09-18 11:05:53.245: E/AndroidRuntime(2323): FATAL EXCEPTION: main 09-18 11:05:53.245: E/AndroidRuntime(2323): java.lang.StringIndexOutOfBoundsException: length=11; regionStart=0; regionLength=-1 09-18 11:05:53.245: E/AndroidRuntime(2323): at java.lang.String.startEndAndLength(String.java:583) 09-18 11:05:53.245: E/AndroidRuntime(2323): at java.lang.String.substring(String.java:1464) 09-18 11:05:53.245: E/AndroidRuntime(2323): at android.widget.VideoView.openVideo(VideoView.java
  • Android截取Surface View屏幕截图显示黑屏(Android Take Screenshot of Surface View Shows Black Screen)
    问题 我正在尝试通过代码截取我的游戏的屏幕截图,并通过Intent分享它。 我能够做到这些,但是屏幕截图始终显示为黑色。 这是与共享屏幕截图有关的代码: View view = MainActivity.getView(); view.setDrawingCacheEnabled(true); Bitmap screen = Bitmap.createBitmap(view.getDrawingCache(true)); .. save Bitmap 这是在MainActivity中: view = new GameView(this); view.setLayoutParams(new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.FILL_PARENT)); public static SurfaceView getView() { return view; } 而视图本身: public class GameView extends SurfaceView implements SurfaceHolder.Callback { private static SurfaceHolder surfaceHolder; ...etc
  • 从SurfaceView获取框架(Getting a frame from SurfaceView)
    问题 我现在遇到的困难是拍摄SurfaceView的屏幕截图。 谁能帮忙吗? 我的团队正在做一个Android项目,我们在其中使用MediaCodec解码视频提要并将提要呈现到Surface上。 活动实施 SurfaceHolder.Callback 然后,我们创建了一个SurfaceView并添加了回调: mySurfaveView.getHolder().addCallback(this); 然后,我们开始解码视频提要(我们有一种方法可以解码) surfaceChanged(SurfaceHolder holder, int format, int width, int height) 视频工作正常,现在我要截取渲染到SurfaceView上的内容的屏幕截图。 我尝试了几种方法来做到这一点,但没有成功。 以下是我尝试过的方法: 我已经厌倦了获得rootView的drawingcache。 尝试直接从MediaCodec获取框架。 尝试使用draw()方法在画布上绘制。 到目前为止,我正试图创建一个自定义的SurfaceView并在那里重写onDraw方法。 但是,我从未创建过自定义SurfaceView。 我的方向正确吗? 请帮助。 谢谢! 回答1 如另一个问题所述,您无法捕获SurfaceView。 SurfaceViews很少要重写onDraw() 。 通常
  • 如何拍摄Surfaceview快照?(How to take snapshot of surfaceview?)
    问题 我正在使用SurfaceView在Android应用程序中进行H264视频渲染。 它具有一项功能,可以在表面视图上渲染视频时拍摄快照。 每当拍摄快照时,我只会看到“透明/黑色”屏幕。 我使用getDrawingCache()方法捕获仅返回空值的屏幕。 我使用以下代码捕获屏幕。 SurfaceView mSUrfaceView = new SurfaceView(this); //Member variable if(mSUrfaceView!=null) mSUrfaceView.setDrawingCacheEnabled(true); // After video render on surfaceview i enable the drawing cache Bitmap bm = mSUrfaceView.getDrawingCache(); // return null 回答1 除非您使用Canvas将软件中的H.264视频帧渲染到View上,否则绘图缓存方法将不起作用(请参见此答案)。 您无法从SurfaceView的“表面”部分读取像素。 基本问题是,Surface是带有生产者-消费者接口的缓冲区队列,而您的应用程序位于生产者端。 使用者(通常是系统合成器(SurfaceFlinger))能够捕获屏幕快照,因为它在管道的另一端。 要在渲染视频时捕获快照
  • TextureView 与 GLSurfaceView 或如何在 EGL14 中使用 GLSurfaceView(TextureView vs. GLSurfaceView or How to use GLSurfaceView with EGL14)
    问题 我对 EGL 感到困惑。 我的 GLSurfaceView 创建了一个 EGLContext。 现在我创建一个共享上下文。 现在我需要使用 EGLExtension。 我必须使用的方法称为(> = API18): EGLExt.eglPresentationTimeANDROID(android.opengl.EGLDisplay display, android.opengl.EGLSurface surface, long time); 问题是, GLSurfaceView 只创建 javax.microedition.khronos.egl.EGLContext s。 这告诉我,不要使用 GLSurfaceView。 所以我尝试了 TextureView,它有点相似,不同的是你必须处理你自己的 EGL 东西。 这有利于这个目的。 但是:TextureView 比较慢,至少看起来是这样,所以我用 Method Profiler 记录了一些图表: 这里有自己的 EGL 处理的 TextureView: 顶部的 Thread 是一个时钟,它唤醒中间的 Thread,然后渲染到 TextureView 上。 之后将调用主线程,以重新绘制 TextureView。 ...这里是带有自己的 EGL 处理的 GLSurfaceView 这次时钟在中间
  • Android-在SurfaceTexture上绘制YouTube视频(Android - draw YouTube video on SurfaceTexture)
    问题 我正在尝试在SurfaceTexture上绘制WebView,以便可以在OpenGL中进行渲染。 到目前为止,我已经成功以标准方式在WebView中播放了youtube视频: ... webView.getSettings().setJavaScriptEnabled(true); if (Build.VERSION.SDK_INT < 8) { webView.getSettings().setPluginsEnabled(true); } else { webView.getSettings().setPluginState(WebSettings.PluginState.ON); } webView.setWebChromeClient(new WebChromeClient() { }); webView.setWebViewClient(new WebViewClient()); ... 硬件加速也已打开: <application android:hardwareAccelerated="true" ... 我还根据此教程在OpenGL中成功渲染了WebView(播放视频除外):http://anuraagsridhar.wordpress.com/2013/03/13/rendering-an-android-webview-or-for-that