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

如何用FFmpeg批量给视频加水印并保持输出尺寸与输入一致

问题描述

我想给目录里的视频添加铺满画面的水印,用的是3840x2160的PNG水印图。因为视频分辨率不一样,写了下面的批处理脚本:

set /p add_watermark=Wasserzeichen Addieren? (Standard: ja/nein):
if /i "%add_watermark%" == "" set add_watermark=ja

if /i "%add_watermark%" == "ja" (
    for %%f in (%cd%\output\tmp\*.mp4) do (
        set "filename=%%~nf"
        ffmpeg -i "%%f" -i %cd%\watermark\watermark.png -filter_complex "[0:v][1:v]scale2ref=oh*mdar:ih[v0][v1];[v0][v1]overlay=main_w-overlay_w-0:0" -c:a copy -map 0 -y "%cd%\output\%%~nf.mp4"
    )
)

处理4K视频没问题,但HD视频处理后会被放大到水印的4K尺寸。试着加-c:v copy参数时,FFmpeg直接报错:

Streamcopy requested for output stream fed from a complex filtergraph. Filtering and streamcopy cannot be used together.

想请教怎么一步到位,让输出视频尺寸和输入一致,同时水印自动缩放适配?

解决方案

核心问题是你用scale2ref时搞反了缩放对象——现在是把视频缩成水印的尺寸,而不是让水印跟着视频尺寸走。

直接修改filter_complex的参数即可,调整后的完整脚本:

set /p add_watermark=Wasserzeichen Addieren? (Standard: ja/nein):
if /i "%add_watermark%" == "" set add_watermark=ja

if /i "%add_watermark%" == "ja" (
    for %%f in (%cd%\output\tmp\*.mp4) do (
        set "filename=%%~nf"
        ffmpeg -i "%%f" -i %cd%\watermark\watermark.png -filter_complex "[1:v][0:v]scale2ref=iw:ih[v1][v0];[v0][v1]overlay=0:0" -c:a copy -map 0 -y "%cd%\output\%%~nf.mp4"
    )
)

关键修改点:

  • [1:v][0:v]scale2ref:scale2ref的逻辑是[待缩放流][参考流]scale2ref=参数[缩放后流][原参考流],这里把水印(1:v)设为待缩放流,视频(0:v)设为参考流,让水印跟着视频的尺寸缩放。
  • scale2ref=iw:ih:指定水印缩放后的宽高和原视频完全一致,确保水印铺满整个画面。
  • overlay=0:0:把缩放后的水印直接叠加在视频左上角,自然覆盖全画面。

另外关于-c:v copy的报错:只要用了视频滤镜处理,就必须重新编码视频,没法直接复制原视频流,所以这个参数不能加,保留-c:a copy直接复制音频流即可,能节省处理时间。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 17:15:42