【问题标题】:Use ffmpeg to watermark and scale an image on video使用 ffmpeg 对视频上的图像进行水印和缩放
【发布时间】:2011-11-21 21:46:09
【问题描述】:

我希望能够使用包含网站网址的徽标图像为视频添加水印。 视频可以具有不同的格式和尺寸。 我正在尝试找出一个通用的 ffmpeg 命令来实现它,这样我就不必根据我必须处理的视频来调整命令。 到目前为止,我得到了:

ffmpeg -i sample.mov -sameq -acodec copy -vf 'movie=logo.png [watermark]; [in][watermark] overlay=main_w-overlay_w-10:main_h-overlay_h-10 [out]' sample2.mov

这样,虽然徽标在不同大小的视频中看起来太大或太小。 我已经看到 avfilter 有一个scale 选项,但我还没有弄清楚是否可以根据输入视频的尺寸调整图像徽标的大小,所以我可以说将徽标缩放到 1/以视频长度为3,并保持图像比例。

有什么想法吗?不需要在单个命令中完成,甚至可以是一个脚本。 提前致谢。

【问题讨论】:

    标签: ffmpeg watermark


    【解决方案1】:

    与此同时,我想出了这个完成这项工作的脚本:

    #!/bin/bash
    
    VIDEO=$1
    LOGO=$2
    VIDEO_WATERMARKED=w_${VIDEO}
    
    VIDEO_WIDTH=`ffprobe -show_streams $VIDEO 2>&1 | grep ^width | sed s/width=//`
    echo The video width is $VIDEO_WIDTH
    
    cp $LOGO logo.png
    IMAGE_WIDTH=$((VIDEO_WIDTH/3))
    echo The image width will be $IMAGE_WIDTH
    
    mogrify -resize $IMAGE_WIDTH logo.png
    echo logo.png resized
    
    echo Starting watermarking
    ffmpeg -i $VIDEO -sameq -acodec copy -vf 'movie=logo.png [watermark]; [in][watermark] overlay=main_w-overlay_w-10:main_h-overlay_h-10 [out]' $VIDEO_WATERMARKED
    echo Video watermarked
    

    我唯一不确定的是如何保持相同的视频质量。我认为“-sameq”会保持相同的视频质量,但生成的视频尺寸更小。 我注意到了这一点:

    INPUT
    Duration: 00:01:25.53, start: 0.000000, bitrate: 307 kb/s
        Stream #0:0(eng): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), 
    yuv420p, 640x480 [SAR 1:1 DAR 4:3], 261 kb/s, 10 fps, 10 tbr, 3k tbn, 25 tbc
    OUTPUT
       encoder         : Lavf53.20.0
        Stream #0:0(eng): Video: h264 (avc1 / 0x31637661), yuv420p, 640x480 [SAR 1:
    1 DAR 4:3], q=-1--1, 10 tbn, 10 tbc
    

    而音频信息是相同的。 关于如何保持原始视频质量的任何建议? 谢谢

    【讨论】:

    • 感谢您的脚本。选项 '-sameq' 必须更改为 '-qscale 0' 。执行脚本后显示一些错误消息: 选项 'sameq' 已删除。如果您正在寻找保持质量的选项(这不是 -sameq 的用途),请使用 -qscale 0 或等效的质量因子选项。 这里是我的ffmpeg的版本是4.1.3
    【解决方案2】:

    谢谢你的想法,Ae.!

    使用 powershell 也是一样:

    $videoFilename = "..."
    $logoFilename = "..."
    
    $videoInfo = (& "$($ffmpeg)ffprobe.exe" -show_streams -of xml -loglevel quiet $videoFilename) | Out-String
    $videoStreamInfo = Select-Xml -Content $videoInfo -XPath "/ffprobe/streams/stream[@codec_type='video' and @width and @height][1]"
    
    $videoWidth = $videoStreamInfo.Node.width
    $videoHeight = $videoStreamInfo.Node.height
    
    # logo will be 10% orginal video width
    $logoWidth = $videoWidth/10
    
    # preparing arguments
    $a = "-i", $videoFilename, "-i", $logoFilename, "-filter_complex", "[1]scale=$($logoWidth):$($logoWidth)/a [logo]; [0][logo]overlay=main_w-overlay_w-10:10", "-ss", "-y", "-loglevel", "error", $node.output
    # logo actual height is cumputed by ffdshow`s scale filter at "$($logoWidth)/a". a - original video aspect ratio
    
    
    # clear error stream for clear error handling
    $error.Clear()
    # execute ffmpeg
    (& "$($ffmpeg)ffmpeg.exe" $a)
    
    if($error.Count -gt 0){
        Write-Output "error! $error"
    }
    

    这里可以不使用“mogrify”工具,只使用 ffmpeg 分发。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-11
      • 1970-01-01
      • 2019-03-11
      • 1970-01-01
      • 1970-01-01
      • 2016-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多