如何让前置摄像头拍摄的视频不被Android所覆盖?
我用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 安卓 from inverting the image from the front facing camera?
3)Prevent flipping of the front facing camera
所以我的问题是:
1)如何通过前置摄像头捕捉视频,而视频不是反向的(与摄像头预览完全相同)
2)当相机预览使用SurfaceView
而不是TextureView
时,如何实现这一点?(因为我上面提到的所有问题,都是关于使用TextureView
)
我们欢迎所有可能的解决方案。。Tq
编辑
我制作了两个短片来澄清问题,请下载并观看
# 1 楼答案
因此,如果system camera应用程序生成的视频与你的应用程序类似,那么你没有做错什么。现在是时候了解前置摄像头录像会发生什么了
前向摄像头与后向摄像头在捕捉静止图片或视频的方式上没有什么不同。手机在屏幕上显示摄像头预览的方式有所不同。为了让用户看起来更自然,Android(以及所有其他系统)会镜像预览,这样你就可以像在镜子里一样看到自己
重要的是要理解,这只适用于预览呈现给您的方式。如果你拿起任何一款视频会议应用程序,连接两只手拿着的两台设备,看看自己,你会惊讶地发现自己的两个实例被翻转了
这不是bug,这是向另一方展示视频的自然方式
请参见草图:
以下是您对场景的看法:
这就是你的同伴对同一场景的看法
通常情况下,视频的录制是从同伴的角度进行的,如第二张图片所示。这是视频会议的自然设置
但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显示了如何操纵摄影机渲染为纹理的方式