我正在使用 Google Samples ( https://github.com/googlesamples/android-Camera2Basic )中的 Camera2Basic 示例来显示片段内的相机预览。该片段包含一个RelativeLayout 和一个自定义的AutoFitTextureView。后者可以在上面的链接中找到。我调整了布局以将预览居中并删除控制按钮:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/camera_rel">
<uk.co.deluxe_digital.messngr.AutoFitTextureView
android:id="@+id/texture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true" />
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
我在 ViewPager 中显示了总共三个片段。我确实对 Camera2BasicFragment 做了一些小更改,使其成为 android.support.v4.app.Fragment 来与我的 ViewPager 配合使用并删除按钮。
我想要的是让相机预览充满整个屏幕。这可以通过拉伸预览图像来实现。那不是我想要的。有谁知道放大预览或TextureView的方法,以便预览的高度与容器匹配,即使侧面被裁剪掉。我希望它能够填充视图并保持纵横比。这意味着两侧的一些预览都会丢失,但这没关系。
FloatingActionButton 负责捕获图像。这是主要的家长活动。
即使你能为我指明解决这个问题的正确方向,那也会是一个巨大的帮助!
java android android-layout android-fragments android-camera2
我对 Android 很陌生,并试图:
似乎原始数据捕获仅在静态捕获模式下可用。这样对吗 ?
如果是这样,是否可以对 RAW 图像执行重复的 CaptureRequests ?使用 13MP 传感器可以获得什么样的性能?任何参考代码?
提前谢谢了,
纪尧姆
编辑:
这是我到目前为止所做的:
在 onSurfaceTextureUpdated() 中计算/更新帧率
问题:
将原始 ImageReader 的表面添加到 cameraDevice.createCaptureSession()
原始分辨率为 4208x3120
最小帧持续时间为 33ms
停顿时间为 200 毫秒
我仅为预览获得的帧速率约为 25-30 fps。
我在预览和启用每帧原始捕获时获得的帧速率约为 15 fps。
我收到一些“ImageReader_JNI:无法获取缓冲区项,很可能客户端试图获取超过 maxImages 个缓冲区”的消息,即使我每 100 帧进行一次原始捕获。
我很想得到一些反馈:
我想ImageAnalysis与 CameraX一起使用,但要调整一些相机设置,例如自动对焦或自动白平衡、曝光和帧持续时间。
这是我需要的设置示例以及我如何使用 Camera2 设置它们:
captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_OFF)
captureRequestBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CameraMetadata.CONTROL_AWB_MODE_OFF)
captureRequestBuilder.set(CaptureRequest.SENSOR_FRAME_DURATION, FRAME_DURATION_NS)
captureRequestBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, EXPOSURE_TIME_LIMIT_NS)
Run Code Online (Sandbox Code Playgroud)
如何将其“翻译”到 CameraX?
CameraDevice.createCaptureSession 大部分已被弃用。有关如何将剩余版本方法与 SessionConfiguration 参数(尤其是执行程序参数)一起使用的任何示例都会很好。
目前我有:
cameraDevice.createCaptureSession(surfaceList, mCameraSessionListener, mCameraHandler);
Run Code Online (Sandbox Code Playgroud) 我有三星 S10,它具有视频稳定功能。使用系统默认的相机应用程序,我可以看到启用和未启用时的区别:首先,如果启用,则会出现一些缩放预览,其次,在设备移动期间会很明显。
我尝试使用 Camera2 API、全高清和后置摄像头(与默认系统应用程序相同)在自己的应用程序中启用稳定性。
我测试了characteristics.get(CameraCharacteristics.CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES)仅返回CONTROL_VIDEO_STABILIZATION_MODE_OFF,因此不支持此操作。
但characteristics.get(CameraCharacteristics.LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION)
有CameraMetadata.LENS_OPTICAL_STABILIZATION_MODE_ON
因此,据我所知,这正是启用视频稳定(光学)的选项,应该与默认系统应用程序中的相同。
但是,当我对相机捕获会话配置进行下一步时,它不会改变任何内容,没有缩放预览(与默认系统相机应用程序一样),并且在移动过程中没有变化,因此视频在我的应用程序中与它应该有的相同使用默认相机应用程序并禁用视频稳定功能
captureRequestBuilder.set(
CaptureRequest.LENS_OPTICAL_STABILIZATION_MODE,
CameraMetadata.LENS_OPTICAL_STABILIZATION_MODE_ON
)
Run Code Online (Sandbox Code Playgroud)
所以设置这个参数不会改变任何东西。
为什么视频稳定功能在默认系统相机应用程序中有效,但在我自己使用 Camera2 API 的应用程序中无效?
已弃用的createCaptureSession()方法在旧代码中按以下方式使用:
cameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
if (mycameraDevice == null){
return;
}
cameraCaptureSession = session;
if (cameraDevice == null){
return;
}
captureRequestBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
try {
cameraCaptureSession.setRepeatingRequest(captureRequestBuilder.build(), null, mBackgroundHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession session) {
Toast.makeText(MainActivity.this, "Configuration Failed! :(", Toast.LENGTH_SHORT).show();
}
}, null);
Run Code Online (Sandbox Code Playgroud)
我还在 StackOverflow 上发现了这个问题,其中我们必须执行以下操作:
SessionConfiguration sessionConfiguration = new SessionConfiguration(SessionConfiguration.SESSION_REGULAR, Collections.singletonList(outputConfiguration), new HandlerExecutor(mCameraHandler.getLooper()), mCameraSessionListener);
cameraDevice.createCaptureSession(sessionConfiguration);
Run Code Online (Sandbox Code Playgroud)
首先,这是正确的使用方法吗?如果是,那么outputConfiguration是什么以及如何正确声明它?在 Youtube 教程中,从未创建任何输出配置!
那么我需要进行哪些更改才能再次使用该代码?
我正在制作一个充当手电筒的简单应用程序.我需要能够使用Camera2 API从应用程序中的按钮打开和关闭闪存,因为我使用旧的相机API出错了.我想使用"手电筒"手电筒,相机无需打开即可开启闪光灯.我知道这是可能的,因为很多手机在快速设置菜单中都有闪光灯开/关,但我找不到任何关于如何操作的代码或教程.
码:
Camera cam = Camera.open();
Parameters p = cam.getParameters();
p.setFlashMode(Parameters.FLASH_MODE_TORCH);
cam.setParameters(p);
cam.startPreview();
Run Code Online (Sandbox Code Playgroud)
我在使用Android 6.0.1的Nexus 6P上运行.
编辑:我需要使用Camera2 API.我还没有找到一个很好的教程,在得到答案之后,我将在这里创建一个Q/A格式.
我正在尝试使用Android处理我的Nexus 5x Camera2 APIs并使用googlesamples android-Camera2Basic
我的问题是JPEG图像的质量太低,而且它的尺寸远小于我用手机相机应用拍摄的常规图像.
根据谷歌文档JPEG_QUALITY,CaptureRequest和CaptureResult中都应该有一个键:
JPEG_QUALITY
在API级别21中添加
密钥JPEG_QUALITY
最终JPEG图像的压缩质量.
85-95是典型的使用范围.
有效值范围:
1-100; 越大越高质量
此密钥适用于所有设备.
但是,当我要求可用的密钥时,JPEG_QUALITY密钥不可用,所以我不知道如何知道我目前使用的JPEG压缩质量是什么以及如何更改它.
我在里面做的代码:
CameraCaptureSession.CaptureCallback CaptureCallback
= new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureCompleted(@NonNull CameraCaptureSession session,
@NonNull CaptureRequest request,
@NonNull TotalCaptureResult result) {
//_TEST_DEBUG
List<CaptureRequest.Key<?>> requestKeys = request.getKeys();
List<CaptureResult.Key<?>> resultKeys = result.getKeys();
Run Code Online (Sandbox Code Playgroud)
requestKeys&resultKeys有许多键,包括JPEG_ORIENTATION但不是JPEG_QUALITY键.
知道我做错了什么吗?为什么我找不到如何改变JPEG压缩质量?
谢了,兄弟们
有人可以提供一个简短的示例,说明如何使用NDK,C ++ Camera 2 API捕捉相机框架吗?
我找不到任何有意义的资源,因为它是一种全新的API,但是感谢您的帮助。
谢谢!
我正在尝试将YUV_420_888图像转换为来自camera2预览的位图。但是输出图像的颜色不正确。
接下来是我正在运行的用于生成位图的测试代码。仅是测试代码,因此请不要对不相关的因素进行任何代码审查,例如,位图将被回收,或者将连续创建RenderScript。该代码仅用于测试从YUV到RGB的转换,仅此而已。
其他因素是,该代码应从API 22及更高版本运行,因此使用RenderScript特定的ScriptIntrinsicYuvToRGB应该足够,而不必使用旧的手动转换,由于缺乏适当的YUV_420_888支持,因此仅在以前的Android版本中才需要使用。
由于RenderScript已经提供了专用于处理所有类型的YUV转换的ScriptIntrinsicYuvToRGB,我认为问题可能出在如何从Image对象获取YUV字节数据,但我无法弄清楚问题出在哪里。
要在Android Studio中查看输出位图,请在bitmap.recycle()中放置一个断点,因此在回收之前,可以使用“查看位图”选项在“变量调试”窗口中对其进行查看。
请让我知道是否有人可以发现转换的问题:
@Override
public void onImageAvailable(ImageReader reader)
{
RenderScript rs = RenderScript.create(this.mContext);
final Image image = reader.acquireLatestImage();
final Image.Plane[] planes = image.getPlanes();
final ByteBuffer planeY = planes[0].getBuffer();
final ByteBuffer planeU = planes[1].getBuffer();
final ByteBuffer planeV = planes[2].getBuffer();
// Get the YUV planes data
final int Yb = planeY.rewind().remaining();
final int Ub = planeU.rewind().remaining();
final int Vb = planeV.rewind().remaining();
final ByteBuffer yuvData = ByteBuffer.allocateDirect(Yb + Ub + Vb);
planeY.get(yuvData.array(), 0, Yb);
planeU.get(yuvData.array(), Yb, …Run Code Online (Sandbox Code Playgroud) android-camera2 ×10
android ×9
android-ndk ×1
bitmap ×1
c++ ×1
camera ×1
java ×1
performance ×1
yuv ×1