如何使前置摄像头拍摄的视频不是逆安卓?

Posted

技术标签:

【中文标题】如何使前置摄像头拍摄的视频不是逆安卓?【英文标题】:How to make video captured by front camera not being inverse Android? 【发布时间】:2017-08-24 02:40:32 【问题描述】:

我使用 MediaRecorder 录制视频。使用后置摄像头时,它工作正常,但使用前置摄像头时,捕获的视频正在翻转/反转。意味着右侧的项目将出现在左侧。相机预览工作正常,只是最后捕获的视频翻转了。

这是相机预览的样子

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

到目前为止我尝试了什么:

我尝试在准备记录器时应用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 flip front camera mirror flipped video

2)How to keep android from inverting the image from the front facing camera?

3)Prevent flipping of the front facing camera

所以我的问题是:

1) 如何通过前置摄像头截取视频不反转的视频(与摄像头预览完全相同)?

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

所有可能的解决方案都非常受欢迎..Tq

编辑

我做了2个短视频来澄清问题,请下载看看

1)The video during camera preview of recording

2)The video of the final product of recording

【问题讨论】:

这可能对你有帮助github.com/google/grafika 我们都习惯了前置摄像头的镜像效果,以至于很难区分“正确”和“反向”。前置摄像头捕捉视频的方式与后置摄像头相同。尝试用两台相机拍摄同一场景的短片,并比较结果。翻转的是您的 preview(但这并没有错,这就是我们所期望的)。 @AlexCohn 我拍了短片..相机预览没有翻转,但是录制的视频被翻转了...... 你能上传这两个视频片段吗,例如到tinypic.com ? 确定..稍后我会告诉你.. 【参考方案1】:

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

前置摄像头拍摄静态图片或视频的方式与后置摄像头没有什么不同。手机在屏幕上显示相机预览的方式有所不同。为了让用户看起来更自然,Android(和所有其他系统)会镜像预览,因此您可以像在镜子中一样看到自己。

请务必了解,这仅适用于预览呈现给您的方式。如果你拿起任何视频会议应用程序,连接你两只手拿着的两台设备,然后看看你自己,你会惊讶地发现自己的两个实例被翻转了。

这不是错误,这是向对方展示视频的自然方式。

看草图:

这就是你看到场景的方式:

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

通常,视频的录制是从您的同伴的角度进行的,如第二张图片所示。这是例如视频会议的自然设置。

但 Snapchat 和其他一些社交应用程序选择存储前置视频剪辑,就好像您从镜子中录制它一样(就好像第一张照片上录像机就在您手中一样)。有些人喜欢这个功能,有些人讨厌它(见https://forums.androidcentral.com/general-help-how/664539-front-camera-pics-mirrored-reversed-only-snapchat.html 和https://www.reddit.com/r/nexus6/comments/3846ay/has_anyone_found_a_fix_for_snapchat_flipping)

您不能为此使用 MediaRecorder。您可以使用 MediaCodec 的较低级别 API 来记录处理后的帧。您需要“手动”翻转每一帧,这可能会对性能造成重大影响,因为通常 MediaRecorder 以非常有效的方式将相机“连接”到硬件编码器,甚至不需要将像素复制到用户内存。 This answer 展示了如何操纵相机渲染到纹理的方式。

【讨论】:

那么在这种情况下,有没有办法让最终的视频翻转?因为正如你所说,这是自然的方式,然后我想翻转它,因此视频看起来像预览吧?? 您无法使用 MediaRecorder 执行此操作。您可以使用 MediaCodec 的低级 API 来记录任何内容。您仍然需要“手动”翻转每一帧,这可能会对性能造成重大影响,因为通常 MediaRecorder 以非常有效的方式将相机“连接”到硬件编码器,甚至不需要将像素复制到用户内存。 哇..这对 MediaCodec 来说可能非常痛苦..无论如何非常感谢..你告诉我,我没有做错..tq 因为我看手机里的 snapchat 摄像头,摄像头预览和最终视频完全一样..所以要为自己构建 1..但我就是想不通,为什么我的最后一个视频被翻转了,但 snapchat 没有被翻转 实际上,如果您在 GPU 中使用 OpenGL 操作重新映射 SurfaceView 的纹理,则根据需要翻转图像并裁剪到宽高比并不是那么昂贵。我们在我的初创公司的旧应用程序中做到了这一点。使用原生支持旋转矩阵的 TextureView 时显示翻转的预览会更容易一些。 developer.android.com/reference/android/view/…

以上是关于如何使前置摄像头拍摄的视频不是逆安卓?的主要内容,如果未能解决你的问题,请参考以下文章

setOrientationHint 在某些手机的前置摄像头 (HTC) 上逆时针旋转视频

Android翻盖前置摄像头镜头翻转视频

IOS Swift 3:拍摄相机图片后水平翻转前置摄像头图像

用前置摄像头拍摄的照片颠倒了

如何在安卓平台打开“前置摄像头”?

切换前置罕见摄像头时,HTML5 视频元素请求永远保持挂起状态(在移动设备上的 chrome 上)