我已经创建了一个脚本,将包含两个独立音频文件的文件编码.mxf
到包含两个 ember ed 音轨的 Prores 中,并且运行良好。
但是,我希望能够使用通配符对文件名进行批量编码,那么该怎么做呢?请注意,所有文件都.mxf
只有几个不同的数字。这 3 个音轨的最后两位数字似乎都不同。视频以 结尾,音频轨道以&40
结尾50
60
ffmpeg -i 584198C1V01.5DE998CB.63FF40.mxf ^
-i 584198C1A01.5DE998CB.63FE60.mxf ^
-i 584198C1A02.5DE998CB.63FE50.mxf ^
-c:v prores_ks -profile:v 3 -pix_fmt yuva444p10le -qscale:v 9 -r 25 ^
-vf yadif -c:a pcm_s16le -map 0:v:0 -map 1:a:0 -map 2:a:0 "Output.mov"
任何意见都将不胜感激。
答案1
@echo Off
cd /d "%~dp0" && color 0A
setlocal EnableDelayedExpansion
color 0A & title <nul & title %~nx0
set "_ffmpeg=C:\FFmpeg\bin\ffmpeg.exe"
set "_stats=-hide_banner -v error -stats"
set "_arg1=c:v prores_ks -profile:v 3 -pix_fmt yuva444p10le -qscale:v 9"
set "_arg2=-r 25 -vf yadif -c:a pcm_s16le -map 0:v:0 -map 1:a:0 -map 2:a:0"
for %%i in (*40.mxf)do set "_fname=%%~dpnxi" && for /f ^tokens^=* %%x in ('
cmd.exe /v/c "echo= -i "!_fname:~0^,-6!60.mxf" -i "!_fname:~0^,-6!50.mxf!""
')do "!_ffmpeg!" "%%~i" %%x !_arg1! !_arg2! "!_fname:~0,-6!00.mov" !_stats!
1.- 你的家庭作业:
以与您的场景兼容的方式替换下面的变量,并转到您的 bat 文件夹:
set "_ffmpeg=C:\FFmpeg\bin\ffmpeg.exe"⇨ set "_ffmpeg=C:\Full\Path\To\FFmpeg\bin\ffmpeg.exe"准备此批处理时考虑到它将被保存并执行在包含要处理的文件的文件夹中,否则:编辑:
cd /d "%~dp0"⇨ cd /d "c:\Folder\Path\To\FilesMXFs"
2.为此,使用一个简单的for
列表列出所有文件60.mxf
,对于每个文件输出,将完整路径保存在变量中(full/path/name):
for %%i in (*40.mxf)do set "_fname=%%~dpnxi"
3.For /F
对此echo=
完整路径/名称使用一个附加_fmane
变量保存,但裁剪最后 6 个字符( ),并添加/:~0,-6
的字符串,以及强制执行附加任务说明(观察:1 和 2),如下所示:60
50 respectively
... for /f ^tokens^=* %%x in ('
cmd.exe /v/c "echo= -i "!_fname:~0^,-6!60.mxf" -i "!_fname:~0^,-6!50.mxf!""
')do ...
观察:1下面是不换行的相同代码:
for /f ^tokens^=* %%x in ('cmd.exe /v/c "echo= -i "!_fname:~0^,-6!60.mxf" -i "!_fname:~0^,-6!50.mxf!""')do ..
观察:2运行时循环For /f
通过调用获取输出cmd /v:on /c "command"
cmd /v:on ["EnableDelayedExpansion" My Variables] /c [ in "Run Time/This Execution"]
cmd /?
/V:ON Enable delayed environment variable expansion using ! as the
delimiter. For example, /V:ON would allow !var! to expand the
variable var at execution time. The var syntax expands variables
at input time, which is quite a different thing when inside of a FOR
loop.
/C Carries out the command specified by string and then terminates
[Note 1] cmd.exe /v:on is the same ⇨ cmd.exe /v | cmd.exe /v
[Note 2] cmd.exe /v:on /c is the same ⇨ cmd.exe /v:on /c | cmd.exe /v /c | cmd /v/c | cmd/v/c
[Note 3] cmd.exe /v:on /c is the same %comspec% ⇨ %comspec% /v:on /c | %comspec%/v:on /c | %comspec%/v/c
4.为了方便 ffmpeg 参数的组成,您可以按照传递的顺序将键添加到输入文件中,40 与第一个循环的变量一起,但 60 和 50 放在第二个循环的 echo 中:
for %%i in (*40.mxf)do ......................................................
................... -i "!_fname:~0^,-6!60.mxf" -i "!_fname:~0^,-6!50.mxf!"
')do "!_ffmpeg!" "%%~i" %%x
Rem :: Your ffmepg command "!_ffmpeg!" "%%~i" %%x results in the following layout ::
"!_ffmpeg!" | -i | "%%~i" | %%x |
_____________|_____|___________________|_________________________________________________|
"ffmpeg.exe" -i "C:\Path\FileF40.mxf" -i "C:\Path\FileF60.mxf" -i "C:\Path\FileF50.mxf"
5.ffmpeg 的参数/参数通常很长,就像您的一样,因此arg1
和的arg2
定义是为了组成一行,所以我明白如果您喜欢以传统方式使用它,则很容易编辑它:
set "_arg1=c:v prores_ks -profile:v 3 -pix_fmt yuva444p10le -qscale:v 9"
set "_arg2=-r 25 -vf yadif -c:a pcm_s16le -map 0:v:0 -map 1:a:0 -map 2:a:0"
...
... "!_ffmpeg!" .... .... !_arg1! !_arg2! .... ...
6.您还需要为目标文件的名称定义一个布局,只需使用output.mov
,它会导致某些文件在某些时候被覆盖,主要是循环遍历多个文件,因此建议使用相同的名称和00.mov
,以与输入相同的方式使用子字符串,并且已在项目中解释2.:
.... --input C:\Path\FileF40.mxf -input... _arg1.. _arg2 ... --output C:\Path\FileF00.mov
7.关于_stats变量:set "_stats=-hide_banner -v error -stats"
它试图将 ffmpeg 执行的输出保持在一行中,在执行过程中进行自我重写,其中,只有当出现任何潜在错误时,它才会断行,从而便于监控整个执行过程,而不需要让屏幕快速充满信息,从而更容易、更快地感知脚本本身的执行/代码中的一些错误......
set "_stats=-hide_banner -v error -stats" ..... ')do "!_ffmpeg!" "%%~i" %%x !_arg1! !_arg2! "!_fname:~0,-6!00.mov" !_stats!
观察:3显然,正如我们在我的土地上所说的那样,马与主人的意愿息息相关,如果你希望/需要一个常规的代码布局而不需要任何额外的建议、变量等,那么:
@echo Off setlocal EnableDelayedExpansion for %%i in (*40.mxf)do ( set "_fname=%%~dpnxi" for /f ^tokens^=* %%x in ('cmd.exe /v/c "echo= -i "!_fname:~0^,-6!60.mxf" -i "!_fname:~0^,-6!50.mxf!""')do ( "C:\FFmpeg\Path-To\Bin\ffmpeg.exe" "%%~i" %%x c:v prores_ks -profile:v 3 -pix_fmt yuva444p10le -qscale:v 9 -r 25 -vf yadif -c:a pcm_s16le -map 0:v:0 -map 1:a:0 - map 2:a:0 "output.mov" ) ) %__APPDIR__%Timeout.exe /t -1 & endlocal && goto=:EOF
还有一件事:
如果你需要
/R
在某些时候是递归的:for %%i in (*40.mxf)do ...⇨ for /r "c:\Folder\Path\To\FilesMXFs" %%i in (*40.mxf)do ...