You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中实现正方形视频录制的技术咨询

实现Flutter相机录制正方形视频的方案

当然可以通过配置相机参数实现正方形视频输出!你之前的代码只是把预览画面裁剪成了正方形,但相机实际录制的还是默认的矩形分辨率,所以导出的视频自然还是矩形。下面是具体的解决步骤:

1. 优先选择相机硬件支持的正方形分辨率

大多数现代相机硬件都支持1:1的正方形分辨率(比如1080x1080、720x720),我们可以在初始化相机控制器时指定这个分辨率,让相机直接录制正方形的视频流。

代码示例:筛选并使用正方形分辨率

import 'package:camera/camera.dart';

// 在初始化相机的异步方法中
Future<void> initCamera() async {
  // 获取设备上的可用相机
  final cameras = await availableCameras();
  final targetCamera = cameras.first; // 可根据需求切换前置/后置相机

  // 筛选出所有宽高比为1:1的分辨率
  final squareResolutions = targetCamera.resolutions
      .where((res) => res.width == res.height)
      .toList();

  CameraResolution selectedResolution;
  if (squareResolutions.isNotEmpty) {
    // 选择分辨率最高的正方形选项(也可根据需求选其他)
    selectedResolution = squareResolutions.reduce(
      (a, b) => a.width > b.width ? a : b,
    );
  } else {
    // 如果没有原生正方形分辨率,退而求其次选最接近1:1的(或后续做裁剪处理)
    selectedResolution = targetCamera.resolutions.first;
    print("当前相机不支持原生正方形分辨率,将使用默认分辨率后续裁剪");
  }

  // 初始化相机控制器,指定正方形分辨率
  _controller = CameraController(
    targetCamera,
    selectedResolution,
    enableAudio: true, // 根据需求开启/关闭音频
  );

  await _controller.initialize();
  // 刷新UI
  setState(() {});
}

2. 简化预览布局

因为现在相机的预览分辨率本身就是正方形的,你之前的复杂预览布局可以大幅简化,直接使用CameraPreview即可:

@override
Widget build(BuildContext context) {
  if (!_controller.value.isInitialized) {
    return const Center(child: CircularProgressIndicator());
  }
  final size = MediaQuery.of(context).size.width;
  return Container(
    width: size,
    height: size,
    child: CameraPreview(_controller),
  );
}

3. 无原生正方形分辨率时的 fallback 方案

如果目标设备相机不支持原生1:1分辨率,那只能先录制矩形视频,再通过视频裁剪工具转为正方形。可以使用flutter_ffmpeg这类库来处理,示例代码如下(仅作参考):

import 'package:flutter_ffmpeg/flutter_ffmpeg.dart';

// 录制完成后裁剪视频为正方形
Future<void> cropVideoToSquare(String inputPath, String outputPath) async {
  final flutterFFmpeg = FlutterFFmpeg();
  // FFmpeg命令:裁剪画面中心区域为正方形
  final command = "-i $inputPath -vf crop=min(iw\,ih):min(iw\,ih) $outputPath";
  final result = await flutterFFmpeg.execute(command);
  if (result == 0) {
    print("视频裁剪成功");
  } else {
    print("视频裁剪失败,错误码:$result");
  }
}

这种方式会增加额外的处理时间和性能消耗,所以优先推荐使用硬件原生支持的正方形分辨率方案。

内容的提问来源于stack exchange,提问作者Alessio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 08:37:28