【问题标题】:Android flip front camera mirror flipped videoAndroid翻转前置摄像头后视镜翻转视频
【发布时间】:2013-08-27 01:46:35
【问题描述】:

我正在尝试从 Android 的前置摄像头录制视频,同时在表面视图上显示。

我发现前置摄像头在录制过程中会镜像翻转视频,即使表面视图显示正常视图。

有什么办法可以防止或修复它?

我阅读了其他 stackoverflow 文章,例如 How to keep android from inverting the image from the front facing camera?

但似乎只是在谈论用前置摄像头拍照并反转图像,我自己已经使用矩阵修复了。但是,似乎对视频使用矩阵不起作用。

【问题讨论】:

  • 很奇怪。如果您能够将矩阵应用于视频,则必须有一种方法来翻转它。
  • 您好,预览看起来不错,但实际录制的时候由于某种原因镜像翻转了。
  • 那个答案似乎不相关。似乎没有办法对视频 MediaRecorder 应用矩阵变换,只能改变记录表面上显示的视图。
  • @DannyKim 我面临同样的问题。你找到解决办法了吗?

标签: android video camera


【解决方案1】:

在我的情况下,我只需要在播放时水平翻转。录制时它已经翻转为镜像效果,我认为无法修改它。但是下面的代码解决了我在播放时遇到的问题。

videoPlayer.setScaleX(-1);

【讨论】:

    【解决方案2】:

    我没有解决办法,但在我看来关键是:

    MediaRecorder.setOrientationHint

    设置输出视频播放的方向提示。此方法应在 prepare() 之前调用。此方法在视频录制过程中不会触发源视频帧旋转,但如果输出格式为OutputFormat.THREE_GPP或OutputFormat.MPEG_4,则在输出视频中添加包含旋转角度的合成矩阵,以便视频播放器可以选择正确的播放方向。请注意,某些视频播放器可能会选择在播放过程中忽略视频中的合成矩阵。

    我正在用 H264 录制视频,但它对我不起作用 :( 但它可能会帮助你。有没有试过?

    【讨论】:

    • 它只翻转视频的方向(因此是方法名称)。但录制的视频仍然从预览镜像翻转:/
    • 以上答案与问题无关。
    【解决方案3】:

    在setDisplayOrientation方法(http://developer.android.com/reference/android/hardware/Camera.html)的文档中,我们可以找到:

    注意前置摄像头的预览显示是翻转的 水平旋转前,即图像被反射 沿相机传感器的中心垂直轴。所以用户可以 把自己看成照镜子。

    因此,您的预览显示应该被翻转,而不是您录制的视频。通过预览显示,您是否认为自己在照镜子?如果是这样,一切正常。

    【讨论】:

    • 不,我无法在前置摄像头预览中看到自己,就像在照镜子一样。我看到的问题与文档描述的完全相反。 Camera.setDisplayOrientation()后预览正确,但H.264视频在MediaRecorder.setOrientationHint()后水平翻转。
    • 如果您无法在前置摄像头预览中看到自己,就像在照镜子一样,您的设备可能有问题。我建议你先试试其他带前置摄像头的设备。
    • 原始发帖人和我都看到了同样的“问题”,它出现在我拥有的每台配备前置摄像头和最新操作系统的 Nexus 设备上。也许文档已经过时了?
    • 我还没有发现任何运行 KitKat 或 Lollipop 的设备在从前置摄像头录制视频时不会重现此行为。我尝试过三星 Galaxy S3、S4、S5、S6、Moto G、Nexus 4 和 Nexus 6。我认为这些文档已经过时或错误。
    • @colintheshots 终于写了图文并茂的answer,请查收。
    【解决方案4】:

    你必须应用矩阵变换,像这样:

    if(isFrontCamera) {
        m.preScale(-ratio, ratio);
    } else {
        m.preScale(ratio, ratio);
    }
    

    假设您不调整配给为 1 的任何内容,则使非前置摄像头 preScale 过时。

    【讨论】:

    • 除了视图(即预览和回放)之外,无法将矩阵变换应用于任何内容。如果视频录制本身被翻转,MediaRecorder 似乎没有提供任何功能来应用转换来修复它保存的视频。
    • @colintheshots 是的,只有当我们使用surface作为mediarecorder的输入和opengl进行图像处理时才有可能,在这种情况下我们可以做任何事情,翻转等等
    【解决方案5】:

    如果您需要翻转视频录制并将其保存到内部存储中,则可以使用 android studio 中的 Mp4Composer 依赖项。

    首先你需要添加依赖,

    步骤 1. 将 JitPack 存储库添加到您的构建文件中

    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    

    步骤 2. 添加依赖项

    dependencies {
            implementation 'com.github.MasayukiSuda:Mp4Composer-android:v0.4.1'
    }
    

    以下是与垂直翻转相同的示例代码。您可以通过flipVertical(true) 翻转它。也可以通过flipHorizontal(true)水平翻转。

    private void flipVideo(String path, String destinationPath) {
            new Mp4Composer(sourcePath, destinationPath)
            .size(1280, 720)
            .fillMode(FillMode.PRESERVE_ASPECT_FIT)
            //.flipHorizontal(true)
            .flipVertical(true)
            // .rotation(Rotation.ROTATION_270)
            //.filter(glFilter)
            //.mute(muteCheckBox.isChecked())
            //.timeScale(2f)
            //.changePitch(false)
            //.trim(2000, 5000)
            .listener(new Mp4Composer.Listener() {
                @Override
                public void onProgress(double progress) {
                    Log.d("app_log", "onProgress = " + progress);
                    runOnUiThread(() -> progressBar.setProgress((int) (progress * 100)));
                }
    
                @Override
                public void onCompleted() {
                    Log.d("app_log", "onCompleted(): video conversion completed");
                   runOnUiThread(() -> {
                       Toast.makeText(CameraActivity.this, "video saved under " + destinationPath, Toast.LENGTH_SHORT).show();
                   });
                }
    
                @Override
                public void onCanceled() {
                }
    
                @Override
                public void onCurrentWrittenVideoTime(long timeUs) {
                }
    
                @Override
                public void onFailed(Exception exception) {
                    Log.e("app_log", "onFailed() " + exception.getMessage());
                }
            })
            .start();
        }
    

    这样调用方法,

    flipVideo(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/video_input.mp4", Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/video_output.mp4");
    

    更多:Mp4Composer-android

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-25
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多