我在您可以在此处找到的两个示例的帮助下使用 Camera2 API:
我正在使用与上述链接相同的源代码,因此我不会在此处复制我的源代码(除非您需要某些部分,否则我将编辑我的问题并将其发布)。
编辑:
进行了一些测试。当我尝试通过手机播放视频时,它只显示第一帧,我可以听到录音中实际存在的音频(声音)。一旦视频播放到结束,视频会以某种方式自动重新启动并按原样显示视频。
但是,当我尝试在我的 PC 上播放视频(将其从手机复制到桌面)时,我只会在最后一帧之前出现黑屏。显示最后一帧,但视频根本不播放。我可以听到音频(声音)。
我在想某些视频编码/解码可能存在问题?
问题:
在我的情况下,视频录制不起作用。我可以在目录中看到它们应该在我的手机上的两个文件,但是当我播放视频(5 秒视频)时,前 4 秒是黑色的,然后最后一秒就像我录制的一帧,就是这样,但是文件大小似乎很大(160MB)。
屏幕:
我不知道出了什么问题,有人可以帮忙吗?
我正在尝试在手动相机控制中添加新的曝光值和 ISO 值。我正在使用 Camera2Basic 示例。我现在面临的问题是我是Android新手。我尝试查看 L-Camera,但它是在 Scala 中,这让我更加困惑。
我尝试了以下更改,但图像预览没有更新。
private void createCameraPreviewSession() {
try {
SurfaceTexture texture = mTextureView.getSurfaceTexture();
assert texture != null;
// We configure the size of default buffer to be the size of camera preview we want.
texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
// This is the output Surface we need to start preview.
Surface surface = new Surface(texture);
// We set up a CaptureRequest.Builder with the output Surface.
mPreviewRequestBuilder
= mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
mPreviewRequestBuilder.addTarget(surface);
// Here, we create a CameraCaptureSession for camera …Run Code Online (Sandbox Code Playgroud) 我正在尝试将相机项目更新到 Android N,因此我将旧的CameraCaptureSession移动到ReprocessableCaptureSession。我做到了并且工作正常,但是有了这个新功能,我可以CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG在我的设备中使用模板,并且可以使用reprocessCaptureRequest重新处理帧。
这是我的问题出现的地方。因为我没有找到任何示例,而且我不太理解有关如何使用的小文档reprocessCaptureRequest:
每个重新处理 CaptureRequest 都会处理从 CameraCaptureSession 的输入 Surface 到重新处理捕获请求中包含的所有输出 Surface 的一个缓冲区。重新处理输入图像必须从同一相机设备捕获的一幅或多幅输出图像生成。应用程序可以通过queueInputImage(Image)向相机设备提供输入图像。应用程序必须使用这些输出图像之一的捕获结果来创建重新处理捕获请求,以便相机设备可以使用该信息来实现最佳的重新处理图像质量。对于仅支持 1 个输出 Surface 的相机设备,提交具有多个输出目标的重新处理 CaptureRequest 将导致 CaptureFailure。
我试图在google.sources中查看有关相机的 CTS 测试,但他们的做法与我相同。使用多个 imageReader,将TotalCaptureResult图片保存在LinkedBlockingQueue<TotalCaptureResult>. 后来只是打电话:
TotalCaptureResult totalCaptureResult = state.captureCallback.getTotalCaptureResult();
CaptureRequest.Builder reprocessCaptureRequest = cameraStore.state().cameraDevice.createReprocessCaptureRequest(totalCaptureResult);
reprocessCaptureRequest.addTarget(state.yuvImageReader.getSurface());
sessionStore.state().session.capture(reprocessCaptureRequest.build(), null, this.handlers.bg());
Run Code Online (Sandbox Code Playgroud)
但它总是抛出一个 RuntimeException:
java.lang.RuntimeException: Capture failed: Reason 0 in frame 170,
我只想知道哪种方法是使用 ReprocessableCaptureSession 的正确方法,因为我已经尝试了所有方法,但我不知道我做错了什么。
我正在尝试修改帧速率(降低它),以便我们可以对其进行实时操作。但不能改变帧率。
可能的解决方案包括:
改变 CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES
延迟 setRepeatingRequest
我们需要降低传递给的生成帧速率,Surfaceholder以便可以进一步应用于其中的操作。
我正在尝试在干净的 android 应用程序中包含一个 CameraView 组件(来自 CameraX jetpack),如下所示:
https://medium.com/@hitherejoe/exploring-camerax-on-android-camera-view-daae6dfaa4ec https://developer.android.google.cn/jetpack/androidx/releases/camera
CameraView 非常简单,但将其绑定到 Activity 生命周期时出现问题。活动已授予相机权限。我试过在没有 CameraView 的情况下使用 CameraX(使用 SurfaceView + 所有设置),但以相同的结果和异常结束(并且 CameraView 使用起来要简单得多)。在三星 S10 和红米 Note 7 上测试过。 似乎组件尺寸/测量有问题:
例外
java.lang.BootstrapMethodError: Exception from call site #2 bootstrap method
at androidx.camera.core.Preview.updateListener(Preview.java:368)
at androidx.camera.core.Preview.updateOutput(Preview.java:586)
at androidx.camera.core.Preview.updateConfigAndOutput(Preview.java:363)
at androidx.camera.core.Preview.onSuggestedResolutionUpdated(Preview.java:524)
at androidx.camera.core.UseCase.updateSuggestedResolution(UseCase.java:408)
at androidx.camera.core.CameraX.calculateSuggestedResolutions(CameraX.java:684)
at androidx.camera.core.CameraX.bindToLifecycle(CameraX.java:195)
at androidx.camera.view.CameraXModule.bindToLifecycleAfterViewMeasured(CameraXModule.java:268)
at androidx.camera.view.CameraView.onMeasure(CameraView.java:364)
at android.view.View.measure(View.java:24973)
at androidx.constraintlayout.widget.ConstraintLayout.internalMeasureChildren(ConstraintLayout.java:1227)
at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1572)
at android.view.View.measure(View.java:24973)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7139)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
at android.view.View.measure(View.java:24973)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7139)
at androidx.appcompat.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:403)
at android.view.View.measure(View.java:24973)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7139)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185) …Run Code Online (Sandbox Code Playgroud) android android-lifecycle android-camera2 androidx android-camerax
镜头焦距的单位是什么?m(米)、cm、英寸
如果我设置如下
previewRequestBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE,0.20f);
Run Code Online (Sandbox Code Playgroud)
那么镜头焦距的单位是厘米、英寸?
镜头焦距简介
我有一个PreviewView占据整个屏幕但工具栏除外。相机的预览效果很好,但是当我拍摄图像时,纵横比完全不同。
我想在成功捕获后向用户显示图像,因此它的大小与 相同,PreviewView因此我不必裁剪或拉伸它。
是否可以在每个设备上更改纵横比,它是它的大小PreviewView还是我必须将其设置为固定值?
我在时间戳上遇到了问题,如果有人可以帮助我,我将不胜感激。我正在尝试将SensorEvent同步到从ImageReader收到的图像。
我知道SensorEvent的时间戳是自操作系统启动(正常运行时间)以来的纳秒。另一方面,图像的getTimestamp(来自ImageReader)以纳秒为单位进行度量,但是时基取决于提供图像的源(Camera,CameraDevice等)。就我而言,我使用的是CameraDevice(camera2),但是我没有找到CameraDevice的时基。
我将不胜感激任何帮助。干杯
我想在某个时间(例如5秒)后停止录制视频。
你知道怎么用MediaRecorder吗?
通过 camera2 API,我们接收到格式为YUV_420_888的 Image 对象。然后我们使用以下函数转换为NV21:
private static byte[] YUV_420_888toNV21(Image image) {
byte[] nv21;
ByteBuffer yBuffer = image.getPlanes()[0].getBuffer();
ByteBuffer uBuffer = image.getPlanes()[1].getBuffer();
ByteBuffer vBuffer = image.getPlanes()[2].getBuffer();
int ySize = yBuffer.remaining();
int uSize = uBuffer.remaining();
int vSize = vBuffer.remaining();
nv21 = new byte[ySize + uSize + vSize];
//U and V are swapped
yBuffer.get(nv21, 0, ySize);
vBuffer.get(nv21, ySize, vSize);
uBuffer.get(nv21, ySize + vSize, uSize);
return nv21;
}
Run Code Online (Sandbox Code Playgroud)
虽然此函数与 配合良好cameraCaptureSessions.setRepeatingRequest,但在调用 时,我们会在进一步处理(在 JNI 端)中遇到分段错误cameraCaptureSessions.capture。两者都通过 ImageReader 请求 YUV_420_888 …