Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 水印不适用于带有感叹号的视频_Batch File_Cmd_Video Processing_Delayedvariableexpansion_Video Watermarking - Fatal编程技术网

Batch file 水印不适用于带有感叹号的视频

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"

我制作了一个.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") 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