Camera2改写

camera2
liuguijing 8 months ago
parent b1190cd970
commit eaeab28829

@ -64,7 +64,7 @@ public class MainActivity extends AppCompatActivity implements RtmpHandler.RtmpL
private boolean isPermissionGranted = false;
private Handler mHandler;
private int cameraId;
private int cameraId = 0;
private List<CameraItemData> cameraData;
@Override
@ -148,7 +148,6 @@ public class MainActivity extends AppCompatActivity implements RtmpHandler.RtmpL
//设置图像显示方向
mCameraView.setPreviewOrientation(rotation);
}
cameraData = mCameraView.getCameraData();
int size = cameraData.size();
if (size == 0) {
@ -167,8 +166,7 @@ public class MainActivity extends AppCompatActivity implements RtmpHandler.RtmpL
mPublisher.setVideoHDMode();
if (intent.hasExtra("cameraId")) {
cameraId = intent.getIntExtra("cameraId", 0);
CameraItemData itemData = cameraData.get(cameraId);
mPublisher.switchCameraFace(itemData);
mPublisher.switchCameraFace(cameraId);
}
mPublisher.startCamera();
@ -252,8 +250,8 @@ public class MainActivity extends AppCompatActivity implements RtmpHandler.RtmpL
public void onClick(View v) {
int size = cameraData.size();
if (size > 0) {
int i = (cameraId++) % size;
mPublisher.switchCameraFace(cameraData.get(i));
int i = (++cameraId) % size;
mPublisher.switchCameraFace(i);
}
}
});

@ -14,10 +14,10 @@ buildscript {
}
allprojects {
repositories {
jcenter()
google()
}
// repositories {
// jcenter()
// google()
// }
}
task clean(type: Delete) {

@ -32,7 +32,6 @@ import com.seu.magicfilter.utils.MagicFilterFactory;
import com.seu.magicfilter.utils.MagicFilterType;
import com.seu.magicfilter.utils.OpenGLUtils;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.IntBuffer;
import java.util.ArrayList;
@ -63,8 +62,6 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
private float[] mProjectionMatrix = new float[16];
private float[] mSurfaceMatrix = new float[16];
private float[] mTransformMatrix = new float[16];
private Camera mCamera;
private ByteBuffer mGLPreviewBuffer;
private int mCamId = -1;
private int mPreviewRotation = 90;
@ -95,6 +92,7 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
setEGLContextClientVersion(2);
setRenderer(this);
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
initCameraData();
}
@Override
@ -114,15 +112,7 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
requestRender();
}
});
// For camera preview on activity creation
if (mCamera != null) {
try {
mCamera.setPreviewTexture(surfaceTexture);
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
@Override
@ -177,32 +167,6 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
mPrevCb = cb;
}
public Camera getCamera() {
return this.mCamera;
}
public void setPreviewCallback(Camera.PreviewCallback previewCallback) {
this.mCamera.setPreviewCallback(previewCallback);
}
//设置预览宽高
public int[] setPreviewResolution2(int width, int height) {
mPreviewWidth = width;
mPreviewHeight = height;
// try {
// String s = cameraManager.getCameraIdList()[1];
// CameraCharacteristics cameraCharacteristics = cameraManager.getCameraCharacteristics(s);
// //获取StreamConfigurationMap它是管理摄像头支持的所有输出格式和尺寸
// StreamConfigurationMap map = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
// //根据TextureView的尺寸设置预览尺寸
// Size mPreviewSize = getOptimalSize(map.getOutputSizes(SurfaceTexture.class), width, height);
// mPreviewWidth = mPreviewSize.getWidth();
// mPreviewHeight = mPreviewSize.getHeight();
return new int[]{mPreviewWidth, mPreviewHeight};
// } catch (CameraAccessException e) {
// throw new RuntimeException(e);
// }
}
//选择sizeMap中大于并且接近width和height的size
private Size getOptimalSize(Size[] outputSizes, int width, int height) {
@ -250,6 +214,7 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
public int[] setPreviewResolution(int width, int height) {
// mCamera = openCamera();
mPreviewWidth = width;
mPreviewHeight = height;
// Camera.Size rs = adaptPreviewResolution(mCamera.new Size(width, height));
@ -269,9 +234,6 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
}
public boolean setFilter(final MagicFilterType type) {
if (mCamera == null) {
return false;
}
queueEvent(new Runnable() {
@Override
@ -309,12 +271,6 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
setPreviewOrientation(mPreviewOrientation);
}
public void setCameraId2(int id) {
stopTorch();
mCamId = id;
setPreviewOrientation(mPreviewOrientation);
}
protected int getRotateDeg() {
try {
int rotate = ((Activity) getContext()).getWindowManager().getDefaultDisplay().getRotation();
@ -337,49 +293,7 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
public void setPreviewOrientation(int orientation) {
mPreviewOrientation = orientation;
try {
String s = cameraManager.getCameraIdList()[1];
CameraCharacteristics cameraCharacteristics = cameraManager.getCameraCharacteristics(s);
Integer integer = cameraCharacteristics.get(CameraCharacteristics.LENS_FACING);
if (integer == CameraCharacteristics.LENS_FACING_BACK) {
Log.e("yyy", "fds");
} else if (integer == CameraCharacteristics.LENS_FACING_BACK) {
Log.e("yyy", "fds");
} else {
Log.e("yyy", "fds");
}
} catch (CameraAccessException e) {
throw new RuntimeException(e);
}
}
public void setPreviewOrientation2(int orientation) {
mPreviewOrientation = orientation;
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(mCamId, info);
int rotateDeg = getRotateDeg();
if (orientation == Configuration.ORIENTATION_PORTRAIT) {
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
mPreviewRotation = info.orientation % 360;
mPreviewRotation = (360 - mPreviewRotation) % 360; // compensate the mirror
} else {
mPreviewRotation = (info.orientation + 360) % 360;
}
} else if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
mPreviewRotation = (info.orientation - 90) % 360;
mPreviewRotation = (360 - mPreviewRotation) % 360; // compensate the mirror
} else {
mPreviewRotation = (info.orientation + 90) % 360;
}
}
if (rotateDeg > 0) {
mPreviewRotation = mPreviewRotation % rotateDeg;
}
setRotation(180);
}
public int getCameraId() {
@ -467,10 +381,9 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
// SurfaceTexture surfaceTexture=new SurfaceTexture();
// assert surfaceTexture!=null;
//
// surfaceTexture.setDefaultBufferSize(imageDimension.getWidth(),imageDimension.getHeight());
surfaceTexture.setDefaultBufferSize(imageDimension.getWidth(), imageDimension.getHeight());
//预览的输出画面
Surface surface = new Surface(surfaceTexture);
try {
//预览请求
captureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
@ -514,8 +427,7 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
curItem = itemlist.get(0);
}
//通过cameraId获取Camera参数
// String cameraId = curItem.getId();
String cameraId = cameraManager.getCameraIdList()[1];
String cameraId = curItem.getId();
CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId);
StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
imageDimension = map.getOutputSizes(SurfaceTexture.class)[0];
@ -530,135 +442,20 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
}
}
public boolean startCamera2() {
// if (mCamera == null) {
// mCamera = openCamera();
// if (mCamera == null) {
// return false;
// }
// }
Camera.Parameters params = mCamera.getParameters();
//params.setPictureSize(mPreviewWidth, mPreviewHeight);
params.setPreviewSize(mPreviewWidth, mPreviewHeight);
int[] range = adaptFpsRange(SrsEncoder.VFPS, params.getSupportedPreviewFpsRange());
params.setPreviewFpsRange(range[0], range[1]);
params.setPreviewFormat(ImageFormat.NV21);
params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
params.setWhiteBalance(Camera.Parameters.WHITE_BALANCE_AUTO);
params.setSceneMode(Camera.Parameters.SCENE_MODE_AUTO);
params.setRecordingHint(true);
List<String> supportedFocusModes = params.getSupportedFocusModes();
if (supportedFocusModes != null && !supportedFocusModes.isEmpty()) {
if (supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {
params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
} else if (supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
mCamera.autoFocus(null);
} else {
params.setFocusMode(supportedFocusModes.get(0));
}
}
List<String> supportedFlashModes = params.getSupportedFlashModes();
if (supportedFlashModes != null && !supportedFlashModes.isEmpty()) {
if (supportedFlashModes.contains(Camera.Parameters.FLASH_MODE_TORCH)) {
if (mIsTorchOn) {
params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
}
} else {
params.setFlashMode(supportedFlashModes.get(0));
}
}
cameraCallbacksHandler.onCameraParameters(params);
mCamera.setParameters(params);
mCamera.setDisplayOrientation(mPreviewRotation);
try {
mCamera.setPreviewTexture(surfaceTexture);
} catch (IOException e) {
e.printStackTrace();
}
mCamera.startPreview();
return true;
}
public void stopCamera() {
disableEncoding();
stopTorch();
mCameraDevice.close();
if (cameraCaptureSession != null) {
cameraCaptureSession.close();
cameraCaptureSession = null;
}
public void stopCamera2() {
disableEncoding();
stopTorch();
if (mCamera != null) {
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}
protected Camera openCamera2() {
Camera camera = null;
if (mCamId < 0) {
Camera.CameraInfo info = new Camera.CameraInfo();
int numCameras = Camera.getNumberOfCameras();
int frontCamId = -1;
int backCamId = -1;
int otherCamId = -1;
for (int i = 0; i < numCameras; i++) {
Camera.getCameraInfo(i, info);
if (info.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
backCamId = i;
} else if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
frontCamId = i;
// break;
} else {
otherCamId = i;
}
}
if (frontCamId != -1) {
mCamId = frontCamId;
} else if (backCamId != -1) {
mCamId = backCamId;
} else {
mCamId = otherCamId;
}
}
try {
// if (mCamId == 0) {
// camera = Camera.open(2);
// } else {
camera.stopPreview();
camera.release();
camera = Camera.open();
// }
camera.setErrorCallback(new Camera.ErrorCallback() {
@Override
public void onError(int error, Camera camera) {
//may be Camera.CAMERA_ERROR_EVICTED - Camera was disconnected due to use by higher priority user
stopCamera();
}
});
} catch (Exception e) {
e.printStackTrace();
if (mCameraDevice != null) {
mCameraDevice.close();
mCameraDevice = null;
}
return camera;
}
public List<CameraItemData> getCameraData() {
public List<CameraItemData> initCameraData() {
itemlist = new ArrayList();
cameraManager = (CameraManager) getContext().getSystemService(Context.CAMERA_SERVICE);//获取摄像头管理类
try {
@ -717,21 +514,9 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
return itemlist;
}
private Camera.Size adaptPreviewResolution(Camera.Size resolution) {
float diff = 100f;
float xdy = (float) resolution.width / (float) resolution.height;
Camera.Size best = null;
for (Camera.Size size : mCamera.getParameters().getSupportedPreviewSizes()) {
if (size.equals(resolution)) {
return size;
}
float tmp = Math.abs(((float) size.width / (float) size.height) - xdy);
if (tmp < diff) {
diff = tmp;
best = size;
}
}
return best;
public List<CameraItemData> getCameraData() {
return itemlist;
}
private int[] adaptFpsRange(int expectedFps, List<int[]> fpsRanges) {
@ -750,31 +535,16 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
return closestRange;
}
public boolean startTorch() {
if (mCamera != null) {
Camera.Parameters params = mCamera.getParameters();
List<String> supportedFlashModes = params.getSupportedFlashModes();
if (supportedFlashModes != null && !supportedFlashModes.isEmpty()) {
if (supportedFlashModes.contains(Camera.Parameters.FLASH_MODE_TORCH)) {
params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
mCamera.setParameters(params);
return true;
}
}
}
return false;
}
public void stopTorch() {
if (mCamera != null) {
try {
Camera.Parameters params = mCamera.getParameters();
params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
mCamera.setParameters(params);
} catch (Exception e) {
e.printStackTrace();
}
}
// if (mCamera != null) {
// try {
// Camera.Parameters params = mCamera.getParameters();
// params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
// mCamera.setParameters(params);
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
}
public interface PreviewCallback {

@ -1,6 +1,5 @@
package net.ossrs.yasea;
import android.hardware.Camera;
import android.media.AudioRecord;
import android.media.audiofx.AcousticEchoCanceler;
import android.media.audiofx.AutomaticGainControl;
@ -9,6 +8,7 @@ import com.github.faucamp.simplertmp.RtmpHandler;
import com.seu.magicfilter.utils.MagicFilterType;
import java.io.File;
import java.util.List;
/**
* Created by Leo Ma on 2016/7/25.
@ -160,11 +160,13 @@ public class SrsPublisher {
stopCamera();
mEncoder.stop();
}
public void pauseEncode() {
stopAudio();
mCameraView.disableEncoding();
mCameraView.stopTorch();
}
private void resumeEncode() {
startAudio();
mCameraView.enableEncoding();
@ -177,6 +179,7 @@ public class SrsPublisher {
startEncode();
}
}
public void resumePublish() {
if (mFlvMuxer != null) {
mEncoder.resume();
@ -197,6 +200,7 @@ public class SrsPublisher {
pauseEncode();
}
}
public boolean startRecord(String recPath) {
return mMp4Muxer != null && mMp4Muxer.record(new File(recPath));
}
@ -258,9 +262,6 @@ public class SrsPublisher {
return mCameraView.getCameraId();
}
public Camera getCamera() {
return mCameraView.getCamera();
}
public void setPreviewResolution(int width, int height) {
int resolution[] = mCameraView.setPreviewResolution(width, height);
@ -308,7 +309,10 @@ public class SrsPublisher {
return mCameraView.setFilter(type);
}
public void switchCameraFace(CameraItemData item) {
public void switchCameraFace(int id) {
List<CameraItemData> cameraData = mCameraView.getCameraData();
CameraItemData item = cameraData.get(id);
if (mEncoder != null && mEncoder.isEnabled()) {
mEncoder.pause();
}

@ -1 +1,27 @@
pluginManagement {
repositories {
maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter' }
maven { url 'https://maven.aliyun.com/nexus/content/repositories/google' }
maven { url 'https://maven.aliyun.com/nexus/content/repositories/gradle-plugin' }
maven { url 'https://developer.huawei.com/repo/' }
maven { url "https://jitpack.io" }
google()
mavenCentral()
gradlePluginPortal()
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter' }
maven { url 'https://maven.aliyun.com/nexus/content/repositories/google' }
maven { url 'https://maven.aliyun.com/nexus/content/repositories/gradle-plugin' }
maven { url 'https://developer.huawei.com/repo/' }
maven { url "https://jitpack.io" }
google()
mavenCentral()
}
}
include ':app', ':library'

Loading…
Cancel
Save