如何使前置摄像头拍摄的视频在Android上不出现倒置?

11

我使用MediaRecorder录制视频。当使用后置摄像头时,它运行良好,但当使用前置摄像头时,所拍摄的视频被翻转/倒置。也就是说,在右边的物品会出现在左边。相机预览功能正常,只是最终捕获的视频被翻转了。

这是相机预览的样子

enter image description here

但是最终的视频看起来像这样(左侧的所有项目会出现在右侧)

enter image description here

我尝试过的方法:

我尝试在准备录制器时应用matrix,但似乎没有改变任何东西。

private boolean prepareRecorder(int cameraId){

    //# Create a new instance of MediaRecorder
    mRecorder = new MediaRecorder();

    setCameraDisplayOrientation(this,cameraId,mCamera);
    int angle = getVideoOrientationAngle(this,cameraId);
    mRecorder.setOrientationHint(angle);

    if(cameraId == Camera.CameraInfo.CAMERA_FACING_FRONT){
        Matrix matrix = new Matrix();
        matrix.preScale(1.0f,-1.0f);
    }

    //all other code to prepare recorder here
  }

我已经阅读了下面所有的问题,但所有这些似乎都不能解决我的问题。值得一提的是,我使用SurfaceView进行摄像头预览,因此这里的问题无法帮助我。

1)Android翻转前置摄像头,镜像翻转视频

2)如何避免Android反转前置摄像头拍摄的图像?

3)如何防止前置摄像头翻转

所以我的问题是:

1)如何通过前置摄像头捕捉视频,并且视频不会倒置(与相机预览完全相同)?

2)当相机预览使用SurfaceView而不是TextureView时,如何实现这一点?(因为我提到的所有问题都涉及使用TextureView

最好的解决方案都欢迎...谢谢

编辑

我制作了两个短视频剪辑来澄清问题,请下载并查看

1)录制期间的相机预览视频

2)录制的最终产品视频


@AlexCohn 我拍了一个短片..相机预览没有翻转,但录制的视频却翻转了... - ken
@AlexCohn 这是相机预览时(录制时)的视频剪辑 https://ufile.io/76rf2 - ken
@AlexCohn,你可以看到这本书是反向的(左手边的书移到右手边)。 - ken
我要求使用前置和后置摄像头拍摄同样的视频。我相信它们看起来会一样。 - Alex Cohn
前后摄像头都要吗?这是什么意思? - ken
显示剩余9条评论
2个回答

3

因此,如果系统相机应用程序生成的视频与您的应用程序类似,则您没有做错什么。现在是时候了解前置摄像头视频录制发生了什么。

前置摄像头在拍摄静态图片或视频方面与后置摄像头没有区别。手机在屏幕上显示相机预览的方式有所不同。为了使用户看起来更自然,Android(以及所有其他系统)会将预览镜像,以便您可以看到自己就像在镜子里一样。

重要的是要理解,这仅适用于向您呈现预览的方式。如果您使用任何视频会议应用程序,在两个手中握着的两个设备上连接并查看自己,您会惊讶地发现自己的两个实例被翻转了。

这不是错误,而是向对方呈现视频的自然方式。

请参见草图:

这是您看到场景的方式:

how you see the scene

这就是你的同行看到相同场景的方式

how your peer sees the same scene

通常情况下,录制视频是从您的同伴视角进行的,如第二张图片所示。这是例如视频会议的自然设置。
但是Snapchat和其他一些社交应用程序选择将前置摄像头的视频剪辑存储为如果您从镜子中录制它(就像记录者在第一张图片上手持相机)。有些人喜欢这个功能,而有些人则不喜欢(请参见https://forums.androidcentral.com/general-help-how/664539-front-camera-pics-mirrored-reversed-only-snapchat.htmlhttps://www.reddit.com/r/nexus6/comments/3846ay/has_anyone_found_a_fix_for_snapchat_flipping)。
您不能使用MediaRecorder来实现此功能。您可以使用更低级别的MediaCodec API来记录处理后的帧。您需要'手动'翻转每个帧,这可能会对性能产生显著影响,因为通常MediaRecorder以非常高效的方式将相机与硬件编码器'连接',甚至无需将像素复制到用户内存中。此答案显示了如何操作相机呈现到纹理的方式。

那么在这种情况下,是否有办法使最终的视频翻转呢?因为正如您所说,这是自然的方式,那么我想要翻转它,这样视频就会像预览一样出现对吗? - ken
你不能使用MediaRecorder来完成这个任务。你可以使用更底层的MediaCodec API来录制任何内容。你仍然需要手动翻转每一帧,这可能会对性能造成重大影响,因为通常情况下,MediaRecorder会以非常高效的方式将相机连接到硬件编码器,甚至不需要将像素复制到用户内存中。 - Alex Cohn
重要问题是:为什么你要错误地翻转它呢? - Alex Cohn
1
因为我在手机上查看Snapchat相机时,相机预览和最终视频完全一样,所以我想自己制作一个。但是我就是想不明白,为什么我的最终视频会翻转,而Snapchat却没有翻转。 - ken
1
实际上,如果您在GPU中使用OpenGL操作重新映射SurfaceView的纹理,则根据需要翻转图像并裁剪到特定宽高比并不会太耗费资源。我们在我创业公司的旧应用程序中就是这样做的。如果使用TextureView,预览翻转会更容易一些,因为它本身支持旋转矩阵。https://developer.android.com/reference/android/view/TextureView.html#setTransform(android.graphics.Matrix) - colintheshots
显示剩余5条评论

0

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