Jay*_*iyk 3 dart flutter flutter-dependencies flutter-layout
我们如何在Flutter中切换相机预览宽高比?
我希望能够在 1:1、4:3 和 16:9 宽高比之间切换
我正在使用这个相机插件,但它似乎没有这样做的功能。
有什么想法吗?
摄像机输出视频流的分辨率为1280x720或640x480,宽高比为16:9或4:3。当你想使用1:1的宽高比时,首先你需要选择分辨率。如果选择640x480,则需要自行将视频剪辑为480x480。硬件摄像头支持的分辨率数量非常有限,而且方面也是。
如果您只需要在屏幕上渲染目标宽高比,您可以尝试如下代码:
return Center(child: ClipRRect(
child: SizedOverflowBox(
size: const Size(300, 300), // aspect is 1:1
alignment: Alignment.center,
child: CameraPreview(controller),
),
));
}
Run Code Online (Sandbox Code Playgroud)
如果需要从摄像头拍摄视频,则需要使用FFmpeg等库来修改视频文件。
理论上,您应该能够更新 所CameraValue使用的CameraController, 以使用所需的值覆盖 PreviewSize,这应该会更新预览尺寸。
这不起作用。
使用以下代码片段,控制器对象已使用正确的值正确更新,但不会影响渲染。
@override
void initState() {
super.initState();
controller = CameraController(cameras[0], ResolutionPreset.max);
final size = Size(300, 300);
controller.initialize().then((_) {
controller.value = controller.value.copyWith(previewSize: size);
setState(() {});
});
}
@override
Widget build(BuildContext context) {
if (!controller.value.isInitialized) {
return Container();
}
return MaterialApp(
home: SizedBox(
height: 300,
width: 300,
child: CameraPreview(controller),
),
);
}
Run Code Online (Sandbox Code Playgroud)
我什至尝试强制在 300x300 的 SizedBox 中渲染布局,但这没有任何效果。
这背后的原因可能是,在幕后,camera插件正在调用此方法来创建预览:
@override
Widget buildPreview(int cameraId) {
return Texture(textureId: cameraId);
}
Run Code Online (Sandbox Code Playgroud)
关于纹理小部件,文档如下:
矩形的大小由其父窗口小部件确定,并且纹理会自动缩放以适合。
由于它不知道谁是他的父级(我们不在小部件树中,这只是返回纹理小部件的方法),因此它占用了整个可用空间,覆盖了应用程序实现可以设置的任何限制预览。
如果我的分析是正确的,那么这要么是一个错误,要么是为了“强制”我们进行全屏相机预览而实施的。
我仍然不明白为什么这个AspectRatio小部件对渲染没有任何影响。
更新:
我发现官方 Flutter 的 Github 上有一个问题描述了您的问题。这个问题已经在 4 年前提出了:(
https://github.com/flutter/flutter/issues/15953
有几个人已经提供了解决方法,最新的一个应该满足您的需求的可能就是这个。
| 归档时间: |
|
| 查看次数: |
4831 次 |
| 最近记录: |