我尝试一次录制2种不同分辨率的视频.有时一切顺利,有时应用程序似乎陷入2 MediaRecorders的stop()方法.有人可以查看我的代码,我做错了吗?
package com.example.android.videorecording;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent;
import android.hardware.camera2.params.StreamConfigurationMap;
import android.media.MediaCodec;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.hardware.camera2.*;
import android.os.Environment;
import android.util.Size;
import android.view.Surface;
import android.view.View;
import android.widget.Button;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends Activity {
CameraDevice mCamera;
MediaRecorder mMediaRecorderLow = new MediaRecorder();
MediaRecorder mMediaRecorderHigh = new MediaRecorder();
CaptureRequest mCaptureRequest;
CameraCaptureSession mSession;
boolean recording = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
CameraManager manager = (CameraManager) getSystemService(CAMERA_SERVICE);
File dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 Camera2(android.hardware.camera2) API 上以 60(或更高)fps 的速率录制视频。
最后,我使用CameraConstrainedHighSpeedCaptureSession以 120fps 的速度成功录制。但它仅针对 >=120fps 的用例而不是 60fps。
即使我尝试使用普通捕获会话(CameraCaptureSession)以 60fps 进行录制,它也仅支持 <=30fps。我可以通过下面的代码弄清楚。
Range<Integer>[] fpsRanges = characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
Run Code Online (Sandbox Code Playgroud)
我不知道如何使用 Camera2 API 以 60fps 的速度进行录制。
任何想法都会受到欢迎。
谢谢。
android video-recording android-5.0-lollipop android-camera2
我正在使用谷歌样本'android-Camera2Video':
https://github.com/googlesamples/android-Camera2Video
问题是,当应用程序完成录制时,有时会卡住片刻,然后使用1 - ' ERROR_CAMERA_IN_USE '错误代码调用CameraDevice.StateCallback的onError()处理程序.
它不会每次都发生,它发生在大约90%的情况下,有时一切正常,没有错误.我无法找出它取决于什么以及如何解决这个问题.如果有人以前遇到过这个问题,请帮忙.
正如标题所说,我在使用 Camera2 API 在三星 Note5 上录制视频时遇到问题。
我已经从 Camera2Video 示例中修改了我的代码,但不同之处在于我设置了类中的MediaRecorderusing 配置选项,CamcorderProfile并且在开始视频录制之前进行预览时,我正在捕捉到一个ImageReader以及将预览渲染到一个SurfaceTexture(示例不使用ImageReader)。
这是我的startVideoCapture功能(几乎与示例相同)
private boolean startVideoCapture() {
if (null == mCameraDevice || !mTextureView.isAvailable() || null == mPreviewSize) {
debugToast("Can't start video preview");
return false;
}
try {
closePreviewSession();
if(!setUpMediaRecorder())
{
debugToast("setUpMediaRecorder failed");
return false;
}
SurfaceTexture texture = mTextureView.getSurfaceTexture();
assert texture != null;
texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
final CaptureRequest.Builder previewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
List<Surface> surfaces = new ArrayList<Surface>();
Surface previewSurface = new Surface(texture); …Run Code Online (Sandbox Code Playgroud) 这是我的问题,我目前无法在调用捕获后使用来自 Camera2API 的静止捕获图像填充 3 个表面之一。我使用了 Google Camera2 Getting Started(需要链接)来设置样板,因此这段代码的大部分内容可能看起来很熟悉。
Camera2捕获状态:
每个请求将生成一个 CaptureResult 并为一个或多个目标 Surface 生成新帧,使用 CaptureRequest 构建器的 addTarget(Surface) 方法设置。目标表面(使用 addTarget(Surface) 设置)必须是创建此捕获会话时提供的表面的子集。
好的Android,我会遵守的
// in order to use a surface they must be registered when creating the session
List<Surface> surfaces = new ArrayList<>(previewSurfaces); //size + 1
surfaces.addAll(displaySurfaces); // size + 1
surfaces.add(mImageReader.getSurface()); //size + 1
try {
mCameraDevice.createCaptureSession(surfaces, mCaptureSessionCallback , null);
...
Run Code Online (Sandbox Code Playgroud)
然后这样做
// Add the display surfaces along with the internal image reader
captureBuilder.addTarget(mImageReader.getSurface());
for(Surface surface : this.displaySurfaces) …Run Code Online (Sandbox Code Playgroud) 我尝试更改Camera2预览的纵横比,但失败了 :-(
对于裁剪,我必须使用SCALER_CROP_REGION但我没有让它工作。
我使用Google的android-Camera2Video示例进行测试。
在openCamera方法中,我添加了以下行:
mSensorSize = characteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
Run Code Online (Sandbox Code Playgroud)
在startPreview 中,我添加了以下内容:
final int centerX = mSensorSize.width() / 2;
final int centerY = mSensorSize.height() / 2;
final int cropSize = Math.min(mSensorSize.width(), mSensorSize.height());
final Rect crop = new Rect(centerY - cropSize / 2,
centerX - cropSize / 2,
cropSize,
cropSize);
mPreviewBuilder.set(CaptureRequest.SCALER_CROP_REGION, crop);
Run Code Online (Sandbox Code Playgroud)
我应该以 1:1 的比例预览,但它是 3:4 :-(
我做错了什么?
I use google sample to create Android camera app. During several days I cannot resolve the issue with the output image quality.This is a base Fragment for capture photo/video.
public class Camera2BaseFragment extends Fragment implements View.OnTouchListener {
protected static final SparseIntArray DEFAULT_ORIENTATIONS = new SparseIntArray();
protected final String FRAGMENT_DIALOG = "dialog";
protected Integer[] mExposureCompensation = {};
protected String mCameraId = "0";
protected float mFingerSpacing = 0f;
protected double mZoomLevel = 1;
protected int mCurrentProgress = 0;
protected int mSensorOrientation;
protected …Run Code Online (Sandbox Code Playgroud) 我想在使用外部鱼眼镜头时将我的自定义相机焦距设置为无限远,这是我迄今为止所做的:
builder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF);
builder.set(CaptureRequest.LENS_FOCUS_DISTANCE, 0.0f);
Run Code Online (Sandbox Code Playgroud)
但结果是如此模糊。
我使用的是三星 S6 和 Nexus 5。外置镜头的广角为 170 度。
任何人都可以帮忙吗?
我正在尝试从后台服务录制视频而不显示任何预览。就像这个例子,但试图用 Camera2 API 来做。
我正在尝试遵循android-Camera2Video 示例代码并尝试在服务中使用它。
我应该剪掉/忽略哪些部分 -TexttureViewer它是预览的部分吗?我不想预览任何我只想记录的东西。
我们正在构建一个相机应用,我们想使用手动曝光。我们不希望曝光算法设置ISO和曝光时间;取而代之的是,我们希望它告诉我们我们设置的手动曝光与根据算法得出的正确曝光之间的区别。这样,我们可以在计算中考虑到这一点。
iOS具有这样的API ExposureTargetOffset。Android camera2是否有这样的API?