这个脚本的想法是拍摄一个(讲座(视频,将其分成更小的部分,删除每个片段的静音,然后将它们重新合并在一起,以提高性能,因为消除静音脚本对于较大的视频来说不能很好地缩放。
下面的 3 个批处理脚本在彼此手动启动时可以完美运行,但是当尝试从单个.bat文件启动它们时,我无法阻止它们同时启动,这会在合并阶段产生错误。
以下是 3 个批处理文件:
- 分裂.bat
- 启动.bat
- 合并.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 /b
或goto :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