简体   繁体   English

前置摄像头录制视频失败

[英]Front Camera Record Video Failed

I am trying to record audio by front camera in one of my Activities using MediaRecorder. 我正在尝试使用MediaRecorder在我的一个Activity中通过前置摄像头录制音频。 Part of the code is shown below. 部分代码如下所示。 if I open back Camera, it works well. 如果我打开相机,效果很好。 But if I open front Camera, there is No Runtime Error but I can't open the output MP4. 但是,如果我打开前置摄像头,则不会出现运行时错误,但无法打开输出MP4。 Under the corresponding path there generate a new MP4 file, file size looks normally, 11.2M forexample. 在相应的路径下,生成一个新的MP4文件,文件大小看起来正常,例如11.2M。 But if I press to open it, it shows "sorry, we cann't open the file". 但是,如果按打开它,它显示“对不起,我们无法打开文件”。

part of CameraService.java CameraService.java的一部分

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    Log.d("TAG", "======= service in onStartCommand");

    if (Util.checkCameraHardware(this)) {
        mCamera = Util.getCameraInstance();
        if (mCamera != null) {
            SurfaceView sv = new SurfaceView(this);

            WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
            WindowManager.LayoutParams params = new WindowManager.LayoutParams(1, 1,
                    WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
                    WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
                    PixelFormat.TRANSLUCENT);


            SurfaceHolder sh = sv.getHolder();

            sv.setZOrderOnTop(true);
            sh.setFormat(PixelFormat.TRANSPARENT);


            sh.addCallback(new SurfaceHolder.Callback() {
                @Override
                public void surfaceCreated(SurfaceHolder holder) {
                    Camera.Parameters params = mCamera.getParameters();
                    mCamera.setParameters(params);
                    Camera.Parameters p = mCamera.getParameters();

                    List<Camera.Size> listSize;

                    listSize = p.getSupportedPreviewSizes();
                    Camera.Size mPreviewSize = listSize.get(2);
                    Log.v("TAG", "preview width = " + mPreviewSize.width
                            + " preview height = " + mPreviewSize.height);
                    p.setPreviewSize(mPreviewSize.width, mPreviewSize.height);

                    listSize = p.getSupportedPictureSizes();
                    Camera.Size mPictureSize = listSize.get(2);
                    Log.v("TAG", "capture width = " + mPictureSize.width
                            + " capture height = " + mPictureSize.height);
                    p.setPictureSize(mPictureSize.width, mPictureSize.height);
                    mCamera.setParameters(p);

                    try {
                        mCamera.setPreviewDisplay(holder);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    mCamera.startPreview();
                    mCamera.unlock();
                    mMediaRecorder = new MediaRecorder();
                    mMediaRecorder.setCamera(mCamera);
                    mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
                    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

                    mMediaRecorder.setProfile(CamcorderProfile.get(1,CamcorderProfile.QUALITY_HIGH));

                    mMediaRecorder.setOutputFile(Util.getOutputMediaFile(Util.MEDIA_TYPE_VIDEO).getPath());

                    mMediaRecorder.setPreviewDisplay(holder.getSurface());

                    try {
                        mMediaRecorder.prepare();
                    } catch (IllegalStateException e) {
                        Log.d("TAG", "====== IllegalStateException preparing MediaRecorder: " + e.getMessage());
                    } catch (IOException e) {
                        Log.d("TAG", "====== IOException preparing MediaRecorder: " + e.getMessage());
                    }
                    mMediaRecorder.start();
                    Log.d("TAG", "========= recording start");

                    new Handler().postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            mMediaRecorder.stop();
                            mMediaRecorder.reset();
                            mMediaRecorder.release();
                            mMediaRecorder=null;
                            mCamera.stopPreview();
                            mCamera.release();
                            Log.d("TAG", "========== recording finished.");
                        }
                    }, 10000);
                }

                @Override
                public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
                }

                @Override
                public void surfaceDestroyed(SurfaceHolder holder) {
                }
            });


            wm.addView(sv, params);

        } else {
            Log.d("TAG", "==== get Camera from service failed");
        }
    } else {
        Log.d("TAG", "==== There is no camera hardware on device.");
    }

    return super.onStartCommand(intent, flags, startId);
}

part of Util.java Util.java的一部分

public static Camera getCameraInstance() {
    Camera c = null;
    try {
        c = Camera.open(1);
    } catch (Exception e) {
        Log.d("TAG", "Open camera failed: " + e);
    }
    return c;
}

Update: I change two lines shown below, switching to the back camera and record video well. 更新:我更改了以下两行,切换到后置摄像头,并很好地录制了视频。

CameraService.java mMediaRecorder.setProfile(CamcorderProfile.get(1,CamcorderProfile.QUALITY_HIGH)); CameraService.java mMediaRecorder.setProfile(CamcorderProfile.get(1,CamcorderProfile.QUALITY_HIGH)); => mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH)); => mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));

Util.java c = Camera.open(1); Util.java c = Camera.open(1); => c = Camera.open(); => c = Camera.open();

I finally solved the problem occasionally. 我终于偶尔解决了这个问题。

mMediaRecorder.setProfile(CamcorderProfile.get(1,CamcorderProfile.QUALITY_HIGH)); ==> mMediaRecorder.setProfile(CamcorderProfile.get(1,CamcorderProfile.QUALITY_LOW)); ==> mMediaRecorder.setProfile(CamcorderProfile.get(1,CamcorderProfile.QUALITY_LOW));

Now it works well. 现在它运作良好。 But I don't know exactly why it works and why it did not work before? 但是我不知道它为什么起作用,为什么以前不起作用?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM