2011-11-21 124 views
4

我希望能夠使用包含網站網址的徽標圖像對視頻進行水印。 視頻可以具有不同的格式和尺寸。 我試圖找出一個通用的ffmpeg命令來實現它,這樣我就不必根據我必須處理的視頻來調整命令。 到目前爲止,我得到:使用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 

這樣雖然徽標將看起來過大或過小,不同尺寸的視頻。 我已經看到有一個scale選項的avfilter,但我還沒有弄清楚是否有可能根據輸入視頻的尺寸調整圖像標誌的大小,以便我可以說要將標誌縮放到1/3例如視頻長度,並保持圖像比例。

有什麼想法?不需要在一個命令中完成,甚至可以是一個腳本。 在此先感謝。

回答

2

在此期間,我想出了這個腳本,沒有工作:

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

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

1

謝謝你的想法,愛。

同樣的事情,使用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的分佈。