Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于录制的Android Camera2 api不工作_Android_Video_Recording_Android Camera2 - Fatal编程技术网

用于录制的Android Camera2 api不工作

用于录制的Android Camera2 api不工作,android,video,recording,android-camera2,Android,Video,Recording,Android Camera2,我正在尝试使用Camera2 API录制视频。但对于丢失的曲面,会抛出一些异常。我反复检查了surface视图是否存在于XML中,并且也设置了所有权限。我试着使用Google Camera2代码,但无法理解所有的细节 public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback { CameraDevice mCamera; MediaRecorder mMediaRe

我正在尝试使用Camera2 API录制视频。但对于丢失的曲面,会抛出一些异常。我反复检查了surface视图是否存在于XML中,并且也设置了所有权限。我试着使用Google Camera2代码,但无法理解所有的细节

public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {

    CameraDevice mCamera;
    MediaRecorder mMediaRecorder = new MediaRecorder();
    CaptureRequest mCaptureRequest;
    CameraCaptureSession mSession;
    SurfaceView surfaceView;
    SurfaceHolder surfaceHolder;
    boolean recording = false;

    @Override
    protected void onStart() {
        super.onStart();

    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        surfaceView = (SurfaceView)findViewById(R.id.surfaceView);
        surfaceHolder = surfaceView.getHolder();
        surfaceHolder.addCallback(this);

        CameraManager manager = (CameraManager) getSystemService(CAMERA_SERVICE);

        File directory = Environment
                .getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
        String path = String.valueOf(directory);

        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        final File mediaFile;
        mediaFile = new File(directory + File.separator + timeStamp + ".mp4");

        try {
            String[] cameras = manager.getCameraIdList();
            CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameras[0]);
            StreamConfigurationMap configs = characteristics.get(
                    CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
            Size[] sizes = configs.getOutputSizes(MediaCodec.class);
            final Size sizeHigh = sizes[0];

            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                // TODO: Consider calling
                //    ActivityCompat#requestPermissions
                // here to request the missing permissions, and then overriding
                //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                //                                          int[] grantResults)
                // to handle the case where the user grants the permission. See the documentation
                // for ActivityCompat#requestPermissions for more details.
                return;
            }
            manager.openCamera(cameras[0], new CameraDevice.StateCallback() {
                @Override
                public void onOpened(CameraDevice camera) {
                    mCamera = camera;

                    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
                    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
                    mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
//                    mMediaRecorder.setVideoSize(sizeHigh.getWidth(), sizeHigh.getHeight());
//                    mMediaRecorder.setMaxFileSize(0);
//                    mMediaRecorder.setOrientationHint(0);

                    try {
                        mMediaRecorder.setOutputFile(mediaFile.toString());
                        mMediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());
                        mMediaRecorder.prepare();
                        List<Surface> list = new ArrayList<>();
                        list.add(surfaceHolder.getSurface());
                        final CaptureRequest.Builder captureRequest = mCamera.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
                        captureRequest.addTarget(surfaceHolder.getSurface());
                        mCaptureRequest = captureRequest.build();
                        mCamera.createCaptureSession(list, new CameraCaptureSession.StateCallback() {
                            @Override
                            public void onConfigured(CameraCaptureSession session) {
                                mSession = session;
                            }

                            @Override
                            public void onConfigureFailed(CameraCaptureSession session) {
                                mSession = session;
                            }
                        }, null);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

                @Override
                public void onDisconnected(CameraDevice camera) {

                }

                @Override
                public void onError(CameraDevice camera, int error) {

                }
            }, null);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }



    @Override
    public void surfaceCreated(SurfaceHolder surfaceHolder) {

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {

    }

    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {

    }

    public void trigger(View v) {


        ((Button)findViewById(R.id.button)).setText("stop");
        try {
            if(!recording) {
                mMediaRecorder.start();
                mSession.setRepeatingRequest(mCaptureRequest,
                        new CameraCaptureSession.CaptureCallback() {
                            @Override
                            public void onCaptureStarted(CameraCaptureSession session, CaptureRequest request, long timestamp, long frameNumber) {
                                super.onCaptureStarted(session, request, timestamp, frameNumber);
                            }

                            @Override
                            public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) {
                                super.onCaptureCompleted(session, request, result);
                            }
                        }, null);

                ((Button)findViewById(R.id.button)).setText("stop");
                recording = true;
            } else {
                ((Button)findViewById(R.id.button)).setText("start");
                recording = false;
                mSession.stopRepeating();
                mMediaRecorder.stop();
            }
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }

}


Exception Thrown

07-31 22:43:30.650 2852-2852/com.example.karan.camera I/System.out:      debugger has settled (1492)
07-31 22:43:30.972 2852-2852/com.example.karan.camera I/CameraManagerGlobal: Connecting to camera service
07-31 22:43:31.036 2852-2852/com.example.karan.camera I/CameraManager: Using legacy camera HAL.
07-31 22:43:31.170 2852-3618/com.example.karan.camera D/OpenGLRenderer: HWUI GL Pipeline
07-31 22:43:31.191 2852-2852/com.example.karan.camera E/MediaRecorderJNI: Application lost the surface
07-31 22:43:31.191 2852-2852/com.example.karan.camera W/System.err: java.io.IOException: invalid preview surface
07-31 22:43:31.193 2852-2852/com.example.karan.camera W/System.err:     at android.media.MediaRecorder._prepare(Native Method)
07-31 22:43:31.194 2852-2852/com.example.karan.camera W/System.err:     at android.media.MediaRecorder.prepare(MediaRecorder.java:930)
07-31 22:43:31.194 2852-2852/com.example.karan.camera W/System.err:     at com.example.karan.camera.MainActivity$1.onOpened(MainActivity.java:100)
07-31 22:43:31.195 2852-2852/com.example.karan.camera W/System.err:     at android.hardware.camera2.impl.CameraDeviceImpl$1.run(CameraDeviceImpl.java:139)
07-31 22:43:31.195 2852-2852/com.example.karan.camera W/System.err:     at android.os.Handler.handleCallback(Handler.java:769)
07-31 22:43:31.195 2852-2852/com.example.karan.camera W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:98)
07-31 22:43:31.195 2852-2852/com.example.karan.camera W/System.err:     at android.os.Looper.loop(Looper.java:164)
07-31 22:43:31.195 2852-2852/com.example.karan.camera W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6540)
07-31 22:43:31.196 2852-2852/com.example.karan.camera W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
07-31 22:43:31.196 2852-2852/com.example.karan.camera W/System.err:     at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
07-31 22:43:31.196 2852-2852/com.example.karan.camera W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
public类MainActivity扩展AppCompatActivity实现SurfaceHolder.Callback{
麦卡梅拉酒店;
MediaRecorder=新的MediaRecorder();
CaptureRequest mCaptureRequest;
CameraCaptureSession;
表面视图表面视图;
浮雕浮雕;
布尔记录=假;
@凌驾
受保护的void onStart(){
super.onStart();
}
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
surfaceView=(surfaceView)findViewById(R.id.surfaceView);
surfaceHolder=surfaceView.getHolder();
surfaceHolder.addCallback(this);
CameraManager=(CameraManager)getSystemService(CAMERA_服务);
文件目录=环境
.getExternalStoragePublicDirectory(Environment.DIRECTORY_下载);
String path=String.valueOf(目录);
字符串时间戳=新的SimpleDateFormat(“yyyyMMdd_HHmmss”)。格式(新日期();
最终文件mediaFile;
mediaFile=新文件(directory+File.separator+timeStamp+“.mp4”);
试一试{
String[]cameras=manager.getCameraIdList();
CameraCharacteristics characteristics=manager.getCameraCharacteristics(摄影机[0]);
StreamConfigurationMap configs=characteristics.get(
摄像机特性。定标器\流\配置\地图);
Size[]Size=configs.getOutputSizes(MediaCodec.class);
最终尺寸高=尺寸[0];
if(ActivityCompat.checkSelfPermission(this,Manifest.permission.CAMERA)!=PackageManager.permission\u已授予){
考虑到呼叫
//ActivityCompat#请求权限
//在此处请求缺少的权限,然后覆盖
//public void onRequestPermissionsResult(int-requestCode,字符串[]权限,
//int[]格兰特结果)
//处理用户授予权限的情况。请参阅文档
//对于ActivityCompat,请请求权限以获取更多详细信息。
返回;
}
manager.openCamera(cameras[0],新的camerradevice.StateCallback(){
@凌驾
打开公共空间(摄像头副摄像头){
mCamera=摄像机;
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
//mMediaRecorder.setVideoSize(sizeHigh.getWidth(),sizeHigh.getHeight());
//mMediaRecorder.setMaxFileSize(0);
//mMediaRecorder.setOrientationHint(0);
试一试{
mMediaRecorder.setOutputFile(mediaFile.toString());
mMediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());
mMediaRecorder.prepare();
列表=新的ArrayList();
添加(surfaceHolder.getSurface());
final CaptureRequest.Builder CaptureRequest=mCamera.createCaptureRequest(CameraDevice.TEMPLATE_记录);
addTarget(surfacehold.getSurface());
mCaptureRequest=captureRequest.build();
createCaptureSession(列表,新的CameraCaptureSession.StateCallback(){
@凌驾
未配置公共void(CameraCaptureSession会话){
mSession=会话;
}
@凌驾
配置文件的公共无效(CameraCaptureSession){
mSession=会话;
}
},空);
}捕获(例外e){
e、 printStackTrace();
}
}
@凌驾
已断开连接的公共空间(摄像头副摄像头){
}
@凌驾
公共无效onError(摄像头设备摄像头,int错误){
}
},空);
}捕获(例外e){
e、 printStackTrace();
}
}
@凌驾
已创建的公共空隙表面(表面层表面层){
}
@凌驾
公共空间表面已覆盖(表面层表面层){
}
@凌驾
公共无效表面更改(表面更改表面更改表面更改,int i,int i1,int i2){
}
公共无效触发器(视图五){
((按钮)findviewbyd(R.id.Button)).setText(“停止”);
试一试{
如果(!录制){
mMediaRecorder.start();
mSession.setRepeatingRequest(mCaptureRequest,
新建CameraCaptureSession.CaptureCallback(){
@凌驾
public void onCaptureStarted(CameraCaptureSession会话、CaptureRequest请求、长时间戳、长帧号){
super.onCaptureStarted(会话、请求、时间戳、帧号);
}
@凌驾
捕获完成后的公共void(CameraCaptureSession会话、CaptureRequest请求、TotalCaptureResu
        SurfaceTexture surfaceTexture = mTextureView.getSurfaceTexture();
        surfaceTexture.setDefaultBufferSize(mPreviewSize.getWidth(),mPreviewSize.getHeight());

        Surface previewSurfice = new Surface(surfaceTexture);
        Surface recordSurface = mMediaRecorder.getSurface();