安卓设备上如何实现60/120fps的预览数据?

12
我们希望使用Neon汇编或GPU着色器处理每秒120帧(或60帧)的摄像机预览数据,执行简单的图像处理操作(例如3x3卷积)。我们不关心将图像显示在屏幕上,因此相机数据应直接传递到SurfaceTexture。
我们曾认为可以在Nexus 5上使用CameraConstrainedHighSpeedCaptureSession通过Camera2 API实现这一点,但未能成功。
目前互联网上没有有效的代码(至少我们所搜集的部分)可实现此功能,但该功能很可能存在。
使用Camera2 API进行高速录制的最佳示例在此处:https://github.com/PkmX/lcamera 为了鼓励有人发布解决方案,我们在此问题上设置了赏金。

您可以在此找到有用的答案:https://stackoverflow.com/a/66778188/10183099 - zeitgeist
2个回答

2

我们成功地修改了camera2video示例,以在三星S6上获得120帧每秒的数据速率。

代码在这里

我们还没有成功提取像素,但我们成功后会在此更新。


我看到你上面分享的代码。有两件事要说:
  1. 当它要工作于120或以上的帧速率(高速录制)时,它不太稳定并且存在一些问题。
  2. 代码根本就没有旨在实现60帧每秒的录制。而这正是我现在正在寻找的。
那么,你有什么东西可以帮助确定设备是否支持60fps录制吗?
- Ashutosh Tiwari

2
这可以在 pjsip 中完成。将仓库拉到您的设备上:
svn checkout -r 4687 https://svn.pjsip.org/repos/pjproject/trunk

然后打开pjmedia/src/swig文件夹,查看从线路传入的视频数据直接渲染到SurfaceTexture的示例应用程序。

我已经上传了两个最相关的C源文件(一目了然 - 当然还有其他文件),请点击以下链接:

  1. android_dev.c
  2. android_opengl.c

当然,这些文件对您来说包含了许多不相关的代码,但希望其中包含您正在寻找的代码片段。

如果您不确定如何生成处理极简Java/C接口的pjmedia/src/pjmedia-videodev/android/PjCamera*.java文件,则可能需要先按照此处的一些说明。我能够遵循他们的说明 - 使用完全相同的NDK版本(适用于10d或10e)和openssl版本(1.0.2a),并成功地渲染视频并创建自定义应用程序。如果您只是修改C级别的视频捕获以通过JNI钩子使用您的API,那么此源代码将正好实现您所需的内容。

要了解使用JNI钩子更改API的示例,请查看它们在pjmedia中的audiodev文件夹。

如果您构建他们的项目,请确保遵循底部的说明来为新版本的NDK构建openssl 1.0.2a。请注意,在执行标准的./configure命令可能会启动错误的配置过程时,需要在./Configure上区分大小写。我建议将提供的命令复制并粘贴到脚本中。对于您的目的,您可能可以完全跳过openssl;只有在集成了openssl支持后,我才能使我的Android设备一直注册SIP帐户。


感谢您的详细回复。您是否已经成功从流中获取了60或120帧每秒的数据? - twerdster
这取决于设备,但肯定的是:在两个现代设备之间,我可以以最大分辨率实时从相机进行流传输,这对我来说通常被限制在30或60 fps(通过将完整流传输到第二个设备进行呈现,如pjsip)。在本地设备上直接呈现到隐藏纹理上,我看到的最高帧率约为200 fps。 - EntangledLoops
摄像头的帧率是60fps?你说的200fps是什么意思?我特别询问的是来自物理设备摄像头的帧。你使用的是哪些设备? - twerdster
抱歉,我的意思是OpenGL能够在同时捕获/复制视频数据(以30或60 fps)到隐藏表面的情况下实现高帧率。相机完全依赖于设备。我个人还没有以120 fps进行过捕获,但我也没有尝试过(对于我的视频项目来说速度还不是一个因素)。然而,我正在使用的JNI钩子很慢,但它仍然可以很好地跟上。 - EntangledLoops
好的,如果我理解正确的话,您能够以60帧每秒的速度捕捉并在全分辨率上更快地处理。您使用的是什么分辨率和设备? - twerdster
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接