我正在尝试在Android前置摄像头录制视频并在surface view上显示。但是,我发现前置摄像头在录制视频时会镜像翻转视频,即使surface view显示正常视图。
有没有办法可以防止或修复这个问题?
我阅读了其他stackoverflow文章,例如如何防止Android翻转前置摄像头的图像?
但它似乎只讨论使用前置摄像头拍照并翻转图像的问题,我已经使用矩阵自己解决了这个问题。然而,似乎对于视频使用矩阵无效。
我正在尝试在Android前置摄像头录制视频并在surface view上显示。但是,我发现前置摄像头在录制视频时会镜像翻转视频,即使surface view显示正常视图。
有没有办法可以防止或修复这个问题?
我阅读了其他stackoverflow文章,例如如何防止Android翻转前置摄像头的图像?
但它似乎只讨论使用前置摄像头拍照并翻转图像的问题,我已经使用矩阵自己解决了这个问题。然而,似乎对于视频使用矩阵无效。
在我的情况下,我只需要在播放时进行水平翻转。当录制时,它已经被翻转以实现镜像效果,而且我认为无法修改它。然而,下面的代码解决了我在播放时的问题。
videoPlayer.setScaleX(-1);
我没有解决方案,但我认为关键是:
MediaRecorder.setOrientationHint
设置输出视频播放的方向提示。此方法应在prepare()之前调用。该方法不会在录制视频过程中触发源视频帧旋转,而是在输出格式为OutputFormat.THREE_GPP或OutputFormat.MPEG_4时添加包含旋转角度的合成矩阵到输出视频中,以便视频播放器可以选择适当的方向进行播放。请注意,某些视频播放器可能会忽略视频中的合成矩阵进行播放。
我正在使用H264录制视频,它对我不起作用:(但它可能会对你有所帮助。你试试吗?
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
dependencies {
implementation 'com.github.MasayukiSuda:Mp4Composer-android:v0.4.1'
}
flipVertical(true)
进行翻转。同样,您也可以通过flipHorizontal(true)
进行水平翻转。private void flipVideo(String path, String destinationPath) {
new Mp4Composer(sourcePath, destinationPath)
.size(1280, 720)
.fillMode(FillMode.PRESERVE_ASPECT_FIT)
//.flipHorizontal(true)
.flipVertical(true)
// .rotation(Rotation.ROTATION_270)
//.filter(glFilter)
//.mute(muteCheckBox.isChecked())
//.timeScale(2f)
//.changePitch(false)
//.trim(2000, 5000)
.listener(new Mp4Composer.Listener() {
@Override
public void onProgress(double progress) {
Log.d("app_log", "onProgress = " + progress);
runOnUiThread(() -> progressBar.setProgress((int) (progress * 100)));
}
@Override
public void onCompleted() {
Log.d("app_log", "onCompleted(): video conversion completed");
runOnUiThread(() -> {
Toast.makeText(CameraActivity.this, "video saved under " + destinationPath, Toast.LENGTH_SHORT).show();
});
}
@Override
public void onCanceled() {
}
@Override
public void onCurrentWrittenVideoTime(long timeUs) {
}
@Override
public void onFailed(Exception exception) {
Log.e("app_log", "onFailed() " + exception.getMessage());
}
})
.start();
}
像这样调用方法:
flipVideo(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/video_input.mp4", Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/video_output.mp4");
更多信息请查看:Mp4Composer-android
你需要应用矩阵变换,就像这样:
if(isFrontCamera) {
m.preScale(-ratio, ratio);
} else {
m.preScale(ratio, ratio);
}
假设您不调整任何内容,则比例为1,使非前置摄像头预缩放变得过时。