在 Flutter 中切换相机纵横比

Jay*_*iyk 3 dart flutter flutter-dependencies flutter-layout

我们如何在Flutter中切换相机预览宽高比?

我希望能够在 1:1、4:3 和 16:9 宽高比之间切换

我正在使用这个相机插件,但它似乎没有这样做的功能。

有什么想法吗?

wjp*_*oop 7

摄像机输出视频流的分辨率为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等库来修改视频文件。


FDu*_*hen 5

理论上,您应该能够更新 所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

有几个人已经提供了解决方法,最新的一个应该满足您的需求的可能就是这个