Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.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,如何在纵向模式下使用MediaRecorder旋转录制的视频_Android_Video_Orientation_Mediarecorder_Portrait - Fatal编程技术网

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

Android,如何在纵向模式下使用MediaRecorder旋转录制的视频,android,video,orientation,mediarecorder,portrait,Android,Video,Orientation,Mediarecorder,Portrait,我正在尝试在自定义视图中捕获视频。我可以通过摄像头以正确的方向显示视频。设置DisplayOrientation(旋转),但录制的视频仍处于横向模式。我无法在纵向模式下正确捕获视频 我测试过,它也有同样的问题 在检查权限后,我正在调用setCameraOrientation()方法 private void setCameraOrientation() { int rotation = getRotation(); mCamera.setDisplayOrientation(ro

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

我测试过,它也有同样的问题

在检查权限后,我正在调用
setCameraOrientation()
方法

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元素的片段来检查这一点。我的准备记录方法是:

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()之前但它什么都不做。我可以显示正确的方向,但无法保存。

我遇到了类似的问题。下面是我用来处理录制时的旋转的代码。这是使用camera 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);
    }

我也有类似的需要。肖像模式适合我。我的代码与你的代码的唯一区别在于,我没有在CameraParameters中设置旋转,只是在相机和mediaRecorder上设置了
setDisplayOrientation
。setOrientationHint(90)

//Camera.Parameters=mCamera.getParameters();
//参数。设置旋转(旋转);
//mCamera.setParameters(参数)


我现在有了正确的方向,但不知怎么的,录制的视频有一个奇怪的元数据,一个正方形的纵横比。所以,还有一些工作要做。将发布更新。

谢谢您的回复,但这并不是我的问题。我已经在使用
setCameraOrientation()
方法设置显示方向。这有助于我在录制时正确显示,但我的问题是在纵向模式下保存视频。它总是以横向模式保存视频,我正在使用ffmpeg旋转视频,这会花费我额外的时间(几秒钟)。我正在使用带有Android7.0操作系统的通用移动Android One进行测试。为什么要使用ffmpeg来旋转视频?录制视频时,正确的旋转应该在视频元数据中。这不是真的吗?我录制了一段视频,然后在下一个屏幕上播放。如果我不旋转,它将以错误的方向播放视频。起初我以为它和我的Android播放器有关,但后来我把.mp4视频拉到我的电脑上,结果是一样的。视频播放-90度方向错误。我只能通过使用ffmpeg旋转视频来解决这个问题。当您在录制视频后不使用ffmpeg时,视频上的旋转是否正确?您在视频文件的元数据中看到了什么?您可以使用MediaInfo()查看设置的内容吗?我认为您录制的视频是正确的,但元数据中的旋转可能已关闭。在
recorder.setCamera()之后添加
recorder.setOrientationHint(rotationDegrees)您是否解决了元数据问题?