Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.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中使用GLSurfaceview进行视频录制_Android_Android Camera_Android Mediarecorder_Glsurfaceview - Fatal编程技术网

在android中使用GLSurfaceview进行视频录制

在android中使用GLSurfaceview进行视频录制,android,android-camera,android-mediarecorder,glsurfaceview,Android,Android Camera,Android Mediarecorder,Glsurfaceview,我正在尝试在android中使用GLSURFACHEVIEW录制视频。但每次我点击录制时,它都会在暂停时给我空指针异常 这是我录制视频的代码 mCamera = new CameraLoader(); buttonn_capture.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) {

我正在尝试在android中使用GLSURFACHEVIEW录制视频。但每次我点击录制时,它都会在暂停时给我空指针异常

这是我录制视频的代码

mCamera = new CameraLoader();
    buttonn_capture.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {

                    try{

                        if (recording) {

                            mediaRecorder.stop(); // stop the recording

                            recording = false;
                        } else {

                            // Release Camera before MediaRecorder start
                            mCamera.releaseCamera();

                            if (!prepareMediaRecorder()) {

                                finish();
                            }

                            try {
                                mediaRecorder.prepare();
                            } catch (IllegalStateException | IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                            mediaRecorder.start();
                            recording = true;
                            // myButton.setText("Cancel");
                        }
                    }catch(Exception ex){
                        Toast.makeText(getApplicationContext(), "Please tap and hold to record!",
                                Toast.LENGTH_LONG).show();
                        reload();
                    }
                }
            });

private boolean prepareMediaRecorder() {

        mCamera.mCameraInstance.unlock();
        mediaRecorder.setCamera(mCamera.mCameraInstance);
        // Step 2: Set sources

        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
        mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);


        mediaStorageDir = new File(
                Environment
                        .getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES),
                "MusicDubs");

        // Create the storage directory if it does not exist
        if (!mediaStorageDir.exists()) {
            mediaStorageDir.mkdirs();

        }

        timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault())
                .format(new Date());

        CameraInfo caminfo = new CameraInfo();
        mCamera.mCameraInstance.getCameraInfo(0, caminfo);
        if (caminfo.facing == CameraInfo.CAMERA_FACING_FRONT) {

            mediaRecorder.setProfile(CamcorderProfile.get(0,
                    CamcorderProfile.QUALITY_HIGH));
            mediaRecorder
                    .setOrientationHint(270);

        } else if (caminfo.facing == CameraInfo.CAMERA_FACING_BACK) {
            mediaRecorder.setProfile(CamcorderProfile.get(0,
                    CamcorderProfile.QUALITY_HIGH));
            mediaRecorder
                    .setOrientationHint(270);
            mediaRecorder.setOrientationHint(90);

        }
        //mediaRecorder.setCaptureRate(20);
        mediaRecorder.setVideoFrameRate(120);
        mediaRecorder.setOutputFile(mediaStorageDir.getPath() + "/"
                + "_" + timeStamp + ".mp4");

        // Step 5: Set the preview output
        mediaRecorder.setPreviewDisplay(glSurfaceView.getHolder()
                .getSurface());

        try {
            mediaRecorder.prepare();
        } catch (IllegalStateException e) {
            releaseMediaRecorder();
           // releaseMediaPlayer();
            return false;
        } catch (IOException e) {
            releaseMediaRecorder();
           // releaseMediaPlayer();
            return false;
        }
        return true;

    }
private void releaseMediaRecorder() {
        if (mediaRecorder != null) {
            mediaRecorder.reset(); // clear recorder configuration
            mediaRecorder.release(); // release the recorder object
            mediaRecorder = null;
            mCamera.mCameraInstance.lock(); // lock camera for later use
        }
    }
在活动暂停和恢复时,我添加了该代码

@Override
    protected void onResume() {
        super.onResume();
        mCamera.onResume();
    }
@Override
    protected void onPause() {
        mCamera.onPause();
        super.onPause();
    }
这里是我的相机类加载相机

private class CameraLoader {

    private int mCurrentCameraId = 0;
    private Camera mCameraInstance;

    public void onResume() {
        setUpCamera(mCurrentCameraId);
    }

    public void onPause() {
        releaseCamera();
    }

    public void switchCamera() {
        releaseCamera();
        mCurrentCameraId = (mCurrentCameraId + 1) % mCameraHelper.getNumberOfCameras();
        setUpCamera(mCurrentCameraId);
    }

    private void setUpCamera(final int id) {
        mCameraInstance = getCameraInstance(id);
        Parameters parameters = mCameraInstance.getParameters();
        // TODO adjust by getting supportedPreviewSizes and then choosing
        // the best one for screen size (best fill screen)
        if (parameters.getSupportedFocusModes().contains(
                Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) {
            parameters.setFocusMode(Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
        }
        mCameraInstance.setParameters(parameters);

        int orientation = mCameraHelper.getCameraDisplayOrientation(
                ActivityCamera.this, mCurrentCameraId);
        CameraInfo2 cameraInfo = new CameraInfo2();
        mCameraHelper.getCameraInfo(mCurrentCameraId, cameraInfo);
        boolean flipHorizontal = cameraInfo.facing == CameraInfo.CAMERA_FACING_FRONT;
        mGPUImage.setUpCamera(mCameraInstance, orientation, flipHorizontal, false);
    }

    /** A safe way to get an instance of the Camera object. */
    private Camera getCameraInstance(final int id) {
        Camera c = null;
        try {
            c = mCameraHelper.openCamera(id);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return c;
    }

    private void releaseCamera() {
        mCameraInstance.setPreviewCallback(null);
        mCameraInstance.release();
        mCameraInstance = null;
    }
}

它的行为非常奇怪,我不明白为什么它会在暂停时给我空指针异常,因为在那里没有让相机空的意义。请告诉我哪里做错了。任何帮助都将不胜感激。谢谢:)

有人可以帮忙吗?
onPause()
,在您的活动中还是在CameraLoader中?哪一条线路出故障了?何时初始化mCamera?mCamera已初始化。活动的OnPause失败,类的OnPause()也失败,因为它正在调用该方法。是否有人可以提供帮助?是活动中的OnPause(),还是CameraLoader中的OnPause()?哪一条线路出故障了?何时初始化mCamera?mCamera已初始化。活动的OnPause失败,类的OnPause()也失败,因为它正在调用该方法。