如何使批处理文件等待另一个调用的所有进程完成,然后再继续



这个脚本的想法是拍摄一个(讲座(视频,将其分成更小的部分,删除每个片段的静音,然后将它们重新合并在一起,以提高性能,因为消除静音脚本对于较大的视频来说不能很好地缩放。

下面的 3 个批处理脚本在彼此手动启动时可以完美运行,但是当尝试从单个.bat文件启动它们时,我无法阻止它们同时启动,这会在合并阶段产生错误。

以下是 3 个批处理文件:

  1. 分裂.bat
  2. 启动.bat
  3. 合并.bat

拆分.bat创建 10 分钟长的片段,然后启动所有.bat为每个片段启动一个视频删除静音任务。最后,merge.bat创建一个包含所有片段的 mp4 文件。

拆分.bat执行以下操作:

ffmpeg -i in.mp4 -c copy -map 0 -segment_time 00:10:00 -f segment out%%03d.mp4
exit

启动.bat

start start000.bat
start start001.bat
start start002.bat
start start003.bat
...

start000.bat调用如下所示:

python video-remove-silence out000.mp4 --linear 0.0005
exit

合并.bat

:: Create File List
for %%i in (*_result.mp4) do echo file '%%i'>> mylist.txt
:: Concatenate Files
ffmpeg -f concat -safe 0 -i mylist.txt -c copy shortened.mp4
del "C:UsersRomanDesktopdownloadmylist.txt"
del "C:UsersRomanDesktopdownloadout*.mp4"
exit

尝试调用启动/wait时,由于同时执行而发生错误:

START /wait split.bat
START /wait startall2.bat
START /wait merge.bat

所以基本上我的问题是,我如何调用这 3 个脚本并防止合并.bat启动,直到startall.bat中的所有进程都完成?

您可以使用此答案中所述的方法,即您的主批处理文件可能是以下文件:

rem Split:
call split.bat
rem Start all and wait for all to terminate
(
start start000.bat
start start001.bat
start start002.bat
start start003.bat
...
) | pause
rem Merge:
call merge.bat

尽管您说您已经使用call完成了此操作,但我不认为这样做应该导致您报告的问题。您应该在您使用start的所有地方使用Call,并从每个末尾删除exit(如果需要,您也可以将它们更改为exit /bgoto :EOF(:


拆分.bat

@ffmpeg -i in.mp4 -c copy -map 0 -segment_time 00:10:00 -f segment out%%03d.mp4

启动.bat

@Call start000.bat
@Call start001.bat
@Call start002.bat
@Call start003.bat
...

start000.bat调用如下所示:

@python video-remove-silence out000.mp4 --linear 0.0005

合并.bat

@Rem Create File List
@(For %%I In (*_result.mp4) Do @Echo file '%%I') > mylist.txt
@Rem Concatenate Files
@ffmpeg -f concat -safe 0 -i mylist.txt -c copy shortened.mp4
@Del /Q out*.mp4 mylist.txt

执行:

@Call split.bat
@Call startall2.bat
@Call merge.bat

相关内容

  • 没有找到相关文章

最新更新