Batch file 水印不适用于带有感叹号的视频
我制作了一个.bat脚本来为视频添加水印,标志从右向左缓慢滑动。这是我的密码:Batch file 水印不适用于带有感叹号的视频,batch-file,cmd,video-processing,delayedvariableexpansion,video-watermarking,Batch File,Cmd,Video Processing,Delayedvariableexpansion,Video Watermarking,我制作了一个.bat脚本来为视频添加水印,标志从右向左缓慢滑动。这是我的密码: set ffmpeg="C:\ffmpeg\ffmpeg.exe" set ffprobe="C:\ffmpeg\ffprobe.exe" @echo off setlocal enableextensions enabledelayedexpansion for %%A in ("H:\4 - Watermark Process\Before\*.mp4"
set ffmpeg="C:\ffmpeg\ffmpeg.exe"
set ffprobe="C:\ffmpeg\ffprobe.exe"
@echo off
setlocal enableextensions enabledelayedexpansion
for %%A in ("H:\4 - Watermark Process\Before\*.mp4") do (
echo "________________________________________________________________________________________________________________________"
echo _ Filename _: %%A
rem Find videoDuration
for /F "delims=" %%G in ('ffprobe.exe -v error -show_entries format^=duration -of default^=noprint_wrappers^=1:nokey^=1 "%%A" 2^>^&1') do (
set /A videoDuration=%%G/1
echo _ Video Duration _: !videoDuration!
)
rem Find videoWidth
for /F "delims=" %%I in ('ffprobe -v error -show_entries stream^=width -of csv^=p^=0:s^=x "%%A"') do (
set videoWidth=%%I
echo _ Video Width _: !videoWidth!
)
rem Find videoHeight
for /F "delims=" %%J in ('ffprobe -v error -show_entries stream^=height -of csv^=s^=x:p^=0 "%%A"') do (
set videoHeight=%%J
echo _ Video Height _: !videoHeight!
)
rem Scale logo watermark according to video Width and Height
if !videoHeight! LSS !videoWidth! (
echo "_ videoHeight LESS THAN videoWidth _"
set /A scaleWidth = !videoWidth!/10
ffmpeg -i logo.png -y -v verbose -vf scale=!scaleWidth!:-1 scaled.png
) else (
echo "_ videoHeight GREATER THAN videoWidth _"
set /A scaleWidth = !videoWidth!/4
ffmpeg -i logo.png -y -v verbose -vf scale=!scaleWidth!:-1 scaled.png
)
rem Place logo watermark based on video Duration
if !videoDuration! LSS 10 (
echo "_ videoDuration LESS THAN 10 seconds _"
echo "________________________________________________________________________________________________________________________"
ffmpeg -i "%%A" -i scaled.png -filter_complex "overlay=10:main_h-overlay_h" "H:\4 - Watermark Process\After\%%~nA.mp4"
echo "______________________________________________LESS THAN 10SEC CONVERSION COMPLETE__________________________________________________________________________"
)
if !videoDuration! GEQ 10 (
set /A "videoDurationOneThird=(videoDuration*2)/3"
echo _ videoDuration One Third _: !videoDurationOneThird!
echo "________________________________________________________________________________________________________________________"
ffmpeg -i "%%A" -i scaled.png -filter_complex "[0:v][1:v] overlay='if(gte(t,!videoDurationOneThird!), (main_w-(w+(t-!videoDurationOneThird!)*20)), NAN)':(main_h-overlay_h)/2:enable=between'(t,!videoDurationOneThird!,!videoDuration!)'" "H:\4 - Watermark Process\After\%%~nA.mp4"
)
)
pause 10
问题是我在带有感叹号的视频中遇到了一个错误,上面写着:没有这样的文件或目录
我读到启用延迟扩展会删除感叹号,但我需要它才能使脚本正常工作。我怎样才能解决这个问题
我尝试过的失败解决方案如下:
set ffmpeg="C:\ffmpeg\ffmpeg.exe"
set ffprobe="C:\ffmpeg\ffprobe.exe"
@echo off
setlocal enableextensions disabledelayedexpansion
for %%A in ("H:\4 - Watermark Process\BeforeWide\*.mp4") do (
set FILE=%%~A
set NAME=%%~nA
echo "________________________________________________________________________________________________________________________"
echo _ Filename _: !FILE!
setlocal enabledelayedexpansion
rem Find videoDuration
for /F "delims=" %%G in ('ffprobe.exe -v error -show_entries format^=duration -of default^=noprint_wrappers^=1:nokey^=1 !FILE! 2^>^&1') do (
set /A videoDuration=%%G/1
echo _ Video Duration _: !videoDuration!
)
rem Find videoWidth
for /F "delims=" %%I in ('ffprobe -v error -show_entries stream^=width -of csv^=p^=0:s^=x !FILE!') do (
set videoWidth=%%I
echo _ Video Width _: !videoWidth!
)
rem Find videoHeight
for /F "delims=" %%J in ('ffprobe -v error -show_entries stream^=height -of csv^=s^=x:p^=0 !FILE!') do (
set videoHeight=%%J
echo _ Video Height _: !videoHeight!
)
rem Scale logo watermark according to video Width and Height
if !videoHeight! LSS !videoWidth! (
echo "_ videoHeight LESS THAN videoWidth _"
set /A scaleWidth = !videoWidth!/10
ffmpeg -i logo.png -y -v verbose -vf scale=!scaleWidth!:-1 scaled.png
) else (
echo "_ videoHeight GREATER THAN videoWidth _"
set /A scaleWidth = !videoWidth!/4
ffmpeg -i logo.png -y -v verbose -vf scale=!scaleWidth!:-1 scaled.png
)
rem Place logo watermark based on video Duration
if !videoDuration! LSS 10 (
echo "_ videoDuration LESS THAN 10 seconds _"
echo "________________________________________________________________________________________________________________________"
ffmpeg -i !FILE! -i scaled.png -filter_complex "overlay=10:main_h-overlay_h" "H:\4 - Watermark Process\After\!NAME!.mp4"
echo "______________________________________________LESS THAN 10SEC CONVERSION COMPLETE__________________________________________________________________________"
)
if !videoDuration! GEQ 10 (
set /A "videoDurationOneThird=(videoDuration*2)/3"
echo _ videoDuration One Third _: !videoDurationOneThird!
echo "________________________________________________________________________________________________________________________"
ffmpeg -i !FILE! -i scaled.png -filter_complex "[0:v][1:v] overlay='if(gte(t,!videoDurationOneThird!), (main_w-(w+(t-!videoDurationOneThird!)*20)), NAN)':(main_h-overlay_h)/2:enable=between'(t,!videoDurationOneThird!,!videoDuration!)'" "H:\4 - Watermark Process\After\!NAME!.mp4"
)
endlocal
)
pause 10
根据您提供的信息,这里有一个未经测试的示例:
@Echo关闭
SetLocal EnableExtensions DisableDelayedExpansion
设置“Source=H:\4-水印进程”
设置“Before=BeforeWide”
设置“After=After”
设置“Glob=*.mp4”
设置“ffmpeg=C:\ffmpeg\ffmpeg.exe”
设置“ffprobe=C:\ffmpeg\ffprobe.exe”
设置“logo=%CD%\logo.png”
设置“缩放=%CD%\scaled.png”
对于%%A In(“%Source%\%Before%\%Glob%”之前的%%Source%\%(
设置“全名=%%A”
设置“NameOnly=%%~nxA”
如果不存在“%Source%\%After%\”MD“%Source%\%After%”||转到:EOF 2>NUL
SetLocal EnableDelayedExpansion
回音________________________________________________________________________________________________________________________
Echo u文件名uu:!全名!
设置/A“视频持续时间=视频宽度=视频高度=0”
Rem查找视频持续时间
对于/F Delims^=^EOL^=%%G In(
“^”“%ffprobe%”-v错误-显示条目格式^=duration-of default^=noprint\u wrappers^=1:nokey^=1”!FullName!(2^>^&1^”
)设置/A“videoDuration=%%G/1”2>NUL
回声视频持续时间!视频持续时间!
Rem查找视频宽度
对于/F Delims^=^EOL^=%%I(
“^”“%ffprobe%”-v错误-显示\u条目流^=width-of csv^=p^=0:s^=x”!全名!”^”
)设置/A“videoWidth=%%I”2>NUL
回声视频宽度!视频宽度!
Rem查找视频高度
对于/F Delims^=^EOL^=%%J In(
“^”“%ffprobe%”-v错误-显示\u条目流^=height-of csv^=s^=x:p^=0”!全名!”^”
)设置/A“videoHeight=%%J”2>NUL
回声视频高度!视频高度!
Rem根据视频宽度和高度缩放徽标水印
如果!视频高度!Lss!视频宽度(
回波高度小于视频宽度_
设置/A“缩放宽度=视频宽度/10”
)否则(
回波高度大于视频宽度_
设置/A“缩放宽度=视频宽度/4”
)
“%ffmpeg%”-i“%logo%”-y-v verbose-vf scale=!scaleWidth!:-1“%scaleWidth%”
基于视频持续时间的Rem-Place标志水印
如果!视频持续时间!Lss 10(
回声持续时间小于10秒_
回音________________________________________________________________________________________________________________________
“%ffmpeg%”-i“!FullName!”-i“%scaled%”-filter\u complex“overlay=10:main\u h-overlay\u h”%Source%\%After%\!name only!“
回声小于10秒转换完成___________________________________________
)
如果!视频持续时间!GEQ10(
设置/A“videoDurationOneThird=(videoDuration*2)/3”
回声持续时间三分之一!持续时间三分之一!
回音________________________________________________________________________________________________________________________
“%ffmpeg%”-i“!FullName!”-i“%scaled%”-filter_complex”[0:v][1:v]overlay='if(gte(t,!videoDurationOneThird!),(main_w-(w+(t-!videoDurationOneThird!),NAN):(main_h-overlay)/2:enable=between'(t,!videoDurationOneThird!,!videoDuration!)“%Source%\%After%\!name only!”
)
端部
)
%SystemRoot%\System32\timeout.exe/T 10/NoBreak 1>numl
您应该只需要在隔离的
集合
组中修改变量值。请注意,我对.png
文件使用了%CD%
,因为您没有提供位置。但是,由于您也没有设置当前目录,因此这些文件实际上可能与正在运行的脚本位于同一目录中。如果是这种情况,您应该将%CD%
更改为%~dp0
,问题是在启用延迟扩展时,您将用于元变量%%A
,因此任何代码>被延迟扩展消耗;要解决这个问题,您需要在%%A in…
的循环出现之前禁用延迟扩展,然后在循环体中,首先设置一些变量(如set“FILE=%%~A”&set“NAME=%%~nA”
),然后启用延迟扩展,然后使用这些变量(因此,请使用!FILE!
而不是%%A
和!NAME!
而不是%%~nA
)最后,将endlocal
作为循环体中的最后一个命令…命令行set/A videoDuration=%%G/1
非常有趣。它会导致set输出一条错误消息,以处理浮点值上的STDERR,如20.43
被分配给循环变量G
和环境变量 videoDuration
接下来用值20
定义。对于/F“delims=”使用时,根本不需要这个带算术表达式的命令行%%G在…
.aschipfl中。我尝试了你的解决方案,但它出现了错误。你能检查我的代码吗?我编辑了帖子pause 10
和刚才的pause
之间的区别是什么?命令pause
不支持/?
以外的参数,这会导致打印关于该问题的小帮助s简单的命令。timeout
可能更适合您的任务。运行timeout/?
获取此命令的默认帮助,因为Windows Vista是一个外部命令,即具有完整限定文件名的可执行文件%SystemRoot%\System32\timeout.exe
。您已经有效地使用了if!videoHeight!LSS!videoWidth!(echo“\uvideoheight小于videoWidth”)否则echo“\uvideoheight大于videoWidth”
h