1

カメラ アクティビティを実装していますが、向きの問題が発生しました。

プレビューの向きを定義することに成功していますが、最終的なムービーは常に 90 度間違った向きになっています。

ここで見つけたすべての提案を試しましたが、記録されたムービーではなく、適切なプレビューのみを定義しています。

次の方法を使用して記録を開始しています:

private void startRecording() {
        mRecordingButton.setBackgroundResource(R.drawable.rec_stop);
        mSwitchCameraButton.setVisibility(View.INVISIBLE);
        mSendButton.setVisibility(View.INVISIBLE);
        mChronometer.setVisibility(View.VISIBLE);

        try {
            mMediaRecorder = new MediaRecorder();

            mCamera.unlock();
            mMediaRecorder.setCamera(mCamera);

            mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

            mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            mMediaRecorder.setAudioEncoder(0x00000003);
            mMediaRecorder.setVideoEncoder(VideoEncoder.H264);

            mMediaRecorder.setOutputFile(getFile().getPath());
            mMediaRecorder.setVideoSize(480, 720);
            mMediaRecorder.setVideoEncodingBitRate(BPS_VIDEO);
            mMediaRecorder.setVideoFrameRate(24);
            mMediaRecorder.setAudioChannels(2);
            mMediaRecorder.setAudioEncodingBitRate(BPS_AUDIO);
            // mMediaRecorder.setOrientationHint(90);

            mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());

            mMediaRecorder.prepare();
            mMediaRecorder.start();

            mChronometer.setBase(SystemClock.elapsedRealtime());
            mChronometer.start();

            mIsRecording = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

そしてこれは向きを定義するために:

public void surfaceCreated(SurfaceHolder arg0) {
        mCamera = Camera.open(0);
        Camera.Parameters params = mCamera.getParameters();
        List<Size> sizes = params.getSupportedPictureSizes();
        Size mSize = sizes.get(0);
        params.setPictureSize(mSize.width, mSize.height);

        if (Integer.parseInt(Build.VERSION.SDK) >= 8) {
            Display display =
                    ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();

            if (display.getRotation() == Surface.ROTATION_0) {
                setDisplayOrientation(mCamera, 90);
            } else if (display.getRotation() == Surface.ROTATION_270) {
                setDisplayOrientation(mCamera, 180);
            }
        } else {
            if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
                params.set("orientation", "portrait");
                params.set("rotation", 90);
            }
            if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
                params.set("orientation", "landscape");
                params.set("rotation", 90);
            }
        }

        mCamera.setParameters(params);

//      setCameraDisplayOrientation(this, 0, mCamera);

        previewCamera();

        if (mCamera == null) {
            Toast.makeText(
                    this.getApplicationContext(),
                    "Camera is not available!",
                    Toast.LENGTH_SHORT).show();
            finish();
        }
    }

    public void previewCamera() {
        try {
            mCamera.setPreviewDisplay(mSurfaceHolder);
            mCamera.startPreview();
        } catch (Exception e) {
            Log.d("VideoCameraActivity", "Cannot start preview", e);
        }
    }

PSこの行は問題を解決します:

mMediaRecorder.setOrientationHint(90);

しかし、一部のデバイス (galaxy s1、s3) をクラッシュさせます。

4

0 に答える 0