我使用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个简短的视频片段以澄清问题,请下载并查看
答案 0 :(得分: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显示了如何操纵相机渲染到纹理的方式。