我正在编写一个应用程序,相机是一个必不可少的功能.在这方面,我希望100%确定以下几个方面:
在任何情况下,使用设备的相机并使其在几乎所有目标设备上运行都是非常棘手的(因为现在我很高兴掌握了"旧"相机......).因此,我真的想确定以上几点.非常感谢你的回答.
我正在测试新的Android camera2 API,我希望从相机控制每一帧.我为此做的是创建一个ImageReader并设置分辨率和图像格式.
ImageReader imageReader = ImageReader.newInstance(1280,720,ImageFormat.YUV_420_888,1);
imageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
Image image = reader.acquireLatestImage();
Log.i(MainActivity.LOG_TAG,"imageReader: "+System.currentTimeMillis());
image.close();
}
},null);
Run Code Online (Sandbox Code Playgroud)
之后,我使用参数TEMPLATE_PREVIEW创建新的CaptureRequest并向他添加目标.对于cameraCaptureSession,我使用此请求创建新的setRepeatingRequestimageReader
try {
final CaptureRequest.Builder builder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
builder.addTarget(imageReader.getSurface());
mCameraDevice.createCaptureSession(
Arrays.asList(imageReader.getSurface()),
new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(CameraCaptureSession session) {
mSession = session;
try {
mSession.setRepeatingRequest(builder.build(),null,null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(CameraCaptureSession session) {
}
},
null
);
} …
Run Code Online (Sandbox Code Playgroud) 您好无法解决此问题.
我已经在ImageAvailable回调中调用了imageReader.close,但仍然有错误:
java.lang.IllegalStateException:已经获取了maxImages(1),在获取更多之前调用#close.
我的代码在这里:
private ImageReader.OnImageAvailableListener imageAvailableListener = new ImageReader.OnImageAvailableListener()
{
@Override
public void onImageAvailable(ImageReader reader) {
Image img = mReader.acquireLatestImage();
mReader.close();
}
};
Run Code Online (Sandbox Code Playgroud)
PS.我也使用参数阅读器,但似乎没有解决问题
我们希望使用Neon汇编或GPU着色器处理120 fps(或60fps)相机预览数据,以执行简单的图像处理操作(例如3x3卷积).我们对在屏幕上显示图像不感兴趣,因此相机数据应该直接转到SurfaceTexture.
我们认为我们可以使用CameraConstrainedHighSpeedCaptureSession在Nexus 5上使用Camera2 API执行此操作但是未成功.
互联网上目前没有功能代码(至少我们已经删除过的部分)允许这样做,但似乎可能存在功能.
使用Camera2 API进行高速录制的最佳示例如下:https://github.com/PkmX/lcamera
为了鼓励某人发布解决方案,我正在对这个问题给予赏金.
我正在使用新的camera2 API构建自定义相机.我的代码是基于谷歌提供的代码示例在这里.
我无法找到一种方法来全屏显示相机.在代码示例中,他们使用比率优化来适应所有屏幕,但它只占屏幕高度的3/4左右.
这是我的代码AutoFitTextureView
:
public class AutoFitTextureView extends TextureView {
private int mRatioWidth = 0;
private int mRatioHeight = 0;
public AutoFitTextureView(Context context) {
this(context, null);
}
public AutoFitTextureView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public AutoFitTextureView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
/**
* Sets the aspect ratio for this view. The size of the view will be measured based on the ratio
* calculated from the parameters. Note …
Run Code Online (Sandbox Code Playgroud) 我正试图用我的xiaomi mi 5s plus上的两个后置摄像头捕捉.当我试图使用camera2 api迭代摄像机的id时,我只得到2个id,一个用于前置摄像头,一个用于后置摄像头.我查看了lg开发示例(http://mobile.developer.lge.com/develop/sdks/lg-dual-camera/),他们使用了3个ID.运行他们的示例时,应用程序崩溃了.
用于获取ID的代码是:
CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
for(String id: manager.getCameraIdList())
Log.e("test", id);
Run Code Online (Sandbox Code Playgroud) 我正在寻找android中camera2手动对焦的一个例子.我试图获得下面显示的最小焦距和可用焦距,但它没有帮助.如何控制焦距?
float minimumLens = characteristics.get(CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE);
float[] lensDistances = characteristics.get(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS);
Run Code Online (Sandbox Code Playgroud)
我需要用seekbar来控制它.提前致谢.
有一些官方支持高fps录音的手机,如Galaxy S5和S6.我试过这两个,你可以用默认的相机应用程序录制高fps视频(60甚至120 fps).(或者在S6上使用Gear VR的"直通相机"功能.)但是:当您通过标准Android API查询相机的功能时(在4.4和5.0上的S5以及5.1上的S6上尝试过它,尝试了旧的和新的所有情况下,30 fps被报告为最高可用率.这是否意味着这些手机使用私有专有API来访问高fps功能,而且没有标准方法可以访问更高的fps?这是制造商的缺点(可能会随着未来的软件版本或手机而改变)或者我只是遗漏了什么?我甚至不需要慢动作,只需高帧率相机即可实时使用,所以60 fps就足够了.
我尝试在旧相机API中查询相机fps的示例;
List<Camera.Size> a = camera.getParameters().getSupportedPreviewSizes();
List<int[]> b = camera.getParameters().getSupportedPreviewFpsRange();
int[] c = new int[2];
camera.getParameters().getPreviewFpsRange(c);
Run Code Online (Sandbox Code Playgroud)
在camera2 API中相同:
CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
String[] cameras = manager.getCameraIdList();
for(String camera : cameras) {
CameraCharacteristics cc = manager.getCameraCharacteristics(camera);
Range<Integer>[] fpsRange = cc.get(cc.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
}
Run Code Online (Sandbox Code Playgroud)
我只得到范围:[15,15],[24,24],[10,30],[15,30],[30,30](使用旧相机API的范围更小).
在camera2 API中,我找到了一些访问高fps摄像头录制的方法:createConstrainedHighSpeedCaptureSession().但它将高速视频录制定义为"帧速率> = 120fps",因此我甚至不需要60 fps.无论如何,我查询了这个功能,但似乎S6不支持它.我试过的代码:
CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
String[] cameras = manager.getCameraIdList();
for(String camera : cameras) {
CameraCharacteristics cc = manager.getCameraCharacteristics(camera);
CameraCharacteristics.Key<int[]> aa = cc.REQUEST_AVAILABLE_CAPABILITIES;
for (int i …
Run Code Online (Sandbox Code Playgroud) 我正在创建一个使用新camera2 API捕获视频的自定义相机.
我的代码强力地由谷歌提供的代码启发在这里.我的相机预览有一个按钮,可以从后摄像头切换到前摄像头,然后从前摄像头切换到后摄像头.默认情况下,使用后置摄像头启动"摄像头预览"活动.
出于某种原因,当我第一次点击"开关/交换相机"按钮时,它会带来前面的相机,但是每次我再次点击时,开关/交换都不再起作用了:预览(在前置摄像头上)稍微褪色,就像发生了什么事情一样,但它仍然保留在当前选择的(前置)摄像头上.
这是我的代码:
在a中RecordVideoFragment
,在onViewCreated
:
// Switch camera button
switchCameraButton = (ImageButton) view.findViewById(R.id.button_switch_camera);
// Listener for Switch cameras button
switchCameraButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
switchCameras();
}
});
Run Code Online (Sandbox Code Playgroud)
这是switchCameras()
功能:
private void switchCameras() {
mCameraOpenCloseLock.release();
mCameraDevice.close();
CameraManager mCameraManager = (CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE);
try {
String mCameraId = mCameraManager.getCameraIdList()[0];
if (mCameraId.equals("0")) { // If currently on FRONT camera (0 = CameraCharacteristics.LENS_FACING_FRONT)
mCameraId = "1"; // switch to BACK camera …
Run Code Online (Sandbox Code Playgroud) 我试图在我的应用程序中以30秒的曝光时间捕获图像(我知道这可能是因为相机允许它).
但是SENSOR_INFO_EXPOSURE_TIME_RANGE(它应该是以纳秒为单位)给出了我的范围:
13272 - 869661901
Run Code Online (Sandbox Code Playgroud)
它会在几秒钟内完成
0.000013272 - 0.869661901
Run Code Online (Sandbox Code Playgroud)
这显然不到一秒钟.
如何使用更长的曝光时间?
提前致谢!.