问: 有没有人知道如何使用Tango Java(Jacobi)API onFrameAvailable()回调获取Tango的彩色相机图像缓冲区?
背景:
我有一个增强现实应用程序,在Tango的背景中显示视频.我在此示例后使用Java API(Jacobi)成功创建了视频叠加示例.我的应用程序工作正常,视频在后台正确呈现.
作为应用程序的一部分,我想在用户按下按钮时存储视频后备缓冲区的副本.因此,我需要访问相机的RGB数据.
根据Jacobi发行说明,任何希望访问相机RGB数据的类都应该实现新的onFrameAvailable()方法OnTangoUpdateListener.我做了这个,但我没有看到任何实际获取像素的句柄或参数:
Java API
@Override
public void onFrameAvailable(int cameraId) {
//Log.w(TAG, "Frame available!");
if (cameraId == TangoCameraIntrinsics.TANGO_CAMERA_COLOR) {
tangoCameraPreview.onFrameAvailable();
}
}
Run Code Online (Sandbox Code Playgroud)
如图所示,onFrameAvailable只有一个参数,整数表示生成视图的摄像机的id.将其与C库回调进行对比,后者提供对图像缓冲区的访问:
C API
TangoErrorType TangoService_connectOnFrameAvailable(
TangoCameraId id, void* context,
void (*onFrameAvailable)(void* context, TangoCameraId id,
const TangoImageBuffer* buffer));
Run Code Online (Sandbox Code Playgroud)
我期待Java方法在C API调用中有类似于缓冲区对象的东西.
我试过的
我尝试扩展TangoCameraPreview课程并将图像保存在那里,但我只获得黑色背景.
public class CameraSurfaceView extends TangoCameraPreview {
private boolean takeSnapShot = false;
public void takeSnapShot() {
takeSnapShot …Run Code Online (Sandbox Code Playgroud) 更新有很多其他帖子询问如何在Android中获取屏幕截图但似乎没有一个完整的答案如何这样做.最初我把这个问题发布为一个问题,因为我在试图打开一个流到帧缓冲区时遇到了一个特定的问题.现在我已经交换了将Frame Buffer转储到一个文件中,所以我更新了我的帖子以显示我是如何到达那里的.为了参考(和确认),我找到了从这篇文章发送FrameBuffer到一个文件的命令(不幸的是他没有提供他如何达到这一点).我只是想知道如何将从Frame Buffer中提取的原始数据转换为实际的图像文件.
我的目的是在Android设备上完全转储实际屏幕.我没有使用adb桥就能找到这样做的唯一方法就是直接访问系统的Frame Buffer.显然,这种方法需要设备上的root权限以及运行它的应用程序!幸运的是,出于我的目的,我可以控制设备的设置方式,并使设备具有root权限,并且提供给我的应用程序是可行的.我的测试目前正在运行2.2.3的旧Droid上进行.
我从/sf/answers/487923691/找到了我的第一个如何处理它的提示.经过一番研究后,我发现另一篇文章描述了如何以root身份正确运行shell命令.他们用它来执行重启,我用它将当前帧缓冲区发送到实际文件.我目前的测试只是通过ADB和基本Activity(每个都提供root)来实现.我将从后台运行的服务进行进一步测试,更新来!这是我的整个测试活动,可以将当前屏幕导出到文件:
public class ScreenshotterActivity extends Activity {
public static final String TAG = "ScreenShotter";
private Button _SSButton;
private PullScreenAsyncTask _Puller;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
_SSButton = (Button)findViewById(R.id.main_screenshotButton);
_SSButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if (_Puller != null)
return;
//TODO: Verify that external storage is available! Could always use internal instead...
_Puller = new PullScreenAsyncTask();
_Puller.execute((Void[])null);
}
});
} …Run Code Online (Sandbox Code Playgroud) 我的设备是运行Jelly Bean 4.2的Nexus 4.我正在尝试录制屏幕并将其发送出去.互联网上的大多数代码通过读取/ dev/graphics/fb0来执行上限.它在某些设备和旧系统中运行良好.但是当我在我的设备上试用它时,它会失败.它只给我黑屏和原始数据中的所有"0".我运行"adb root"获取root权限,尝试"chmod 777 fb0","cat fb0>/sdcard/fb0".我也试过像"mmap"和"memcpy"这样的代码来获取数据.但都失败了.我在互联网上搜索,似乎没有解决方案.有些线程说内核可能会禁止你读取fb0.有人对此有所了解吗?