在 Windows 10 上使用通配符批量编码 MXF 为 Prores

在 Windows 10 上使用通配符批量编码 MXF 为 Prores

我已经创建了一个脚本,将包含两个独立音频文件的文件编码.mxf到包含两个 ember ed 音轨的 Prores 中,并且运行良好。

但是,我希望能够使用通配符对文件名进行批量编码,那么该怎么做呢?请注意,所有文件都.mxf只有几个不同的数字。这 3 个音轨的最后两位数字似乎都不同。视频以 结尾,音频轨道以&40结尾5060

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),如下所示:6050 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 ... 

相关内容