簡體   English   中英

使用ffmpeg在視頻上添加水印和縮放圖像

[英]Use ffmpeg to watermark and scale an image on video

我希望能夠使用包含網站網址的徽標圖片為視頻添加水印。 視頻可以是不同的格式和尺寸。 我試圖找出一個通用的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有一個縮放選項,但我還沒弄清楚是否可以根據輸入視頻的尺寸調整圖像徽標的大小,這樣我就可以說將徽標縮放到1/3例如視頻長度,並保持圖像比例。

任何的想法? 不需要在單個命令中完成,甚至可以是腳本。 提前致謝。

在此期間,我想出了這個完成工作的腳本:

#!/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

而音頻信息是相同的。 有關如何保持原始視頻質量的任何建議? 謝謝

謝謝你的想法,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發布。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM