@ -2,15 +2,29 @@ package net.ossrs.yasea;
import android.app.Activity ;
import android.content.Context ;
import android.content.pm.PackageManager ;
import android.content.res.Configuration ;
import android.graphics.ImageFormat ;
import android.graphics.SurfaceTexture ;
import android.hardware.Camera ;
import android.hardware.camera2.CameraAccessException ;
import android.hardware.camera2.CameraCaptureSession ;
import android.hardware.camera2.CameraCharacteristics ;
import android.hardware.camera2.CameraDevice ;
import android.hardware.camera2.CameraManager ;
import android.hardware.camera2.CameraMetadata ;
import android.hardware.camera2.CaptureRequest ;
import android.hardware.camera2.params.StreamConfigurationMap ;
import android.media.ImageReader ;
import android.opengl.GLES20 ;
import android.opengl.GLSurfaceView ;
import android.opengl.Matrix ;
import android.support.annotation.NonNull ;
import android.support.v4.app.ActivityCompat ;
import android.util.AttributeSet ;
import android.util.Log ;
import android.util.Range ;
import android.util.Size ;
import android.view.Surface ;
import com.seu.magicfilter.base.gpuimage.GPUImageFilter ;
@ -18,9 +32,10 @@ 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 ;
import java.util.Arrays ;
import java.util.List ;
import java.util.concurrent.ConcurrentLinkedQueue ;
@ -48,7 +63,6 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
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 ;
@ -59,6 +73,18 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
private ConcurrentLinkedQueue < IntBuffer > mGLIntBufferCache = new ConcurrentLinkedQueue < > ( ) ;
private PreviewCallback mPrevCb ;
private CameraCallbacksHandler cameraCallbacksHandler = new CameraCallbacksHandler ( ) ;
private CameraDevice mCameraDevice ; //摄像头设备
private Size imageDimension ;
private ImageReader imageReader ;
private CaptureRequest . Builder captureRequestBuilder ;
private CameraCaptureSession cameraCaptureSession ;
private CameraManager cameraManager ; //摄像头管理类
private String [ ] cameraNames ; //摄像头名称列表
private CameraItemData curItem ; //当前选中的摄像头参数
private ArrayList < CameraItemData > itemlist = new ArrayList < > ( ) ;
private float [ ] rotationMatrix = new float [ 16 ] ;
private float [ ] vPMatrix = new float [ 16 ] ;
;
public SrsCameraView ( Context context ) {
this ( context , null ) ;
@ -69,16 +95,24 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
setEGLContextClientVersion ( 2 ) ;
setRenderer ( this ) ;
setRenderMode ( GLSurfaceView . RENDERMODE_WHEN_DIRTY ) ;
setRenderMode ( GLSurfaceView . RENDERMODE_CONTINUOUSLY ) ;
initCameraData ( ) ;
}
@Override
public void onSurfaceCreated ( GL10 gl , EGLConfig config ) {
int cameraid = 0 ;
GLES20 . glDisable ( GL10 . GL_DITHER ) ;
GLES20 . glClearColor ( 0 , 0 , 0 , 0 ) ;
String id = curItem . getId ( ) ;
magicFilter = new GPUImageFilter ( MagicFilterType . NONE ) ;
magicFilter . init ( getContext ( ) . getApplicationContext ( ) ) ;
try {
cameraid = Integer . parseInt ( id ) ;
} catch ( Exception e ) {
cameraid = 0 ;
}
// magicFilter.setOrtation(cameraid);
magicFilter . init ( getContext ( ) . getApplicationContext ( ) , cameraid ) ;
magicFilter . onInputSizeChanged ( mPreviewWidth , mPreviewHeight ) ;
mOESTextureId = OpenGLUtils . getExternalOESTextureID ( ) ;
@ -89,15 +123,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
@ -107,7 +133,6 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
mSurfaceHeight = height ;
magicFilter . onDisplaySizeChanged ( width , height ) ;
magicFilter . onInputSizeChanged ( mPreviewWidth , mPreviewHeight ) ;
mOutputAspectRatio = width > height ? ( float ) width / height : ( float ) height / width ;
float aspectRatio = mOutputAspectRatio / mInputAspectRatio ;
if ( width > height ) {
@ -119,72 +144,104 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
@Override
public void onDrawFrame ( GL10 gl ) {
if ( mSurfaceWidth ! = mPreviewWidth | | mSurfaceHeight ! = mPreviewHeight ) {
//May be a buffer overflow in enableEncoding()
//mPreviewWidth changed but onSurfaceCreated fired after enable encoding (mIsEncoding == true)
//could be calling magicFilter.onInputSizeChanged(width, height) in setPreviewResolution() after changing mGLPreviewBuffer?
//or start the encoder only after onSurfaceCreated ...
if ( mSurfaceWidth ! = mPreviewWidth | | mSurfaceHeight ! = mPreviewHeight ) {
Log . e ( TAG , String . format ( "Surface dimensions differ from Preview. May be a buffer overflow. Surface: %dx%d, Preview: %dx%d " , mSurfaceWidth , mSurfaceHeight , mPreviewWidth , mPreviewHeight ) ) ;
return ;
}
//清除屏幕颜色缓冲区
GLES20 . glClearColor ( 0.0f , 0.0f , 0.0f , 0.0f ) ;
GLES20 . glClear ( GLES20 . GL_COLOR_BUFFER_BIT | GLES20 . GL_DEPTH_BUFFER_BIT ) ;
surfaceTexture . updateTexImage ( ) ;
surfaceTexture . getTransformMatrix ( mSurfaceMatrix ) ;
Matrix . multiplyMM ( mTransformMatrix , 0 , mSurfaceMatrix , 0 , mProjectionMatrix , 0 ) ;
magicFilter . setTextureTransformMatrix ( mTransformMatrix ) ;
magicFilter . onDrawFrame ( mOESTextureId ) ;
if ( mIsEncoding ) {
mGLIntBufferCache . add ( magicFilter . getGLFboBuffer ( ) ) ;
synchronized ( writeLock ) {
writeLock . notifyAll ( ) ;
}
}
}
public int computeRelativeRotation ( CameraCharacteristics characteristics , int surfaceRotationDegrees ) {
Integer sensorOrientationDegrees = characteristics . get ( CameraCharacteristics . SENSOR_ORIENTATION ) ;
// Reverse device orientation for back-facing cameras.
int sign = characteristics . get ( CameraCharacteristics . LENS_FACING ) = = CameraCharacteristics . LENS_FACING_FRONT ? 1 : - 1 ;
// Calculate desired orientation relative to camera orientation to make
// the image upright relative to the device orientation.
return ( sensorOrientationDegrees - surfaceRotationDegrees * sign + 360 ) % 360 ;
}
public void setPreviewCallback ( PreviewCallback cb ) {
mPrevCb = cb ;
}
public Camera getCamera ( ) {
return this . mCamera ;
//选择sizeMap中大于并且接近width和height的size
private Size getOptimalSize ( Size [ ] outputSizes , int width , int height ) {
Size tempSize = new Size ( width , height ) ;
List < Size > sizes = new ArrayList < > ( ) ;
for ( Size outputSize : outputSizes ) {
if ( width > height ) {
//横屏的时候
if ( outputSize . getHeight ( ) > height & & outputSize . getWidth ( ) > width ) {
sizes . add ( outputSize ) ;
}
} else {
//竖屏的时候
if ( outputSize . getWidth ( ) > height & & outputSize . getHeight ( ) > width ) {
sizes . add ( outputSize ) ;
}
}
}
if ( sizes . size ( ) > 0 ) {
//如果有多个符合条件找到一个差距最小的,最接近预览分辨率的
tempSize = sizes . get ( 0 ) ;
int minnum = 999999 ;
for ( Size size : sizes ) {
int num = size . getHeight ( ) * size . getHeight ( ) - width * height ;
if ( num < minnum ) {
minnum = num ;
tempSize = size ;
}
public void setPreviewCallback ( Camera . PreviewCallback previewCallback ) {
this . mCamera . setPreviewCallback ( previewCallback ) ;
}
}
return tempSize ;
/ * if ( sizes . size ( ) > 0 ) {
return Collections . min ( sizes , new Comparator < Size > ( ) {
@Override
public int compare ( Size size , Size t1 ) {
return Long . signum ( size . getWidth ( ) * size . getHeight ( ) - t1 . getWidth ( ) * t1 . getHeight ( ) ) ;
}
} ) ;
}
return outputSizes [ 0 ] ; * /
public int [ ] setPreviewResolution ( int width , int height ) {
mCamera = openCamera ( ) ;
}
public int [ ] setPreviewResolution ( int width , int height ) {
mPreviewWidth = width ;
mPreviewHeight = height ;
Camera . Size rs = adaptPreviewResolution ( mCamera . new Size ( width , height ) ) ;
if ( rs ! = null ) {
mPreviewWidth = rs . width ;
mPreviewHeight = rs . height ;
}
// Camera.Size rs = adaptPreviewResolution(mCamera.new Size(width, height));
// if (rs != null) {
// mPreviewWidth = rs.width;
// mPreviewHeight = rs.height;
// }
getHolder ( ) . setFixedSize ( mPreviewWidth , mPreviewHeight ) ;
mCamera . getParameters ( ) . setPreviewSize ( mPreviewWidth , mPreviewHeight ) ;
// mCamera.getParameters().setPreviewSize(mPreviewWidth, mPreviewHeight);
mGLPreviewBuffer = ByteBuffer . allocate ( mPreviewWidth * mPreviewHeight * 4 ) ;
mInputAspectRatio = mPreviewWidth > mPreviewHeight ?
( float ) mPreviewWidth / mPreviewHeight : ( float ) mPreviewHeight / mPreviewWidth ;
return new int [ ] { mPreviewWidth , mPreviewHeight } ;
mInputAspectRatio = mPreviewWidth > mPreviewHeight ? ( float ) mPreviewWidth / mPreviewHeight : ( float ) mPreviewHeight / mPreviewWidth ;
return new int [ ] { mPreviewWidth , mPreviewHeight } ;
}
public boolean setFilter ( final MagicFilterType type ) {
if ( mCamera = = null ) {
return false ;
}
public boolean setFilter ( final MagicFilterType type , final int cameraid ) {
queueEvent ( new Runnable ( ) {
@Override
@ -194,7 +251,7 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
}
magicFilter = MagicFilterFactory . initFilters ( type ) ;
if ( magicFilter ! = null ) {
magicFilter . init ( getContext ( ) . getApplicationContext ( ) );
magicFilter . init ( getContext ( ) . getApplicationContext ( ) , cameraid );
magicFilter . onInputSizeChanged ( mPreviewWidth , mPreviewHeight ) ;
magicFilter . onDisplaySizeChanged ( mSurfaceWidth , mSurfaceHeight ) ;
}
@ -209,16 +266,16 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
queueEvent ( new Runnable ( ) {
@Override
public void run ( ) {
GLES20 . glDeleteTextures ( 1 , new int [ ] { mOESTextureId } , 0 ) ;
GLES20 . glDeleteTextures ( 1 , new int [ ] { mOESTextureId } , 0 ) ;
mOESTextureId = OpenGLUtils . NO_TEXTURE ;
}
} ) ;
}
}
public void setCameraId ( int id ) {
public void setCameraId ( CameraItemData item ) {
stopTorch ( ) ;
mCamId = id ;
curItem = item ;
setPreviewOrientation ( mPreviewOrientation ) ;
}
@ -235,7 +292,7 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
case Surface . ROTATION_270 :
return 270 ;
}
} catch ( Exception e ) {
} catch ( Exception e ) {
e . printStackTrace ( ) ;
}
@ -244,31 +301,6 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
public void setPreviewOrientation ( 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 ;
}
}
public int getCameraId ( ) {
@ -285,7 +317,7 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
IntBuffer picture = mGLIntBufferCache . poll ( ) ;
mGLPreviewBuffer . asIntBuffer ( ) . put ( picture . array ( ) ) ;
mPrevCb . onGetRgbaFrame ( mGLPreviewBuffer . array ( ) , mPreviewWidth , mPreviewHeight ) ;
} catch ( Exception e ) {
} catch ( Exception e ) {
cameraCallbacksHandler . onError ( e ) ;
e . printStackTrace ( ) ;
worker . interrupt ( ) ;
@ -328,133 +360,170 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
}
}
public boolean startCamera ( ) {
if ( mCamera = = null ) {
mCamera = openCamera ( ) ;
if ( mCamera = = null ) {
return false ;
}
//相机状态变化时会调用这里的回调函数
private final CameraDevice . StateCallback stateCallback = new CameraDevice . StateCallback ( ) {
@Override
public void onOpened ( @NonNull CameraDevice camera ) {
//相机打开时执行
Log . e ( TAG , "onOpened" ) ;
mCameraDevice = camera ;
//创建相机预览会话
createCameraPreviewSession ( ) ;
}
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 ) ;
@Override
public void onDisconnected ( @NonNull CameraDevice camera ) {
//相机链接断开
Log . e ( "dsdsfd" , "fdsdf" ) ;
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 ) ) ;
}
@Override
public void onError ( @NonNull CameraDevice camera , int error ) {
Log . e ( "dsdsfd" , "fdsdf" ) ;
}
} ;
private void createCameraPreviewSession ( ) {
// SurfaceTexture surfaceTexture=new SurfaceTexture();
// assert surfaceTexture!=null;
//
surfaceTexture . setDefaultBufferSize ( imageDimension . getWidth ( ) , imageDimension . getHeight ( ) ) ;
//预览的输出画面
Surface surface = new Surface ( surfaceTexture ) ;
try {
//预览请求
captureRequestBuilder = mCameraDevice . createCaptureRequest ( CameraDevice . TEMPLATE_PREVIEW ) ;
captureRequestBuilder . addTarget ( surface ) ;
mCameraDevice . createCaptureSession ( Arrays . asList ( surface , imageReader . getSurface ( ) ) , new CameraCaptureSession . StateCallback ( ) {
@Override
public void onConfigured ( @NonNull CameraCaptureSession session ) {
if ( mCameraDevice = = null ) {
return ;
}
cameraCaptureSession = session ;
updatePreview ( ) ;
}
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 ) ;
@Override
public void onConfigureFailed ( @NonNull CameraCaptureSession session ) {
Log . e ( "dkkd" , "fdsa" ) ;
}
} else {
params . setFlashMode ( supportedFlashModes . get ( 0 ) ) ;
} , null ) ;
} catch ( CameraAccessException e ) {
throw new RuntimeException ( e ) ;
}
}
cameraCallbacksHandler . onCameraParameters ( params ) ;
mCamera . setParameters ( params ) ;
private void updatePreview ( ) {
captureRequestBuilder . set ( CaptureRequest . CONTROL_AF_MODE , CaptureRequest . CONTROL_AF_MODE_CONTINUOUS_PICTURE ) ;
CaptureRequest captureRequest = captureRequestBuilder . build ( ) ;
mCamera . setDisplayOrientation ( mPreviewRotation ) ;
try {
cameraCaptureSession . setRepeatingRequest ( captureRequest , null , null ) ;
} catch ( CameraAccessException e ) {
throw new RuntimeException ( e ) ;
}
}
public void startCamera ( ) {
try {
mCamera . setPreviewTexture ( surfaceTexture ) ;
} catch ( IOException e ) {
e . printStackTrace ( ) ;
if ( curItem = = null ) {
curItem = itemlist . get ( 0 ) ;
}
mCamera . startPreview ( ) ;
//通过cameraId获取Camera参数
String cameraId = curItem . getId ( ) ;
CameraCharacteristics characteristics = cameraManager . getCameraCharacteristics ( cameraId ) ;
StreamConfigurationMap map = characteristics . get ( CameraCharacteristics . SCALER_STREAM_CONFIGURATION_MAP ) ;
imageDimension = map . getOutputSizes ( SurfaceTexture . class ) [ 0 ] ;
imageReader = ImageReader . newInstance ( 640 , 480 , ImageFormat . JPEG , 10 ) ;
// imageReader.setOnImageAvailableListener(onImageAvailableListener,null);
if ( ActivityCompat . checkSelfPermission ( getContext ( ) , android . Manifest . permission . CAMERA ) ! = PackageManager . PERMISSION_GRANTED ) {
}
cameraManager . openCamera ( cameraId , stateCallback , null ) ;
return true ;
} catch ( CameraAccessException e ) {
throw new RuntimeException ( e ) ;
}
}
public void stopCamera ( ) {
disableEncoding ( ) ;
stopTorch ( ) ;
if ( mCamera ! = null ) {
mCamera . setPreviewCallback ( null ) ;
mCamera . stopPreview ( ) ;
mCamera . release ( ) ;
mCamera = null ;
}
}
protected Camera openCamera ( ) {
Camera camera = null ;
if ( mCamId < 0 ) {
Camera . CameraInfo info = new Camera . CameraInfo ( ) ;
int numCameras = Camera . getNumberOfCameras ( ) ;
int frontCamId = - 1 ;
int backCamId = - 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 ;
}
if ( cameraCaptureSession ! = null ) {
cameraCaptureSession . close ( ) ;
cameraCaptureSession = null ;
}
if ( frontCamId ! = - 1 ) {
mCamId = frontCamId ;
} else if ( backCamId ! = - 1 ) {
mCamId = backCamId ;
} else {
mCamId = 0 ;
if ( mCameraDevice ! = null ) {
mCameraDevice . close ( ) ;
mCameraDevice = null ;
}
}
public List < CameraItemData > initCameraData ( ) {
itemlist = new ArrayList ( ) ;
cameraManager = ( CameraManager ) getContext ( ) . getSystemService ( Context . CAMERA_SERVICE ) ; //获取摄像头管理类
try {
camera = Camera . open ( mCamId ) ;
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 ( ) ;
cameraNames = cameraManager . getCameraIdList ( ) ; //获取摄像头名称列表
} catch ( CameraAccessException e ) {
throw new RuntimeException ( e ) ;
}
} ) ;
} catch ( Exception e ) {
e . printStackTrace ( ) ;
for ( String cameraName : cameraNames ) {
CameraItemData itemData = new CameraItemData ( ) ;
itemData . setId ( cameraName ) ; //摄像头编号
CameraCharacteristics characteristics = null ;
try {
characteristics = cameraManager . getCameraCharacteristics ( cameraName ) ; //获取摄像头各种特性
} catch ( CameraAccessException e ) {
throw new RuntimeException ( e ) ;
}
int sensorOrientation = characteristics . get ( CameraCharacteristics . SENSOR_ORIENTATION ) ;
itemData . setSensorOrientation ( sensorOrientation ) ; //摄像头朝向
Range < Integer > [ ] ranges = characteristics . get ( CameraCharacteristics . CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES ) ;
itemData . setFPS_RANGES ( ranges ) ; //
Long aLong = characteristics . get ( CameraCharacteristics . SENSOR_INFO_MAX_FRAME_DURATION ) ;
itemData . setMAX_FRAME_DURATION ( aLong ) ;
return camera ;
int lensFacing = characteristics . get ( CameraCharacteristics . LENS_FACING ) ;
itemData . setLENS_FACING ( lensFacing ) ;
switch ( lensFacing ) {
case CameraMetadata . LENS_FACING_FRONT :
Log . e ( "lensFacing(前后摄):" , "front" ) ;
break ;
case CameraMetadata . LENS_FACING_BACK :
Log . e ( "lensFacing(前后摄):" , "back" ) ;
break ;
case CameraMetadata . LENS_FACING_EXTERNAL :
Log . e ( "lensFacing(前后摄):" , "external" ) ;
break ;
}
private Camera . Size adaptPreviewResolution ( Camera . Size resolution ) {
float diff = 100 f ;
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 ;
List < int [ ] > list = new ArrayList < > ( ) ;
Size [ ] supportedSizes = characteristics . get ( CameraCharacteristics . SCALER_STREAM_CONFIGURATION_MAP ) . getOutputSizes ( ImageFormat . YUV_420_888 ) ;
for ( Size size : supportedSizes ) {
int width = size . getWidth ( ) ;
int height = size . getHeight ( ) ;
// 在这里处理支持的分辨率格式
int [ ] temp = { width , height } ;
list . add ( temp ) ;
}
float tmp = Math . abs ( ( ( float ) size . width / ( float ) size . height ) - xdy ) ;
if ( tmp < diff ) {
diff = tmp ;
best = size ;
itemData . setSupportedSizes ( list ) ; //摄像头输出格式
itemlist . add ( itemData ) ;
}
return itemlist ;
}
return best ;
public List < CameraItemData > getCameraData ( ) {
return itemlist ;
}
private int [ ] adaptFpsRange ( int expectedFps , List < int [ ] > fpsRanges ) {
@ -472,40 +541,33 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
}
return closestRange ;
}
public void setOrtation ( int cameraid ) {
// magicFilter.setOrtation(cameraid);
// magicFilter.initTex();
// setFilter(MagicFilterType.NONE,cameraid);
magicFilter . initTExt ( cameraid ) ;
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 {
void onGetRgbaFrame ( byte [ ] data , int width , int height ) ;
}
static public class CameraCallbacksHandler implements CameraCallbacks {
static public class CameraCallbacksHandler implements CameraCallbacks {
@Override
public void onCameraParameters ( Camera . Parameters params ) {
@ -521,6 +583,7 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
public interface CameraCallbacks {
void onCameraParameters ( Camera . Parameters params ) ;
void onError ( Exception e ) ;
}