安卓翻转前置摄像头:镜像翻转视频

23

我正在尝试在Android前置摄像头录制视频并在surface view上显示。但是,我发现前置摄像头在录制视频时会镜像翻转视频,即使surface view显示正常视图。

有没有办法可以防止或修复这个问题?

我阅读了其他stackoverflow文章,例如如何防止Android翻转前置摄像头的图像?

但它似乎只讨论使用前置摄像头拍照并翻转图像的问题,我已经使用矩阵自己解决了这个问题。然而,似乎对于视频使用矩阵无效。


奇怪。如果您能将矩阵应用于视频,则必须有一种方法可以翻转它。 - clwhisk
嗨,预览看起来很好,但实际录制的视频因某种原因出现了镜像翻转。 - Danny Kim
https://dev59.com/Wmsz5IYBdhLWcg3wZm7Q - keuninkske
嗨@DannyKim,你找到了上述问题的解决方案吗? - user1154390
1
@DannyKim 我也遇到了同样的问题。你找到解决方案了吗? - Piyush
显示剩余4条评论
5个回答

4

在我的情况下,我只需要在播放时进行水平翻转。当录制时,它已经被翻转以实现镜像效果,而且我认为无法修改它。然而,下面的代码解决了我在播放时的问题。

videoPlayer.setScaleX(-1);

2

我没有解决方案,但我认为关键是:

MediaRecorder.setOrientationHint

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

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


3
它仅翻转视频的方向(因此方法名称为“flip”)。但录制的视频仍然是从预览中镜像翻转的 :/ - Danny Kim
1
上述答案与问题无关。 - colintheshots

2
在setDisplayOrientation方法的文档中(http://developer.android.com/reference/android/hardware/Camera.html),我们可以找到以下内容:
注意,前置摄像头的预览显示在旋转之前会水平翻转,也就是说,图像会沿着相机传感器的中心垂直轴进行反射。因此,用户可以看到自己像是在照镜子。
因此,您的预览显示应该被翻转,但您录制的视频不应该被翻转。通过您的预览显示,您是否看到自己像是在照镜子?如果是这样的话,一切都正常工作。

不,我无法在前置摄像头预览中看到自己,就像照镜子一样。我遇到的问题与文档描述的完全相反。在调用Camera.setDisplayOrientation()后,预览是正确的,但在调用MediaRecorder.setOrientationHint()之后,H.264视频会水平翻转。 - colintheshots
如果你在前置摄像头预览中看不到自己,就像照镜子一样,那么你的设备可能存在问题。我建议你先尝试使用其他带有前置摄像头的设备。 - Alex Cohn
原帖作者和我都遇到了同样的“问题”,并且在我拥有的所有具有前置摄像头和最新操作系统的Nexus设备上都出现了这个问题。也许文档已经过时了? - colintheshots
我尚未找到任何运行KitKat或Lollipop系统的设备,在使用前置摄像头录制视频时不会出现这种行为。我已经尝试过三星Galaxy S3、S4、S5、S6、Moto G、Nexus 4和Nexus 6等设备。我相信文档已经过时或者有误。 - colintheshots
@colintheshots,我终于写了一篇图文并茂的答案,请查看。 - Alex Cohn

0
如果您需要翻转视频录制并将其保存到内部存储器中,则可以在Android Studio中使用Mp4Composer依赖项。
首先,您需要添加依赖项,
步骤1. 将JitPack存储库添加到构建文件中。
allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}

第二步。添加依赖项
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


0

你需要应用矩阵变换,就像这样:

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

假设您不调整任何内容,则比例为1,使非前置摄像头预缩放变得过时。


3
除了预览和播放视图外,无法对任何其他内容应用矩阵转换。如果视频录制本身被翻转了,似乎MediaRecorder没有提供任何函数来应用转换以修复保存的视频。 - colintheshots
@colintheshots 是的,只有在我们将表面用作mediarecorder的输入并使用opengl进行图像处理时才可能实现,这种情况下我们可以做任何事情,如翻转等。 - user924

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接