Java 使用媒体录制器android进行视频录制时无法缩放

Java 使用媒体录制器android进行视频录制时无法缩放,java,android,surfaceview,mediarecorder,Java,Android,Surfaceview,Mediarecorder,我想在android中录制视频时实现缩放功能。但是,我无法在主活动和surface类中访问Camera参数或CamerastartSmoothZoom()方法。如果在媒体录制器方法(prepareMediaRecorder())中访问摄像头参数,它将引发空指针异常 此活动类-在prepareMediaRecorder()方法中无法访问相机参数,也无法设置startSmoothZoom()。此处摄影机对象出现空指针异常 public class CustomCameraPreview

我想在android中录制视频时实现缩放功能。但是,我无法在主活动和surface类中访问Camera参数或CamerastartSmoothZoom()方法。如果在媒体录制器方法(prepareMediaRecorder())中访问摄像头参数,它将引发空指针异常

此活动类-在prepareMediaRecorder()方法中无法访问相机参数,也无法设置startSmoothZoom()。此处摄影机对象出现空指针异常

      public class CustomCameraPreview extends BaseActivity implements
                                OnClickListener, AlertPositiveListener, OrientationListener, 
                               ActivityCompat.OnRequestPermissionsResultCallback { 

                     RelativeLayout mLayout;
                    MediaRecorder mediaRecorder;
                      private PictureCallback mPictureCallback = new PictureCallback() {

                @Override
                public void onPictureTaken(byte[] data, Camera camera) {
                    try {
                        cameraData = data;
                        captureAngle = getRotation();
                        mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
                    }
                    catch (OutOfMemoryError e){
                        System.gc();
                        mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
                    }
                    // int rotation=getRotation();

                    Matrix matrix = new Matrix();
                    matrix.postRotate(getRotation());
                    /*mBitmap = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(),
                            mBitmap.getHeight(), matrix, true);*/

                    mBitmap = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(),
                            mBitmap.getHeight(), matrix, false);
                    if (mBitmap != null) {
                        mButtonRetake.setEnabled(true);
                    } else {
                        Message.displayToast(CustomCameraPreview.this,
                                getString(R.string.picture_not_taken));
                    }
                    mCamera.release();
                    mButtonCapture.setEnabled(false);

                }


            };


              protected void onCreate(){
                  initiCameraForVideo();
               }

              private void initiCameraForVideo() {
          params = mCamera.getParameters();

                    mButtonCapture.setBackgroundResource(R.drawable.videostart);

                    mShowCamera = new CameraSurfaceHolder(CustomCameraPreview.this,
                            mCamera);
                    mLayout = (RelativeLayout) findViewById(R.id.relativeLayout);
                    mLayout.removeAllViews();
                    mLayout.addView(mShowCamera);
                   List<Camera.Size> mSizeList_Video = null;// params.getSupportedPreviewSizes();

                    if (params.getSupportedVideoSizes() != null) {
                        mSizeList_Video = params.getSupportedVideoSizes();
                    } else {
                        // Video sizes may be null, which indicates that all the
                        // supported preview sizes are supported for video
                        // recording.
                        mSizeList_Video = mCamera.getParameters()
                                .getSupportedPreviewSizes();
                    }
              }

        @Override
        public void onClick(View v) {
            int viewId = v.getId();
            switch (viewId) {
                case R.id.button_Capture: 
                 releaseCamera();
                            if (!prepareMediaRecorder()) {
                                Message.displayToast(
                                        CustomCameraPreview.this,
                                        getString(R.string.somethign_went_wrong));
                            } else {
                                mediaRecorder.start();
                                recording = true;
                            }
         }

         private boolean prepareMediaRecorder() \*method to setup media player to record video
         {
        mCamera = isCameraAvailable();

        mediaRecorder = new MediaRecorder();

        mCamera.unlock();
        mediaRecorder.setCamera(mCamera);

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

        if(CamcorderProfile.hasProfile(findCameraID(), CamcorderProfile.QUALITY_480P)) {
            mediaRecorder.setProfile(CamcorderProfile
                    .get(CamcorderProfile.QUALITY_480P));
        }else{
            mediaRecorder.setProfile(CamcorderProfile
                    .get(CamcorderProfile.QUALITY_LOW));
        }

        mediaRecorder.setOutputFile(getOutputVideoFile());
        mediaRecorder.setMaxDuration(60000);
//        mediaRecorder.setMaxFileSize(100 * 1000 * 1000);

        mediaRecorder.setPreviewDisplay(mShowCamera.getHolder().getSurface());

        try {
            mediaRecorder.prepare();
        } 


        }

        @Override
    protected void onPause() {
        super.onPause();
        releaseMediaRecorder();
        releaseCamera();

    }
      private void releaseCamera() {
        if (mCamera != null) {
            mCamera.release();
            mCamera = null;
        }

    }
}

在上面的类中,我添加了一些代码,如下所示,当用户触摸相机预览时,在访问相机参数时,在onTouchEvent()中抛出空指针异常。还尝试了在配置媒体录制器(prepareMediaRecorder())后,在“活动”中将摄影机对象再次设置为曲面,但缩放功能正常,但视频未录制

          @Override
public boolean onTouchEvent(MotionEvent event) {
    // Get the pointer ID
    Camera.Parameters params = mCamera.getParameters();
    int action = event.getAction();


    if (event.getPointerCount() > 1) {
        // handle multi-touch events
        if (action == MotionEvent.ACTION_POINTER_DOWN) {
            mDist = getFingerSpacing(event);
        } else if (action == MotionEvent.ACTION_MOVE && params.isZoomSupported()) {
            mCamera.cancelAutoFocus();
            handleZoom(event, params);
        }
    } else {
        // handle single touch events
        if (action == MotionEvent.ACTION_UP) {
            handleFocus(event, params);
        }
    }
    return true;
}

private void handleZoom(MotionEvent event, Camera.Parameters params) {
    int maxZoom = params.getMaxZoom();
    int zoom = params.getZoom();
    float newDist = getFingerSpacing(event);
    if (newDist > mDist) {
        //zoom in
        if (zoom < maxZoom)
            zoom++;
    } else if (newDist < mDist) {
        //zoom out
        if (zoom > 0)
            zoom--;
    }
    mDist = newDist;
    params.setZoom(zoom);
    mCamera.setParameters(params);
}

public void handleFocus(MotionEvent event, Camera.Parameters params) {
    int pointerId = event.getPointerId(0);
    int pointerIndex = event.findPointerIndex(pointerId);
    // Get the pointer's current position
    float x = event.getX(pointerIndex);
    float y = event.getY(pointerIndex);

    List<String> supportedFocusModes = params.getSupportedFocusModes();
    if (supportedFocusModes != null && supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
        mCamera.autoFocus(new Camera.AutoFocusCallback() {
            @Override
            public void onAutoFocus(boolean b, Camera camera) {
                // currently set to auto-focus on single touch
            }
        });
    }
}

/** Determine the space between the first two fingers */
private float getFingerSpacing(MotionEvent event) {
    // ...
    float x = event.getX(0) - event.getX(1);
    float y = event.getY(0) - event.getY(1);
    return (float)Math.sqrt(x * x + y * y);
}
@覆盖
公共布尔onTouchEvent(运动事件){
//获取指针ID
Camera.Parameters params=mCamera.getParameters();
int action=event.getAction();
if(event.getPointerCount()>1){
//处理多点触控事件
if(action==MotionEvent.action\u指针\u向下){
mDist=getFingerSpacing(事件);
}else if(action==MotionEvent.action\u MOVE&¶ms.isZoomSupported()){
mCamera.cancelAutoFocus();
handleZoom(事件、参数);
}
}否则{
//处理单触事件
if(action==MotionEvent.action\u UP){
handleFocus(事件、参数);
}
}
返回true;
}
私有void handleZoom(MotionEvent事件,Camera.Parameters参数){
int maxZoom=params.getMaxZoom();
int zoom=params.getZoom();
float newDist=getFingerSpacing(事件);
如果(newDist>mDist){
//放大
如果(缩放<最大缩放)
zoom++;
}else if(newDist0)
缩放--;
}
mDist=newDist;
参数设置缩放(缩放);
mCamera.setParameters(参数);
}
public void handleFocus(MotionEvent事件,Camera.Parameters参数){
int pointerId=event.getPointerId(0);
int pointerIndex=event.findPointerIndex(pointerId);
//获取指针的当前位置
float x=event.getX(pointerIndex);
float y=event.getY(pointerIndex);
List supportedFocusModes=params.getSupportedFocusModes();
if(supportedFocusModes!=null&&supportedFocusModes.contains(Camera.Parameters.FOCUS\u MODE\u AUTO)){
mCamera.autoFocus(新相机.AutoFocusCallback(){
@凌驾
自动对焦上的公共空白(布尔b,摄像头){
//当前设置为单触式自动对焦
}
});
}
}
/**确定前两个手指之间的间距*/
专用浮点getFingerSpacing(MotionEvent事件){
// ...
float x=event.getX(0)-event.getX(1);
float y=event.getY(0)-event.getY(1);
返回(浮点)数学sqrt(x*x+y*y);
}

请将堆栈跟踪添加到您的问题中。
          @Override
public boolean onTouchEvent(MotionEvent event) {
    // Get the pointer ID
    Camera.Parameters params = mCamera.getParameters();
    int action = event.getAction();


    if (event.getPointerCount() > 1) {
        // handle multi-touch events
        if (action == MotionEvent.ACTION_POINTER_DOWN) {
            mDist = getFingerSpacing(event);
        } else if (action == MotionEvent.ACTION_MOVE && params.isZoomSupported()) {
            mCamera.cancelAutoFocus();
            handleZoom(event, params);
        }
    } else {
        // handle single touch events
        if (action == MotionEvent.ACTION_UP) {
            handleFocus(event, params);
        }
    }
    return true;
}

private void handleZoom(MotionEvent event, Camera.Parameters params) {
    int maxZoom = params.getMaxZoom();
    int zoom = params.getZoom();
    float newDist = getFingerSpacing(event);
    if (newDist > mDist) {
        //zoom in
        if (zoom < maxZoom)
            zoom++;
    } else if (newDist < mDist) {
        //zoom out
        if (zoom > 0)
            zoom--;
    }
    mDist = newDist;
    params.setZoom(zoom);
    mCamera.setParameters(params);
}

public void handleFocus(MotionEvent event, Camera.Parameters params) {
    int pointerId = event.getPointerId(0);
    int pointerIndex = event.findPointerIndex(pointerId);
    // Get the pointer's current position
    float x = event.getX(pointerIndex);
    float y = event.getY(pointerIndex);

    List<String> supportedFocusModes = params.getSupportedFocusModes();
    if (supportedFocusModes != null && supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
        mCamera.autoFocus(new Camera.AutoFocusCallback() {
            @Override
            public void onAutoFocus(boolean b, Camera camera) {
                // currently set to auto-focus on single touch
            }
        });
    }
}

/** Determine the space between the first two fingers */
private float getFingerSpacing(MotionEvent event) {
    // ...
    float x = event.getX(0) - event.getX(1);
    float y = event.getY(0) - event.getY(1);
    return (float)Math.sqrt(x * x + y * y);
}