Android,如何在纵向模式下使用MediaRecorder旋转录制的视频

时间:2016-10-30 17:14:47

标签: android video orientation mediarecorder portrait

我正在尝试在自定义视图中捕获视频。我可以通过Camera.setDisplayOrientation(旋转)以正确的方向显示视频,但录制的视频仍处于横向模式。我无法在纵向模式下正确捕捉视频。

我测试了https://github.com/googlesamples/android-Camera2Video,它也有同样的问题。

我在检查权限后在setCameraOrientation()之后调用Camera.open(currentCameraId)方法。

private void setCameraOrientation()
{
    int rotation = getRotation();
    mCamera.setDisplayOrientation(rotation);

    Camera.Parameters parameters = mCamera.getParameters();
    parameters.setRotation(rotation);
    mCamera.setParameters(parameters);
}

private int getRotation()
{
    Display display = getWindowManager().getDefaultDisplay();
    int rotation = 0;
    switch (display.getRotation())
    {
        case Surface.ROTATION_0:
            rotation = 90;
            break;
        case Surface.ROTATION_90:
            rotation = 0;
            break;
        case Surface.ROTATION_180:
            rotation = 270;
            break;
        case Surface.ROTATION_270:
            rotation = 180;
            break;
    }
    return rotation;
}

这使我能够以正确的方向显示视频。但是当我停止MediaRecorder并检查保存的文件后,我看到90度旋转的视频具有不良的宽高比。我通过拉到我的电脑和另一个有VideoView元素的片段来检查这个。我的prepareRecorder方法是:

private boolean prepareRecorder()
{
    mCamera.lock();
    mCamera.unlock();
    recorder = new MediaRecorder();

    recorder.setCamera(mCamera);

    recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

    CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
    if (!mIsMute)
    {
        recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
        recorder.setProfile(profile);
    }
    else
    {
        recorder.setOutputFormat(profile.fileFormat);
        recorder.setVideoSize(profile.videoFrameWidth, profile.videoFrameHeight);
        recorder.setVideoFrameRate(profile.videoFrameRate);
        recorder.setVideoEncoder(profile.videoCodec);
        recorder.setVideoEncodingBitRate(profile.videoBitRate);
    }

    recorder.setMaxDuration(maxVideoDuration - videoProgress);

    String fileName = StorageUtil.sharedUtil().getExternalStorageDir() + File.separator + String.format(
            fileNameFormat, videoCount);
    recorder.setOutputFile(fileName);

    recorder.setPreviewDisplay(surfaceHolder.getSurface());

    try
    {
        recorder.prepare();
    }
    catch (Exception e)
    {
        e.printStackTrace();
        return false;
    }

    return true;
}

然后我只需拨打recorder.start();

顺便说一句,我在recorder.setOrientationHint(90);之前尝试recoreder.prepare();,但它没有做任何事情。我可以显示正确的方向但无法保存。

2 个答案:

答案 0 :(得分:0)

我遇到了类似的问题。这是我用于处理录制轮换的代码。这是使用相机api而不是camera2 api:

 private void setCameraDisplayOrientation() {
        android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo();
        android.hardware.Camera.getCameraInfo(mCameraId, info);
        int rotation = mActivity.getWindowManager().getDefaultDisplay().getRotation();
        int degrees = 0;
        switch (rotation) {
            case Surface.ROTATION_0:
                degrees = 0;
                break;
            case Surface.ROTATION_90:
                degrees = 90;
                break;
            case Surface.ROTATION_180:
                degrees = 180;
                break;
            case Surface.ROTATION_270:
                degrees = 270;
                break;
        }

        int result;
        if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
            result = (info.orientation + degrees) % 360;
            result = (360 - result) % 360;  // compensate the mirror
        } else {  // back-facing
            result = (info.orientation - degrees + 360) % 360;
        }

        Log.d(TAG, "Orientation: " + String.valueOf(result));

        mCamera.setDisplayOrientation(result);
    }

答案 1 :(得分:0)

我有类似的需求。肖像模式对我有用。我的代码与您的代码的唯一区别在于我没有在CameraParameters中设置旋转,只是在相机上设置setDisplayOrientationmediaRecorder.setOrientationHint(90);

// Camera.Parameters parameters = mCamera.getParameters(); // parameters.setRotation(rotation); // mCamera.setParameters(parameters);

我现在有正确的方向,但不知何故,录制的视频有一个奇怪的元数据,方形宽高比。所以,还有更多的工作要做。将发布更新。