Skip to content

Commit bcdec34

Browse files
author
k
committed
从SurfaceView更换成TextureView
固定布局只能为正方形,否则会产生覆盖层偏移 TODO 1. 代码优化 2. 将旋转角度放到gl脚本中 3. 不再固定bu布局为正方形
1 parent f2fb307 commit bcdec34

File tree

5 files changed

+311
-186
lines changed

5 files changed

+311
-186
lines changed

app/src/main/java/com/hyq/hm/test/greenscreen/Camera2SurfaceView.java

Lines changed: 62 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,11 @@
88
import android.graphics.BitmapFactory;
99
import android.graphics.Canvas;
1010
import android.graphics.Color;
11+
import android.graphics.ImageFormat;
12+
import android.graphics.Matrix;
1113
import android.graphics.PixelFormat;
1214
import android.graphics.Rect;
15+
import android.graphics.RectF;
1316
import android.graphics.SurfaceTexture;
1417
import android.hardware.camera2.CameraAccessException;
1518
import android.hardware.camera2.CameraCaptureSession;
@@ -18,13 +21,15 @@
1821
import android.hardware.camera2.CameraManager;
1922
import android.hardware.camera2.CaptureRequest;
2023
import android.hardware.camera2.params.StreamConfigurationMap;
24+
import android.media.ImageReader;
2125
import android.opengl.GLES20;
2226
import android.opengl.GLSurfaceView;
2327
import android.os.Handler;
2428
import android.os.HandlerThread;
2529
import android.util.AttributeSet;
2630
import android.util.Log;
2731
import android.util.Size;
32+
import android.view.Surface;
2833
import android.view.SurfaceHolder;
2934
import android.view.SurfaceView;
3035
import android.view.ViewGroup;
@@ -55,8 +60,11 @@ public class Camera2SurfaceView extends SurfaceView {
5560
private CameraManager mCameraManager;
5661
private CameraCaptureSession mCameraCaptureSession;
5762
private CameraDevice mCameraDevice;
63+
private CameraCharacteristics characteristics;
5864
private Handler mHandler;
5965

66+
private int orientation;
67+
6068
private Runnable _runnable = new SurfaceRunnable();
6169
private Runnable _stoppable = new SurfaceStoppable();
6270

@@ -95,11 +103,35 @@ protected void onAttachedToWindow() {
95103
super.onAttachedToWindow();
96104
}
97105

106+
@Override
107+
protected void onDraw(Canvas canvas) {
108+
super.onDraw(canvas);
109+
canvas = getHolder().lockCanvas();
110+
// Matrix matrix = new Matrix();
111+
// RectF viewRect = new RectF(0, 0, screenWidth, screenHeight);
112+
// RectF bufferRect = new RectF(0, 0, previewHeight, previewWidth);
113+
// float centerX = viewRect.centerX();
114+
// float centerY = viewRect.centerY();
115+
// bufferRect.offset(centerX - bufferRect.centerX(), centerY - bufferRect.centerY());
116+
// matrix.setRectToRect(viewRect, bufferRect, Matrix.ScaleToFit.FILL);
117+
// matrix.postRotate(90 * (Surface.ROTATION_90 - 2), centerX, centerY);
118+
canvas.rotate(90f);
119+
getHolder().unlockCanvasAndPost(canvas);
120+
}
121+
98122
public void init(Bitmap bitmap) {
99123
this.bitmap = bitmap;
100124
init();
101125
}
102126

127+
public void stop() {
128+
if (mCameraDevice != null)
129+
{
130+
mCameraCaptureSession.close();
131+
mCameraDevice.close();
132+
}
133+
}
134+
103135
private void init(){
104136
cameraThread = new HandlerThread("Camera2Thread");
105137
cameraThread.start();
@@ -188,8 +220,9 @@ private void initCamera2() {
188220
assert mCameraManager != null;
189221
String[] CameraIdList = mCameraManager.getCameraIdList();
190222
mCameraId = CameraIdList[0];
191-
CameraCharacteristics characteristics = mCameraManager.getCameraCharacteristics(mCameraId);
223+
characteristics = mCameraManager.getCameraCharacteristics(mCameraId);
192224
characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);
225+
orientation = getContext().getResources().getConfiguration().orientation;
193226
StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
194227
if(map != null){
195228
mSizes = map.getOutputSizes(SurfaceTexture.class);
@@ -232,14 +265,22 @@ public void onError(@NonNull CameraDevice cameraDevice, int i) {
232265
private void takePreview() {
233266
try {
234267
final CaptureRequest.Builder builder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
235-
builder.addTarget(videoRenderer.getSurface());
236-
mCameraDevice.createCaptureSession(Collections.singletonList(videoRenderer.getSurface()), new CameraCaptureSession.StateCallback() {
268+
Surface surface = videoRenderer.getSurface();
269+
// Surface surface = this.getHolder().getSurface();
270+
ImageReader imageReader = ImageReader.newInstance(previewWidth, previewHeight, ImageFormat.JPEG,1);
271+
builder.addTarget(surface);
272+
ArrayList<Surface> surfaceArrayList = new ArrayList<>();
273+
surfaceArrayList.add(surface);
274+
surfaceArrayList.add(imageReader.getSurface());
275+
mCameraDevice.createCaptureSession(surfaceArrayList, new CameraCaptureSession.StateCallback() {
237276
@Override
238277
public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
239278
if (null == mCameraDevice) return;
240279
mCameraCaptureSession = cameraCaptureSession;
241280
builder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
242281
builder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
282+
// builder.set(CaptureRequest.JPEG_ORIENTATION, getJpegOrientation(characteristics, orientation));
283+
builder.set(CaptureRequest.JPEG_ORIENTATION, Surface.ROTATION_180);
243284
CaptureRequest previewRequest = builder.build();
244285
try {
245286
mCameraCaptureSession.setRepeatingRequest(previewRequest, null, mHandler);
@@ -379,6 +420,24 @@ private void drawNonAffine(float bottomLeftX, float bottomLeftY, float bottomRig
379420
}
380421
}
381422

423+
private int getJpegOrientation(CameraCharacteristics c, int deviceOrientation) {
424+
if (deviceOrientation == android.view.OrientationEventListener.ORIENTATION_UNKNOWN) return 0;
425+
int sensorOrientation = c.get(CameraCharacteristics.SENSOR_ORIENTATION);
426+
427+
// Round device orientation to a multiple of 90
428+
deviceOrientation = (deviceOrientation + 45) / 90 * 90;
429+
430+
// Reverse device orientation for front-facing cameras
431+
boolean facingFront = c.get(CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_FRONT;
432+
if (facingFront) deviceOrientation = -deviceOrientation;
433+
434+
// Calculate desired JPEG orientation relative to camera orientation to make
435+
// the image upright relative to the device orientation
436+
int jpegOrientation = (sensorOrientation + deviceOrientation + 360) % 360;
437+
438+
return jpegOrientation;
439+
}
440+
382441
private class SurfaceRunnable implements Runnable {
383442
@Override
384443
public void run() {

0 commit comments

Comments
 (0)