问题标签 [grafika]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
823 浏览

android - 如何通过 GLSurfaceView 在 Android 中切换前置/后置摄像头?

我已经向grafika发布了一个问题,但现在似乎没有人维护该项目。

我想使用CameraCaptureActivityGLSurfaceView实现的切换前置/后置摄像头,如下:

它可以工作,但是当我回到第一次启动的相机时,FOV 已经改变。框架似乎被剪掉了。

那么切换前置后置摄像头时我错过了哪里?

谢谢。

PS:我已经google了,但是关于带有GLSurfaceView的Android Camera的信息很少。

0 投票
1 回答
1879 浏览

android - 使用 OpenGL 和 MediaCodec 播放视频

我试图在两个不同的纹理视图中同时播放相同的视频。我使用了来自 grafika(MoviePlayer 和 ContinuousCaptureActivity)的代码来尝试让它工作(感谢 fadden)。为了使问题更简单,我尝试先使用一个 TextureView 来完成。

目前我已经创建了一个 TextureView,一旦它获得了 SurfaceTexture,我就创建了一个 WindowSurface 并使其成为最新的。然后我生成一个使用 FullFrameRect 对象生成的 TextureID。

然后我得到一个屏幕外的 SurfaceTexture,将它与上面得到的 TextureID 链接,并创建一个表面以传递给 MoviePlayer:

这个想法是 SurfaceTexture 获得一个原始帧,我可以将其用作 OES_external 纹理,以使用 OpenGL 进行采样。然后我可以在将我的 WindowSurface 设置为当前后从我的 EGLContext 调用 DrawFrame()。

如果我想用 2 个 TextureViews 来做,想法是调用 makeCurrent() 并为每个视图绘制到每个缓冲区中,然后在绘制完成后调用 swapBuffers()。

这就是我想要做的,但我很确定这不是我的代码实际在做的事情。有人可以帮助我了解我需要更改哪些内容才能使其正常工作吗?

@法登

更新:这很有趣。我将 onSurfaceTextureAvailable 中的代码更改为:

所以,它不应该调用其他任何东西,只显示空的 TextureView - 这就是我所看到的......

空纹理视图

0 投票
2 回答
4659 浏览

android - MTK 设备中的 setPreviewTexture 失败

最近我正在学习 grafika 的 android Camera 和 OpenglES(感谢 fadden)。它在大多数设备上都很好,但我在某些设备上遇到了错误,尤其是 MTK 设备(如 MT6580、MT8163...)。

例如,当“CameraCaptureActivity”在 MTK 中运行时。我收到此错误:

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void android.hardware.Camera.setPreviewTexture(android.graphics.SurfaceTexture)”

所以我将“handleSetSurfaceTexture”函数更改为:

然后错误更改为:

java.lang.RuntimeException: java.io.IOException: setPreviewTexture 在 jp.co.cyberagent.android.gpuimage.grafika.CameraCaptureActivity.handleSetSurfaceTexture (CameraCaptureActivity.java:1150) 失败

我阅读了许多其他相机应用程序源代码,我想 MTK 设备中的相机和 SurfaceRender 可能存在同步问题。所以我改变了这样的代码:

不幸的是,“getMaxTextureSize()”在其他设备中返回一个有用的数字,但我只是在 MTK 设备中得到 getMaxTextureSize()=0。

所以我有这些问题:

1) 如何安全使用surfaceRender/Camera/SurfaceTexture?

2)为什么这个问题只发生在MTK?

任何答案将不胜感激。

我添加这个并再次测试

在两个设备中的结果是:

nGLVersion = 131072,支持Es2 = true

nGLVersion = 196608,supportsEs2 = true

我还得到设备信息:

结果:

strDevice = 阿尔卑斯 k80_gmo,strModel =k80_gmo,nVersion =22

strDevice = 阿尔卑斯山 tb8163p3_64_sph,strModel =tb8163p3_64_sph,nVersion =22

对了,第一次打开Camera和startpreview就可以了。但是在活动暂停或重新打开相机时遇到“setPreviewTexture failed”。释放相机时,我得到一些日志:

CameraClient native_window_api_disconnect 失败:管道损坏 (-32)

重新打开相机时:

CameraClient native_window_api_connect 失败:没有这样的设备 (-19)

这些设备可能存在问题,但我也在这些设备中测试了其他一些相机应用程序,其中一些表现良好。所以它必须有更好的方式来使用Camera和glsurfaceview。

0 投票
1 回答
3720 浏览

android - SurfaceTexture AttachToGLContext 和 Surface

如果我想从 SurfaceTexture 调用 attachToGLContext 方法,我正在尝试确定是否需要重新制作 Surface。我试图查看 android 文档,但没有提及。

我猜不是因为据我所知,Surface 是 SurfaceTexture 的缓冲区,它可以充当 OpenGL 上下文的外部纹理。因此,将 SurfaceTexture 附加到不同的上下文不应影响这一点。

有人确定吗?

0 投票
1 回答
1860 浏览

android - MediaCodec 编码的视频底部有绿色条,色度搞砸了

我从Grafika开始了一个项目并对其进行了修改。我有一个框架(与原始框架没有太大不同),它从 中捕获预览Camera并以不同的分辨率同时将其连续编码为视频。

MediaCodec(用于编码)配置为使用COLOR_FormatSurface,以便我们能够渲染到getInputSurface()使用 GLES 查询的表面。

媒体格式设置为 MIME 类型video/avc

对于大多数手机,此设置完美运行。

但对于一些手机,编码视频的色度值略微倾斜,底部有一个绿色条。

目前,编码器表面的分辨率为 640x360。选择渲染到表面的 EGLConfig 支持 32 位 RGBA 格式。

预览在所有手机中都是完美的。

所以我假设在应用程序端或操作系统框架端的编码器参数有问题。

它发生在 Android 4.4 上。- 不确定,如果它可以在 5.* 上重现。

![绿条图像] 2

0 投票
0 回答
4394 浏览

android - Android 使用 MediaCodec 解码原始 h264 流

我在 TextureView 上使用 MediaCodec 解码和绘制原始 h264 数据时遇到了麻烦。我以字节数组的形式接收原始数据,每个数组都是 NAL 单元(以 开头0x00 0x00 0x00 0x01),也有恒定间隔的 SPS 和 PPS NAL 单元。当新数据到达时,我将其放入LinkedBlockingQueue

如您所见,这里还有解码器配置。当队列中出现第一个 SPS+PPS 时完成。while循环运行的主要部分:

queueInputBuffer看起来像这样:

封装此机制的类在单独的线程上运行,类似于MoviePlayerfrom grafika。也是FrameCallback来自SpeedControlCallbackgrafika。

结果预览已损坏。当相机(视频源)静止时,它很好,但当它移动时,就会出现撕裂、像素化和伪影。当我将原始视频数据保存到文件并使用 ffplay 在桌面上播放时,它似乎没问题。

当我在寻找解决方案时,我发现问题可能是由无效的演示时间引起的。我试图修复它(你可以在代码中看到,我提供了系统时间以及使用preRender()),但没有成功。但我不确定故障是否是由这些时间戳引起的。

有人可以帮我解决这个问题吗?

更新 1

就像 fadden 建议的那样,我已经针对 MediaCodec 本身创建的数据测试了我的播放器。我的代码捕获了相机预览,对其进行编码并将其保存到文件中。我之前使用目标设备的摄像头进行了此操作,因此我可以切换数据源。基于手机摄像头预览的文件在播放中不显示任何伪影。所以结论是来自目标设备相机的原始数据被错误地处理(或传递给解码器),或者它与 MediaCodec 不兼容(正如 fadden 所建议的那样)。

接下来我做的是比较两个视频流的 NAL 单元。MediaCodec 编码的视频如下所示:

第一个 NALU 只出现一次,在流的开头,然后是第二个(使用 0x65),然后是多次使用 0x21。然后又是 0x65,多个 0x21 等等。

但是目标设备的相机给了我这个:

并且整个序列在流中不断重复。

0 投票
1 回答
1654 浏览

android - Grafika 和 OpenGL 在 android 上以方形录制视频

我目前正在尝试以方形录制视频并将输出创建为 .mp4。似乎真的很有挑战性。我尝试了不同的方法,包括:OnPreviewFrame 和 FFMpeg。但一直没有得到满意的结果。今天我找到了Grafika。这似乎是正确的方法。但是由于代码的复杂性,我现在被困住了。使用示例:CameraCaptureActivity.java 我设法录制了视频。但它的形状是长方形而不是正方形。此外,相机旋转了 90 度。我已经在尝试操纵某些参数,但从来没有得到一个好的视频。有些地方被挤压等等。

有人知道我需要在 Grafikas 示例中更改哪些参数才能获得正确的结果吗?最后,我的 android 手机的摄像头应该录制 Vine 或 Instagram 等视频。

谢谢你的帮助!

0 投票
1 回答
202 浏览

android - Texture2dProgram - sTexture 的 glUniform 定义在哪里

查看 Texture2dProgram.java 中的代码,我找不到定义 sTexture 的制服的位置。其他像 aPosition 是在构造函数中定义的。

作为 opengl 的新手,看起来片段着色器使用当前纹理单元,并且纹理绑定到该纹理单元,因此 sTexture 是默认的预定义名称。

0 投票
1 回答
12004 浏览

android - 如何在调用 eglCreatePbufferSurface 时修复 0x3009 (EGL_BAD_MATCH) 问题?

我使用createOffscreenSurface来自grafika

它在某些设备上运行良好,但在其他设备上却不行。错误消息是:

我也google了一下,得到了以下信息:

  1. 您需要为该手机设置适当的像素格式的表面视图,这很可能是 PixelFormat.RGB565 (链接)

  2. 我很确定您的表面与实际显示表面的格式不同。(链接

但是,我没有解决它的想法。有什么建议么 ?

0 投票
0 回答
785 浏览

android - 从 Surface 编码时出现 Android MediaCodec SIGSEGV 错误

我正在使用一些基于 Google/Andy McFadden 的 Grafika 示例应用程序的代码。

我时不时地看到间歇性的低级崩溃,堆栈跟踪如下所示:

这是在运行 5.1.1 的 Nexus 6 上

我很确定这发生在我的 TextureMovieEncoder 的 handleFrameAvailable 方法中,如下所示:

其中 mVideoEncoder 封装了一个带有输入表面的 MediaCodec 实例。

任何人都可以从这个堆栈跟踪中找出任何线索吗?