我正在关注youtube教程,试图学习Camera2 API.当然,我正在学习这个,同时我正在开发自己的应用程序.教程和我的应用程序之间的一个不一致之处在于,只有当我的应用程序必须处于横向状态时,教程才能使相机处于纵向模式.
我目前能够查看相机的预览,但是当我的应用程序是横向或水平时,相机预览看起来旋转了90度.这几乎感觉我可以旋转TextureView,但这看起来似乎不正确,就像我拍照时一样,它会被错误地旋转.
下面是与图像大小有关的代码(整个代码很长)
private void setupCamera(int width, int height) {
CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
CameraCharacteristics cameraCharacteristics = cameraManager.getCameraCharacteristics(camera_id);
StreamConfigurationMap map = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
cameraCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);
mPreviewSize = getPreferredPreviewSize(map.getOutputSizes(SurfaceTexture.class), width, height);
mCameraId = camera_id;
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
//TODO Look for a way to make this horizontal
private Size getPreferredPreviewSize(Size[] mapSizes, int width, int height) {
List<Size> collectorSizes = new ArrayList<>();
for (Size option : mapSizes) {
if (width > height) { //If …Run Code Online (Sandbox Code Playgroud) 我遇到的问题是我使用ImageReader除了有一个SurfaceView用于显示相机的输出.我已经添加了SurfaceView本身和ImageReader的表面(并添加了ImageReader监听器以便在新图像上接收事件):
preview.addTarget(_surfaces.get(1)); //ImageReader surface
preview.addTarget(_surfaces.get(0)); //SurfaceView of the layout
Run Code Online (Sandbox Code Playgroud)
但是,如果我删除ImageReader,应用程序工作正常(没有滞后于相机).但是一旦ImageReader表面被添加,相机就会滞后很多.任何人都有任何想法,以使相机运行更顺畅?ImageReader的创建方式如下:
reader = ImageReader.newInstance(640, 480, ImageFormat.JPEG, 1);
Run Code Online (Sandbox Code Playgroud)
我猜测滞后可能是因为图像必须在布局的SurfaceView和ImageReader本身上呈现两次(?)
我正在尝试在相机应用中为白平衡和温度颜色设置自定义值.我正在使用camera2 API,我正在尝试不同的方法来设置此值.我从excel文件中找到了一个方法,从白平衡值到100到100.000之间获得正确的RGB温度矩阵[红色,绿色,蓝色].
我将此方法附加到Seekbar并且其工作正常,当我尝试将某些东西聚焦时,我的问题出现,然后它变成粉红色.屏幕上任何一种灯都像粉红色的火炬.
我正在以这种方式设置值:
mPreviewRequestBuilder.set(CaptureRequest.COLOR_CORRECTION_MODE, CaptureRequest.COLOR_CORRECTION_MODE_TRANSFORM_MATRIX);
RggbChannelVector rggb = getTemperatureVector(seekBackSelectedTemperature);
mPreviewRequestBuilder.set(CaptureRequest.COLOR_CORRECTION_GAINS, myRggbChannelVector);
Run Code Online (Sandbox Code Playgroud)
换句话说,我获取矩阵的方法是这样的:
public static RggbChannelVector getTemperatureVector (int WhiteBalanceValue){
float InsertTemperature = WhiteBalanceValue;
float temperature = InsertTemperature / 100;
float red;
float green;
float blue;
//Calculate red
if (temperature <= 66)
red = 255;
else {
red = temperature - 60;
red = (float) (329.698727446 * (Math.pow((double) red, -0.1332047592)));
if (red < 0)
red = 0;
if (red > 255)
red = 255;
}
//Calculate green
if (temperature <= 66) …Run Code Online (Sandbox Code Playgroud) 我的问题是当我在不同的闪存模式之间切换然后想要捕获图像时,我的captureBuilder将不会设置所选的闪存模式.它仅在我关闭并重新打开相机时才有效.
我以https://github.com/googlesamples/android-Camera2Basic为出发点.
我的方法:
private void captureStillPicture() {
try {
final Activity activity = (Activity) context;
if (null == activity || null == mCameraDevice) {
return;
}
// This is the CaptureRequest.Builder that we use to take a picture.
CaptureRequest.Builder captureBuilder =
mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
captureBuilder.addTarget(mImageReader.getSurface());
// Use the same AE and AF modes as the preview.
captureBuilder.set(CaptureRequest.CONTROL_AF_MODE,
CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
setCurrentFlash(captureBuilder);
// Orientation
int rotation = activity.getWindowManager()
.getDefaultDisplay()
.getRotation();
captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getOrientation(rotation));
CameraCaptureSession.CaptureCallback captureCallback =
new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureCompleted(@NonNull CameraCaptureSession …Run Code Online (Sandbox Code Playgroud) 我正在创建一个带有自定义相机的Android应用程序,我正在切换到新的camera2 API.我有一个按钮,可以在后置摄像头开启时打开和关闭闪光灯(不停止摄像头,就像任何经典的相机应用程序一样).
当我点击闪存图标时,没有任何反应,这就是logcat返回的内容:
D/ViewRootImpl: ViewPostImeInputStage processPointer 0
D/ViewRootImpl: ViewPostImeInputStage processPointer 1
Run Code Online (Sandbox Code Playgroud)
我不知道为什么它不起作用.这是代码:
我有一个RecordVideoActivity使用RecordVideoFragment.这是片段的XML部分,其中包含flash按钮代码:
<ImageButton
android:id="@+id/button_flash"
android:src="@drawable/ic_flash_off"
android:layout_alignParentLeft="true"
style="@style/actions_icons_camera"
android:onClick="actionFlash"/>
Run Code Online (Sandbox Code Playgroud)
和Java代码:
ImageButton flashButton;
private boolean hasFlash;
private boolean isFlashOn = false;
Run Code Online (Sandbox Code Playgroud)
随着onViewCreated:
@Override
public void onViewCreated(final View view, Bundle savedInstanceState) {
...
[some code]
...
// Flash on/off button
flashButton = (ImageButton) view.findViewById(R.id.button_flash);
// Listener for Flash on/off button
flashButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
actionFlash();
}
});
Run Code Online (Sandbox Code Playgroud)
这是actionFlash()函数定义:
private …Run Code Online (Sandbox Code Playgroud) 我想使用来打印当前秒handler。我精确地录制了视频,10 seconds并且想要设置TextView每秒的文本。
录制10秒的工作原理如下:
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
stopRecordingVideo();
}
}, 11000); // don't know why 11000 but it only works this way
Run Code Online (Sandbox Code Playgroud)
10秒钟后,该方法stopRecordingVideo()将执行。那么,如何每秒更改TextView的文本呢?
在我的 Android Camera2 API 项目中,我想为我的曝光计算设置一个区域。不幸的是它不起作用。另一方面,焦点区域工作没有任何问题。
设备:三星 S7 / Nexus 5
1.) CONTROL_AF_MODE & CONTROL_AE_MODE 的初始值
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_AUTO);
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
Run Code Online (Sandbox Code Playgroud)
2.) 创建 MeteringRectangle 列表
meteringFocusRectangleList = new MeteringRectangle[]{new MeteringRectangle(0,0,500,500,1000)};
Run Code Online (Sandbox Code Playgroud)
3.) 检查设备是否支持并设置 CONTROL_AE_REGIONS(与 CONTROL_AF_REGIONS 相同)
if (camera2SupportHandler.cameraCharacteristics.get(CameraCharacteristics.CONTROL_MAX_REGIONS_AE) > 0) {
camera2SupportHandler.mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_REGIONS, meteringFocusRectangleList);
}
Run Code Online (Sandbox Code Playgroud)
4.) 告诉相机开始曝光控制
camera2SupportHandler.mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, CameraMetadata.CONTROL_AE_PRECAPTURE_TRIGGER_START);
Run Code Online (Sandbox Code Playgroud)
CONTROL_AE_STATE 始终在 CONTROL_AE_STATE_SEARCHING 中,但不使用配置的区域...
我正在创建一个支持已弃用和新相机 API 的应用程序。第一个很有魅力,但我正在努力使用 Camera2 API。在测试阶段,我注意到了奇怪的行为。测试设备是带有 android 6.0.1 的三星 Galaxy S5 当我按下电源/结束键然后返回应用程序时,这就是我得到的(不是每次都发生):
03-12 16:14:32.704 24117-24117/pl.tripper.tripper E/MainActivity: onPause
03-12 16:14:32.774 24117-24128/pl.tripper.tripper E/BufferQueueProducer: [SurfaceTexture-1-24117-2] dequeueBuffer: BufferQueue has been abandoned
03-12 16:14:32.784 24117-24145/pl.tripper.tripper E/BufferQueueProducer: [SurfaceTexture-1-24117-2] queueBuffer: BufferQueue has been abandoned
03-12 16:14:33.044 24117-24128/pl.tripper.tripper E/BufferQueueProducer: [SurfaceTexture-1-24117-2] cancelBuffer: BufferQueue has been abandoned
03-12 16:14:33.044 24117-24145/pl.tripper.tripper E/BufferQueueProducer: [SurfaceTexture-1-24117-2] cancelBuffer: BufferQueue has been abandoned
03-12 16:14:33.054 24117-24129/pl.tripper.tripper E/BufferQueueProducer: [SurfaceTexture-1-24117-2] cancelBuffer: BufferQueue has been abandoned
03-12 16:14:33.054 24117-24128/pl.tripper.tripper E/BufferQueueProducer: [SurfaceTexture-1-24117-2] cancelBuffer: BufferQueue has been abandoned
03-12 16:14:33.264 24117-24117/pl.tripper.tripper E/CameraNewApi: …Run Code Online (Sandbox Code Playgroud) 由于这还没有明确的答案,并且stackoverflow还没有关于Camera 2 API Gamma的问题/答案,因此我寻求使用Android Camera 2 API修改亮度,对比度和Gamma的解决方案。
我的代码来获取范围和步骤:
Rational controlAECompensationStep = characteristics.get(CameraCharacteristics.CONTROL_AE_COMPENSATION_STEP);
if (controlAECompensationStep != null) {
compensationStep = controlAECompensationStep.doubleValue();
}
Range<Integer> controlAECompensationRange = characteristics.get(CameraCharacteristics.CONTROL_AE_COMPENSATION_RANGE);
if (controlAECompensationRange != null) {
minCompensationRange = controlAECompensationRange.getLower();
maxCompensationRange = controlAECompensationRange.getUpper();
}
Run Code Online (Sandbox Code Playgroud)
我的方法以百分比设置亮度:
public void setBrightness(int value) {
int brightness = (int) (minCompensationRange + (maxCompensationRange - minCompensationRange) * (value / 100f));
previewRequestBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, brightness);
applySettings();
}
private void applySettings() {
try {
captureSession.setRepeatingRequest(previewRequestBuilder.build(), null, …Run Code Online (Sandbox Code Playgroud) Android 最近宣布了原生Camera API ,根据他们的说法,它相当于 Java android.hardware.camera2类。我们什么时候应该考虑使用 NDK/C++ API?如果我们使用 C++ 代码,是否有任何性能改进——比如预处理帧?他们的原生 API 是否允许您插入可以作为 HAL3 管道一部分的代码,例如图像处理/计算机视觉代码?
android-camera2 ×10
android ×9
camera ×2
android-ndk ×1
camera-flash ×1
camera2 ×1
hal ×1
handler ×1
performance ×1
rgb ×1
surfaceview ×1
video ×1