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



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

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

有什么办法可以防止或解决这个问题吗?

我读过其他stackoverflow的文章,比如如何防止android从前置摄像头反转图像?

但它似乎只是在谈论用前置摄像头拍照和反转图像,我自己已经用矩阵解决了这个问题。然而,在视频中使用矩阵似乎是行不通的。

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

videoPlayer.setScaleX(-1);

我没有解决方案,但在我看来关键是:

MediaRecorder.setOrientationHint

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

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

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

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

所以你的预览显示应该是翻转的,但不是你录制的视频。通过预览显示,你是否看到自己在照镜子?如果是这样的话,一切都很好。

您必须应用矩阵变换,例如:

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

假设你不调整任何大小,比例将是1,使非前置摄像头preScale过时。

如果你需要翻转视频录制并将其保存到内部存储中,那么你可以在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安卓

最新更新