有一個 cmd 代碼(見下面的代碼)。您不能在 Powershell 中執行此操作,因為我在 cmd 中需要它。此代碼與 ffmpeg 軟體一起將視頻切片。關鍵是,在 ffmpeg 作業之前,我創建命令MD 檔案夾 result_%%i并為每個處理的檔案放置 ffmpeg 處理的所有結果(視頻檔案):result_%%i/%%id.mp4
問題:如何在檔案夾中為 10 個輸出切片中的每一個創建一個子檔案夾并將它們放在那里?相應地,result_%%i 檔案夾中會有幾個子檔案夾。
例如,子檔案夾應編號為result_1_%%i。因此,任何檔案的完整路徑將如下所示:result_%%i/result_1_%%i/%%id.mp4
@echo off
for %%i in (*.mov) do (
MD result_%%i
ffmpeg -i "%%i" -filter_complex "[0:v]boxblur=40,scale=1080x1920,setsar=1[bg];[0:v]scale=1080:1920:force_original_aspect_ratio=decrease[fg];[bg][fg]overlay=y=(H-h)/2" -c:v libx264 -profile:v main -level:v 3.0 -x264-params scenecut=0:open_gop=0:min-keyint=72:keyint=72 -c:a aac -preset slow -crf 23 -r 30 -sn -force_key_frames "expr: gte(t, n_forced * 0.5)" -f segment -segment_time 14.5 -reset_timestamps 1 result_%%i/%%i%d.mp4
)
pause
uj5u.com熱心網友回復:
這是此任務的批處理檔案。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
(for %%i in (*.mov) do (
md "result_%%~ni"
ffmpeg.exe -i "%%i" -filter_complex "[0:v]boxblur=40,scale=1080x1920,setsar=1[bg];[0:v]scale=1080:1920:force_original_aspect_ratio=decrease[fg];[bg][fg]overlay=y=(H-h)/2" -c:v libx264 -profile:v main -level:v 3.0 -x264-params scenecut=0:open_gop=0:min-keyint=72:keyint=72 -c:a aac -preset slow -crf 23 -r 30 -sn -force_key_frames "expr: gte(t, n_forced * 0.5)" -f segment -segment_time 14.5 -reset_timestamps 1 "result_%%~ni\%%~ni%d.mp4"
if not errorlevel 1 set "FolderName=result_%%~ni" & call :MoveFiles
)) & exit /B
:MoveFiles
set "FolderCount=0"
:FolderLoop
set /A FolderCount =1
set "SlicesFolder=%FolderName%\Slices_%FolderCount%"
md "%SlicesFolder%"
set "FileCount=0"
for %%j in ("%FolderName%\*.mp4") do (
setlocal EnableDelayedExpansion
if !FileCount! == 10 endlocal & goto FolderLoop
endlocal
move "%%j" "%SlicesFolder%\" >nul
set /A FileCount =1
)
goto :EOF
讓我們假設啟動批處理檔案時的當前目錄包含電影檔案Development & Test(!) 100%.mov。
批處理檔案result_Development & Test(!) 100%在當前目錄中創建子目錄。
然后批處理檔案運行ffmpeg.exe,它在此目錄中創建檔案:
Development & Test(!) 100%_001.mp4
Development & Test(!) 100%_002.mp4
Development & Test(!) 100%_003.mp4
Development & Test(!) 100%_004.mp4
Development & Test(!) 100%_005.mp4
Development & Test(!) 100%_006.mp4
Development & Test(!) 100%_007.mp4
Development & Test(!) 100%_008.mp4
Development & Test(!) 100%_009.mp4
Development & Test(!) 100%_010.mp4
Development & Test(!) 100%_011.mp4
Development & Test(!) 100%_012.mp4
該子例程在另外兩個子目錄MoveFiles中創建并將檔案移動到其中。result_Development & Test(!) 100%所以最終的目錄結構是:
- 結果_開發和測驗(!) 100%
- 切片_1
- 開發與測驗(!) 100%_001.mp4
- 開發與測驗(!) 100%_002.mp4
- 開發與測驗(!) 100%_003.mp4
- 開發與測驗(!) 100%_004.mp4
- 開發與測驗(!) 100%_005.mp4
- 開發與測驗(!) 100%_006.mp4
- 開發與測驗(!) 100%_007.mp4
- 開發與測驗(!) 100%_008.mp4
- 開發與測驗(!) 100%_009.mp4
- 開發與測驗(!) 100%_010.mp4
- 切片_2
- 開發與測驗(!) 100%_011.mp4
- 開發與測驗(!) 100%_012.mp4
- 切片_1
該命令exit /B可以替換為發布代碼下方goto SliceDone的標簽,更多命令列替換為最后一個命令列。:SliceDoneendlocal
要了解所使用的命令及其作業原理,請打開命令提示符視窗,在其中執行以下命令,并仔細閱讀每個命令顯示的所有幫助頁面。
call /?echo /?endlocal /?exit /?for /?goto /?if /?md /?move /?set /?setlocal /?
也可以看看:
- 有關使用命令重定向運算子的Microsoft 檔案,以了解
>nul. - 使用 Windows 批處理檔案解釋運算子的單行多命令
&。 - GOTO :EOF 回傳到哪里?
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/479831.html
