问题标签 [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.
android - 如何通过 GLSurfaceView 在 Android 中切换前置/后置摄像头?
我已经向grafika发布了一个问题,但现在似乎没有人维护该项目。
我想使用CameraCaptureActivity
GLSurfaceView实现的切换前置/后置摄像头,如下:
它可以工作,但是当我回到第一次启动的相机时,FOV 已经改变。框架似乎被剪掉了。
那么切换前置后置摄像头时我错过了哪里?
谢谢。
PS:我已经google了,但是关于带有GLSurfaceView的Android Camera的信息很少。
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 - 这就是我所看到的......
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。
android - SurfaceTexture AttachToGLContext 和 Surface
如果我想从 SurfaceTexture 调用 attachToGLContext 方法,我正在尝试确定是否需要重新制作 Surface。我试图查看 android 文档,但没有提及。
我猜不是因为据我所知,Surface 是 SurfaceTexture 的缓冲区,它可以充当 OpenGL 上下文的外部纹理。因此,将 SurfaceTexture 附加到不同的上下文不应影响这一点。
有人确定吗?
android - MediaCodec 编码的视频底部有绿色条,色度搞砸了
我从Grafika开始了一个项目并对其进行了修改。我有一个框架(与原始框架没有太大不同),它从 中捕获预览Camera
并以不同的分辨率同时将其连续编码为视频。
MediaCodec
(用于编码)配置为使用COLOR_FormatSurface
,以便我们能够渲染到getInputSurface()
使用 GLES 查询的表面。
媒体格式设置为 MIME 类型video/avc
对于大多数手机,此设置完美运行。
但对于一些手机,编码视频的色度值略微倾斜,底部有一个绿色条。
目前,编码器表面的分辨率为 640x360。选择渲染到表面的 EGLConfig 支持 32 位 RGBA 格式。
预览在所有手机中都是完美的。
所以我假设在应用程序端或操作系统框架端的编码器参数有问题。
它发生在 Android 4.4 上。- 不确定,如果它可以在 5.* 上重现。
] 2
android - Android 使用 MediaCodec 解码原始 h264 流
我在 TextureView 上使用 MediaCodec 解码和绘制原始 h264 数据时遇到了麻烦。我以字节数组的形式接收原始数据,每个数组都是 NAL 单元(以 开头0x00 0x00 0x00 0x01
),也有恒定间隔的 SPS 和 PPS NAL 单元。当新数据到达时,我将其放入LinkedBlockingQueue
:
如您所见,这里还有解码器配置。当队列中出现第一个 SPS+PPS 时完成。while
循环运行的主要部分:
queueInputBuffer
看起来像这样:
封装此机制的类在单独的线程上运行,类似于MoviePlayer
from grafika。也是FrameCallback
来自SpeedControlCallback
grafika。
结果预览已损坏。当相机(视频源)静止时,它很好,但当它移动时,就会出现撕裂、像素化和伪影。当我将原始视频数据保存到文件并使用 ffplay 在桌面上播放时,它似乎没问题。
当我在寻找解决方案时,我发现问题可能是由无效的演示时间引起的。我试图修复它(你可以在代码中看到,我提供了系统时间以及使用preRender()
),但没有成功。但我不确定故障是否是由这些时间戳引起的。
有人可以帮我解决这个问题吗?
更新 1
就像 fadden 建议的那样,我已经针对 MediaCodec 本身创建的数据测试了我的播放器。我的代码捕获了相机预览,对其进行编码并将其保存到文件中。我之前使用目标设备的摄像头进行了此操作,因此我可以切换数据源。基于手机摄像头预览的文件在播放中不显示任何伪影。所以结论是来自目标设备相机的原始数据被错误地处理(或传递给解码器),或者它与 MediaCodec 不兼容(正如 fadden 所建议的那样)。
接下来我做的是比较两个视频流的 NAL 单元。MediaCodec 编码的视频如下所示:
第一个 NALU 只出现一次,在流的开头,然后是第二个(使用 0x65),然后是多次使用 0x21。然后又是 0x65,多个 0x21 等等。
但是目标设备的相机给了我这个:
并且整个序列在流中不断重复。
android - Grafika 和 OpenGL 在 android 上以方形录制视频
我目前正在尝试以方形录制视频并将输出创建为 .mp4。似乎真的很有挑战性。我尝试了不同的方法,包括:OnPreviewFrame 和 FFMpeg。但一直没有得到满意的结果。今天我找到了Grafika。这似乎是正确的方法。但是由于代码的复杂性,我现在被困住了。使用示例:CameraCaptureActivity.java 我设法录制了视频。但它的形状是长方形而不是正方形。此外,相机旋转了 90 度。我已经在尝试操纵某些参数,但从来没有得到一个好的视频。有些地方被挤压等等。
有人知道我需要在 Grafikas 示例中更改哪些参数才能获得正确的结果吗?最后,我的 android 手机的摄像头应该录制 Vine 或 Instagram 等视频。
谢谢你的帮助!
android - Texture2dProgram - sTexture 的 glUniform 定义在哪里
查看 Texture2dProgram.java 中的代码,我找不到定义 sTexture 的制服的位置。其他像 aPosition 是在构造函数中定义的。
作为 opengl 的新手,看起来片段着色器使用当前纹理单元,并且纹理绑定到该纹理单元,因此 sTexture 是默认的预定义名称。
android - 从 Surface 编码时出现 Android MediaCodec SIGSEGV 错误
我正在使用一些基于 Google/Andy McFadden 的 Grafika 示例应用程序的代码。
我时不时地看到间歇性的低级崩溃,堆栈跟踪如下所示:
这是在运行 5.1.1 的 Nexus 6 上
我很确定这发生在我的 TextureMovieEncoder 的 handleFrameAvailable 方法中,如下所示:
其中 mVideoEncoder 封装了一个带有输入表面的 MediaCodec 实例。
任何人都可以从这个堆栈跟踪中找出任何线索吗?