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

Flutter技术问询:如何为上传的视频添加水印?

Flutter + Firebase 视频加水印实现方案

我之前在Flutter项目里搭配Firebase后端,成功实现过视频加水印功能,用的是flutter_ffmpeg包,下面是具体实现步骤:

1. 依赖与配置

在pubspec.yaml中添加带完整滤镜支持的依赖(轻量版可能缺少文字水印等滤镜):

dependencies:
  flutter_ffmpeg: ^0.4.0
  • iOS端:在Info.plist中添加相册访问权限声明:
    <key>NSPhotoLibraryUsageDescription</key>
    <string>需要访问相册处理视频</string>
    <key>NSCameraUsageDescription</key>
    <string>需要拍摄视频</string>
    
  • Android端:在AndroidManifest.xml中添加存储权限:
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    

2. 加水印命令示例

图片水印(最常用场景)

假设你有一张本地水印图片watermark.png,要将其放在视频右下角并设置透明度,执行以下命令:

final FlutterFFmpeg _flutterFFmpeg = FlutterFFmpeg();

// inputPath为原视频本地路径,outputPath为处理后带水印的视频保存路径
String command = '-i $inputPath -i watermark.png -filter_complex "overlay=W-w-10:H-h-10:alpha=0.6" -c:v libx264 -crf 23 -c:a copy $outputPath';

await _flutterFFmpeg.execute(command).then((rc) {
  if (rc == 0) {
    // 处理成功,可继续上传到Firebase Storage
  } else {
    // 处理失败,查看日志排查问题
    _flutterFFmpeg.getLastCommandOutput().then((output) => print(output));
  }
});

参数说明:

  • overlay=W-w-10:H-h-10:W/H为视频宽高,w/h为水印宽高,10是水印与边缘的间距,实现右下角定位
  • alpha=0.6:设置水印透明度(0为完全透明,1为完全不透明)
  • -c:v libx264 -crf 23:指定视频编码器为H.264,crf为质量参数,数值越小画质越高
  • -c:a copy:直接复制原视频音频流,避免重新编码耗时

文字水印

如果需要添加文字水印,使用drawtext滤镜,命令示例:

String command = '-i $inputPath -filter_complex "drawtext=text=\'自定义水印\':fontsize=24:fontcolor=white@0.6:x=W-text_w-10:y=H-text_h-10" -c:v libx264 -crf 23 -c:a copy $outputPath';

await _flutterFFmpeg.execute(command);

参数说明:

  • text=\'自定义水印\':需转义引号,也可改用双引号包裹内容
  • fontsize=24:设置文字大小
  • fontcolor=white@0.6:设置文字颜色与透明度
  • x=W-text_w-10:y=H-text_h-10:将文字定位在右下角,距离边缘10像素

3. 结合Firebase上传流程

  1. 通过文件选择器(如image_picker包)获取原视频的本地路径
  2. 用flutter_ffmpeg处理视频生成带水印的本地文件
  3. 上传到Firebase Storage:
final file = File(outputPath);
final storageRef = FirebaseStorage.instance.ref().child('videos/${DateTime.now().millisecondsSinceEpoch}.mp4');
await storageRef.putFile(file);
// 获取视频下载链接
final downloadUrl = await storageRef.getDownloadURL();

注意事项

  • 若使用轻量版flutter_ffmpeg出现滤镜缺失,建议切换到full版(依赖写为flutter_ffmpeg/full)
  • 处理大视频耗时较长,建议在后台执行并添加进度提示(可通过flutter_ffmpeg的回调获取处理进度)
  • iOS端需确保FFmpeg编译包含所需滤镜,full版已覆盖大部分常用功能

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 13:45:30