问题标签 [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 - 如何在ContinuousCaptureActivity中使相机预览区域为SurfaceView的一半
我想让相机预览的区域是SurfaceView的一半,所以我修改了ContinuousCaptureActivity的代码。详情如下:
用于GLES20.glViewport(0, 0, viewWidth / 2, viewHeight / 2);
替换https://github.com/google/grafika/blob/master/src/com/android/grafika/ContinuousCaptureActivity.java#L436
但结果很奇怪,见下图。
我真的无法理解它,正确的方法是什么?
谁能给我一些建议?
android - 无法设置背景颜色并清除 EGL 中的输出
我已经尝试在 Android 中使用以下示例代码来学习 OpenGL。但我看不到预期的输出。请指出问题出在哪里?
我使用了 fadden 的贡献作为参考。
步骤1:
我用renderHandler 创建了renderThread。
我在 RenderThread 构造函数中收到的 userSurface。
现在,我在 Choreographer 回调机制的帮助下调用 doFrame() API 来在表面上绘制颜色。
注意:应用程序使用 TextureView 并以下列方式接收到表面。
问题:
我不确定我是否与 OpenGL 编码中的正确程序保持一致。此外,我没有看到表面显示任何颜色,而只有黑色。即使我什么都不做,我也会做黑色。
请提供输入。另外,让我知道我需要注意的缺失部分?
android - 使用 Matrix 的 rotateM() 从 SurfaceTexture 旋转矩阵但损坏视频输出
我设法用opengl es播放视频,我使用了grafika的ContinuousCaptureActivity的方式,我的数据源是MediaPlayer而不是Camera,这没有什么区别。MediaPlayer 连续生成视频帧,我在 onFrameAvailable 回调中将每一帧绘制到屏幕上。代码如下,效果很好:
现在我想将视频帧旋转 270 度,所以我更改了代码:
但我可以使用以下代码成功翻转视频帧:
如何实现旋转,有人可以帮我吗?
添加:
首先,我想说的是,我总是在每个绘制动作中使用这段代码:
我用这个demo来做我的测试,对于这个测试来说是一个很好的demo。 https://github.com/izacus/AndroidOpenGLVideoDemo
从surfacetexture得到的矩阵是:
1.0, 0.0, 0.0, 0.0
0.0, -1.0, 0.0, 0.0
0.0, 0.0, 1.0, 0.0
0.0, 1.0, 0.0, 1.0
"Matrix.setRotateM(videoTextureTransform, 0, 270, 0, 0, 1);"之后,
它变成了:
1.1924881E-8, -1.0, 0.0, 0.0
1.0, 1.1924881E-8, 0.0, 0.0
0.0, 0.0, 1.0, 0.0
0.0, 0.0, 0.0, 1.0
android - 将 Egl 配置的表面传递给本机并推送数据的问题
首先,感谢 fadden 提供的精彩示例。
我尝试遵循 这个ContinuousCapture.java 示例,并生成了以下程序。
1)
我试图通过获取其 ANativeWwindow 引用并使用 ANative lock 和 unlockpost 方法来获取 BufferQueue并填充数据,将图像显示到本机层的 TextureView 中。
IE:
2)
同时我想从这个 Surface 检索数据并将其传递给编码器。或者,将其显示到另一个表面。
作为第一步,我创建了下面的类,它将 EglCore 初始化到不同的线程中,并尝试在 EglContext 中配置用户给定的表面。到目前为止,一切都很好。但是,当我尝试通过 lock 和 unlockAndPost 方法将数据复制到缓冲区时,我收到以下错误。
问题: 这是正确的方法吗?或者我忽略了什么?
请帮助我。
android - 无法理解有助于异步显示的 BufferQueue 同步逻辑
我正在从此链接阅读 android 体系 结构。
在第一次尝试时,除了零零碎碎的东西,我什么都不懂。
我明白什么?
1)
有一种叫做“同步框架”的东西。- 好的
2)
此同步框架可用于进程之间以及用户空间和内核空间之间。- 好的
3)
用于异步机制。- 好的。
4)
假设没有 Sync 框架。
有一个显示系统显示给定的缓冲区。
可能会有延迟,因为它是同步的。
5)
假设我们有同步框架支持。它是这样的:我会给显示系统缓冲区和 startfence,当你在 startfence 上收到信号时,你需要显示缓冲区。同时,当你完成后,你需要用donefence来亲近我。显示系统为我提供的。[我不完全理解,但我觉得它对异步模型有帮助],这样我就可以在系统渲染时填充缓冲区。
灰色区域:但是,我仍然无法编写伪代码来说明如何在异步模式下使用 display_buffer?
从android官方链接阅读段落。
”最新的 Android 设备支持“同步框架”。这允许系统在与可以异步操作图形数据的硬件组件结合时做一些漂亮的事情。例如,生产者可以提交一系列 OpenGL ES 绘图命令,然后入队渲染完成之前的输出缓冲区。缓冲区伴随着一个栅栏,当内容准备好时发出信号。当缓冲区返回空闲列表时,第二个栅栏伴随着缓冲区,以便消费者可以在内容仍然存在时释放缓冲区正在使用中。随着缓冲区在系统中移动,这种方法可以改善延迟和吞吐量。 “
问题:
我对这种说法特别感到困惑。
“当缓冲区返回到空闲列表时,第二个栅栏会伴随缓冲区,以便消费者可以在内容仍在使用时释放缓冲区。当缓冲区在系统中移动时,这种方法可以改善延迟和吞吐量。”
同一缓冲区上的第二个栅栏?或不同的缓冲区?如我所见,有两个缓冲区队列,一个是填充列表,另一个是空列表。
android - 使用android opengl es处理图像但输出图像在某个设备中很奇怪
我写了一个关于相机的演示,它类似于 grafika的 ContinuousCaptureActivity(ContinuousCaptureActivity.java 的源代码)。对于每一帧,除了将帧绘制到屏幕之外,我还添加了一些操作。
我创建了一个 fbo,然后将其绑定并将框架绘制到 fbo。为了检查渲染到 fbo 的图像,我使用 pbo 将图像数据读回 RAM,并每 50 帧将图像保存为 jpg。这样,我得到了jpg文件,但是它被缩放了,图片如下:
我认为来自 SurfaceTexture 的矩阵导致了缩放,因为每个 drawFrame() 都应用了该矩阵。所以我创建了另一个 fbo 并将第一个 fbo 的框架绘制到这个 fbo,然后我将图像保存为 jpg 并且图像按预期转好。看看这个:
所以结论是2次抽奖就能正确恢复图像。
但是我的华为手机(型号:华为MT7-CL00)图像很奇怪。看它:
我用华为手机检查了第一个 fbo 的图像,它按预期缩放,但并不奇怪。所以我认为错误发生在第二个 fbo 中。但我无法弄清楚原因。谁能给我一些建议?
一些源代码:
fbo定义:
GlTexture 和 GlFrameBuffer 类源码:
bindFbo 方法:
drawFrame() 中的关键代码:
performance - glMapBufferRange() 很慢,映射数据的 memcpy() 在 Android 上也很慢
我设法编写了一个类似于 grafika 的 ContinuousCaptureActivity 的视频录制演示(ContinuousCaptureActivity.java 的源代码)。
不同的是,grafika 使用的是硬件编码,而我使用的是软件编码。对于软件编码,我使用 PBO 从 GPU 获取每个视频帧,速度非常快,并将图像数据复制到 ffmpeg,然后进行 h264 编码。
大多数设备的性能是可以接受的,glMapBufferRange() 用时不到5ms,memcpy() 用时不到10ms。
但是在华为mate7的手机上性能较低。glMapBufferRange() 耗时 15~30ms,memcpy() 耗时 25~35ms。
我在 mate7 上测试过正常的 memcpy(),复制正常内存时速度要快得多。
真的很奇怪,谁能帮帮我?
设备信息:
在此处查看详细信息:华为 mate 7
pbo代码如下:
android - Android - 高斯模糊效果 - OpenGL
在没有指定的地方,这个问题只是建立在 github 上CameraCaptureActivity
的grafika项目之上。
它具有利用 3x3 内核的内置模糊效果
然而这种模糊效果还不够强,我正在寻找类似高斯效应在 iOS 上可以做什么的UIVisualEffectView
东西,它看起来像这样:
一个很好的平滑重度模糊效果,但到目前为止,我管理的最好的是:
正如你所看到的,它几乎没有那么平滑而且有点方正。
我通过转换为使用这个方便的工具生成的 5x5 内核来实现这一点,该工具的 sigma 为 30,内核大小为 5。它产生以下结果:
为了在项目中工作,我Grafika
必须在课堂上进行修改KERNEL_SIZE
mTexOffset
Texture2dProgram
KERNEL_SIZE
现在25
和mTextOffset
现在计算如下:
有没有人对我可以修改什么以实现类似模糊的 iOS 有建议(我认为 iOS 也在减轻像素)?我认为我真正出错的地方是 setTextSize() 计算,特别是50.0f
值,我刚刚从空气中提取了这个并观察了它的效果
android - 使用 Grafika CameraCapture 代码拉伸 Android 相机预览
我正在寻求使用Grafika 的 CameraCaptureActivity代码时遇到的问题的帮助。我想构建一个可以记录相机并显示预览的应用程序,所以这个示例和代码看起来正是我想要的,到目前为止它很棒,这个问题 appart。
GLSurfaceView
我遇到的问题是,当相机预览尺寸与我用来显示预览的确切尺寸不匹配时,它会显示拉伸预览。
这是它的外观:
正如您所看到的,它是水平拉伸的,因为便条纸是一个完美的正方形。
对于三星 Galaxy S4 上的这个精确示例,相机预览大小为(使用API1280x720
从可用预览大小中提取),并且将覆盖整个屏幕。Camera2
GLSurfaceView
1920x1080
什么时候出现?
与相机输出相比,当 SurfaceView 放大时会出现问题,即使我始终确保比率保持正确(1920x1080
= 1,5 * 1280x720
)。
你用的是什么代码?
我使用 Grafika 的代码,包括:
一些日志?
这是 SurfaceFlinger 转储的样子:
相机预览尺寸代码?
你试过什么?
我首先认为这是一个Camera2
问题,所以我尝试只使用旧的 Camera API,但结果是一样的。
然后我认为这是一个比例问题,但正如你所看到的,这里的比例在水平和垂直方向上都可以。
我敢打赌,在调整 Surface 大小时会应用 OpenGL 转换,但我是 OpenGL 中的纯菜鸟,所以我找不到任何可行的方法。我尝试添加这些行,但没有帮助:
另一个来自 Grafika 的例子:
这是另一个来自 Grafika 应用程序的问题示例。
电话:Galaxy S3 Neo ( GT-I9301L
) - Android 4.4.2
手机有一个1280x720
屏幕,相机以640x480
分辨率打开,显示为573x430
. 这是它的外观:
SurfaceFlinger 日志:
Grafika 的应用日志:
所以...
如果你们中的一个人知道如何让它发挥作用,我很想听听他的意见。
谢谢!