如何让前置摄像头拍摄的视频不反转Android?
How to make video captured by front camera not being inverse Android?
我使用 MediaRecorder.When 使用后置摄像头录制视频,它工作正常,但是当使用前置摄像头时,捕获的视频是 flipped/inverse。意味着右边的项目将出现在left.The 相机预览工作正常,只是翻转了最终捕获的视频。
这是相机预览图
但是最后的视频是这样的(左边的所有项目,出现在右边)
到目前为止我尝试了什么:
我尝试在准备记录器时应用 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
}
我已经阅读了下面所有这个问题,但是所有这些似乎都没有解决我的 problem.For 信息,我使用 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个视频短片来说明问题,请下载看看
因此,如果系统相机应用生成的视频与您的应用类似,则您没有做错任何事情。现在是时候了解 front-facing 相机视频录制发生了什么。
前置摄像头与后置摄像头在拍摄静态图片或视频方面没有什么不同。 phone 在屏幕上显示相机预览的方式有所不同。为了让用户看起来更自然,Android(和所有其他系统)镜像预览,这样您就可以像在镜子中一样看到自己。
请务必了解,这仅适用于向您呈现预览的方式。如果你拿起任何视频会议应用程序,连接两只手拿着的两个设备,然后看看你自己,你会惊讶地发现你自己的两个实例被翻转了。
这不是错误,这是向对方展示视频的自然方式。
见草图:
这是你看到的场景:
这是你的同伴看到相同场景的方式
一般情况下,录制视频都是从同伴的角度进行的,如第二张图。这是视频会议等的自然设置。
但 Snapchat 和其他一些社交应用程序选择存储 front-facing 视频剪辑,就好像您从镜子里录制它一样(就像第一张照片上的录音机在您的手中一样)。有些人喜欢这个功能,有些人讨厌它(参见 https://forums.androidcentral.com/general-help-how/664539-front-camera-pics-mirrored-reversed-only-snapchat.html and https://www.reddit.com/r/nexus6/comments/3846ay/has_anyone_found_a_fix_for_snapchat_flipping)
您不能为此使用 MediaRecorder。您可以使用 MediaCodec 的 lower-level API 来记录处理过的帧。您需要翻转每一帧 'manually',这可能会对性能造成重大影响,因为通常 MediaRecorder 'connects' 相机以非常有效的方式连接到硬件编码器,甚至不需要将像素复制给用户记忆。 This answer 展示了如何操纵相机渲染到纹理的方式。
您可以通过从表面视图手动录制视频来实现此目的。
在这种情况下,预览和录制将完全匹配。
我一直为此目的使用这个库:
https://github.com/spaceLenny/recordablesurfaceview
这里是如何使用它的指南(不是用相机,而是用 OpenGL 绘图):https://withintent.uncorkedstudios.com/recording-screen-video-on-android-with-recordablesurfaceview-451c9daa213e
我使用 MediaRecorder.When 使用后置摄像头录制视频,它工作正常,但是当使用前置摄像头时,捕获的视频是 flipped/inverse。意味着右边的项目将出现在left.The 相机预览工作正常,只是翻转了最终捕获的视频。
这是相机预览图
但是最后的视频是这样的(左边的所有项目,出现在右边)
到目前为止我尝试了什么:
我尝试在准备记录器时应用 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
}
我已经阅读了下面所有这个问题,但是所有这些似乎都没有解决我的 problem.For 信息,我使用 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个视频短片来说明问题,请下载看看
因此,如果系统相机应用生成的视频与您的应用类似,则您没有做错任何事情。现在是时候了解 front-facing 相机视频录制发生了什么。
前置摄像头与后置摄像头在拍摄静态图片或视频方面没有什么不同。 phone 在屏幕上显示相机预览的方式有所不同。为了让用户看起来更自然,Android(和所有其他系统)镜像预览,这样您就可以像在镜子中一样看到自己。
请务必了解,这仅适用于向您呈现预览的方式。如果你拿起任何视频会议应用程序,连接两只手拿着的两个设备,然后看看你自己,你会惊讶地发现你自己的两个实例被翻转了。
这不是错误,这是向对方展示视频的自然方式。
见草图:
这是你看到的场景:
这是你的同伴看到相同场景的方式
一般情况下,录制视频都是从同伴的角度进行的,如第二张图。这是视频会议等的自然设置。
但 Snapchat 和其他一些社交应用程序选择存储 front-facing 视频剪辑,就好像您从镜子里录制它一样(就像第一张照片上的录音机在您的手中一样)。有些人喜欢这个功能,有些人讨厌它(参见 https://forums.androidcentral.com/general-help-how/664539-front-camera-pics-mirrored-reversed-only-snapchat.html and https://www.reddit.com/r/nexus6/comments/3846ay/has_anyone_found_a_fix_for_snapchat_flipping)
您不能为此使用 MediaRecorder。您可以使用 MediaCodec 的 lower-level API 来记录处理过的帧。您需要翻转每一帧 'manually',这可能会对性能造成重大影响,因为通常 MediaRecorder 'connects' 相机以非常有效的方式连接到硬件编码器,甚至不需要将像素复制给用户记忆。 This answer 展示了如何操纵相机渲染到纹理的方式。
您可以通过从表面视图手动录制视频来实现此目的。 在这种情况下,预览和录制将完全匹配。
我一直为此目的使用这个库:
https://github.com/spaceLenny/recordablesurfaceview
这里是如何使用它的指南(不是用相机,而是用 OpenGL 绘图):https://withintent.uncorkedstudios.com/recording-screen-video-on-android-with-recordablesurfaceview-451c9daa213e