android - 相机应用程序翻转录制的视频
问题描述
我正在为摄像机开发一个 Android 应用程序,我正在为我的应用程序使用新的 CameraX Api。这个 api 非常容易实现,并且在我的应用程序中一切正常,但问题在于我的前置摄像头录制。如果我打开前置摄像头,它会向我显示镜像,这对于每个摄像头视图来说都是正常且正常的,但如果我使用前置摄像头录制视频,则录制的视频会水平翻转。我怎样才能防止该视频翻转?我想像 Snapchat 或 Instagram 一样录制视频
private void startCamera() {
CameraX.unbindAll();
Rational aspectRatio = new Rational (textureView.getWidth(), textureView.getHeight());
Size screen = new Size(textureView.getWidth(), textureView.getHeight()); //size of the screen
PreviewConfig pConfig = new PreviewConfig.Builder().setLensFacing(lensFacing).setTargetAspectRatio(aspectRatio).setTargetResolution(screen).build();
final Preview preview = new Preview(pConfig);
preview.setOnPreviewOutputUpdateListener(
new Preview.OnPreviewOutputUpdateListener() {
//to update the surface texture we have to destroy it first then re-add it
@Override
public void onUpdated(Preview.PreviewOutput output){
ViewGroup parent = (ViewGroup) textureView.getParent();
parent.removeView(textureView);
parent.addView(textureView, 0);
textureView.setSurfaceTexture(output.getSurfaceTexture());
updateTransform();
}
});
ImageCaptureConfig imageCaptureConfig = new ImageCaptureConfig.Builder().setLensFacing(lensFacing).setCaptureMode(ImageCapture.CaptureMode.MIN_LATENCY)
.setTargetRotation(getWindowManager().getDefaultDisplay().getRotation()).build();
final ImageCapture imgCap = new ImageCapture(imageCaptureConfig);
VideoCaptureConfig videoCaptureConfig = new VideoCaptureConfig.Builder().setLensFacing(lensFacing)
.setAudioRecordSource(MediaRecorder.AudioSource.MIC)
.setTargetRotation(getWindowManager().getDefaultDisplay().getRotation()).build();
final VideoCapture videoCapture = new VideoCapture(videoCaptureConfig);
findViewById(R.id.vidStart).setOnClickListener(new View.OnClickListener() {
@SuppressLint("RestrictedApi")
@Override
public void onClick(View v) {
File file = new File(Environment.getExternalStorageDirectory() + "/" + System.currentTimeMillis() + ".mp4");
imgCap.takePicture(file, new ImageCapture.OnImageSavedListener() {
@Override
public void onImageSaved(@NonNull File file) {
String msg = "Pic captured at " + file.getAbsolutePath();
Toast.makeText(getBaseContext(), msg,Toast.LENGTH_LONG).show();
}
@Override
public void onError(@NonNull ImageCapture.UseCaseError useCaseError, @NonNull String message, @Nullable Throwable cause) {
String msg = "Pic capture failed : " + message;
Toast.makeText(getBaseContext(), msg,Toast.LENGTH_LONG).show();
if(cause != null){
cause.printStackTrace();
}
}
});
videoCapture.startRecording(file, new VideoCapture.OnVideoSavedListener() {
@Override
public void onVideoSaved(@NonNull File file) {
String msg = "Vid captured at " + file.getAbsolutePath();
Toast.makeText(getBaseContext(), msg,Toast.LENGTH_LONG).show();
}
@Override
public void onError(VideoCapture.UseCaseError useCaseError, String message, @Nullable Throwable cause) {
}
});
}
});
findViewById(R.id.vidStop).setOnClickListener(new View.OnClickListener() {
@SuppressLint("RestrictedApi")
@Override
public void onClick(View v) {
videoCapture.stopRecording();
}
});
//bind to lifecycle:
CameraX.bindToLifecycle(this, preview, videoCapture);
}
解决方案
翻转输出是预期的。在大多数设备中,令人困惑的部分是预览会话而不是录制。
在前置摄像头预览中,镜面预览是为了方便用户使用前置摄像头。
您需要阅读此 SO 答案以深入理解。 如何制作由前置摄像头捕获的视频,而不是逆向安卓
推荐阅读
- vim - VIM 无法使用文件的相对路径地址按预期工作
- kubernetes - 气流调度器无法连接到 Kubernetes 服务 api
- signal-processing - 如何将频域图转换为时域图
- r - 如何访问位于列表中的特定列和矩阵行?(在 R 中)
- python - SQL 字符串出错:“连接到 PostgreSQL 运算符时出错:日期 = 整数”
- vb.net - VB.net 创建字节后删除文件
- gatsby - 如何从 gatsby wordpress 获取超过 100 个提取的数据结果
- sql-server - 使用 UNION 语句排序
- python-3.x - 在看板视图的标题上添加按钮
- javascript - 在 Firefox 26 中下载 webform JSON 对象列表