批处理脚本 + FFmpeg——使用 FOR 循环来管道和连接找到的除最后一个文件之外的所有文件
Batch Script + FFmpeg -- Use FOR loop to pipe AND concat all files found except last file
我正在尝试将一个文件夹中的所有“.mp4”文件转换为“.ts”文件,以便我可以使用FFmpeg.exe将它们全部组合成一个长的“.mp4”视频。
我在使用ffmpeg时必须使用concat
命令来合并.ts文件。
下面是执行此操作的有效代码行....我想使用 for 循环以防我要组合的文件不止 3 个。
ffmpeg.exe -hide_banner -y -i concat:"a.ts|b.ts|c.ts" -c copy -bsf:a aac_adtstoasc "COMBINED.mp4"
我可以使用下面的 for command
让这个循环工作,但是找到的最后一个文件后面不能有管道 |
就像上面的 c.ts"
一样没有。
FOR /F "USEBACKQ TOKENS=* DELIMS= ,|" %%I IN ('%%~dpnG.ts') DO (
SET FNAME=%%~dpnI
ECHO.
ECHO !FNAME!
PAUSE>NUL
EXIT
)
有谁知道是否可以(可能使用令牌)在批处理文件中执行此操作?如果没有任何建议? PowerShell?
为了回答 Compo 的问题,这是我的工作脚本:
@ECHO OFF
SETLOCAL
COLOR 0A
TITLE CONCAT MULTIPLE MP4 FILES
PUSHD "%~dp0"
SET FF="C:\MAB\local64\bin-video\ffmpeg.exe"
:: SET VIDEO NAME WITHOUT EXTENSION (.MP4)
SET IN01=a
SET IN02=b
SET IN03=c
SET COMBINED=FULL
:: CREATE TEMP .TS VIDEOS OF THE FILES YOU WANT TO COMBINE
%FF% -hide_banner -y -i "%IN01%.mp4" -c copy -bsf:v h264_mp4toannexb -f mpegts "%IN01%.ts"
%FF% -hide_banner -y -i "%IN02%.mp4" -c copy -bsf:v h264_mp4toannexb -f mpegts "%IN02%.ts"
%FF% -hide_banner -y -i "%IN03%.mp4" -c copy -bsf:v h264_mp4toannexb -f mpegts "%IN03%.ts"
:: COMBINE TEMP .TS FILES INTO COMBINED .MP4
%FF% -hide_banner -y -i concat:"%IN01%.ts|%IN02%.ts|%IN03%.ts" -c copy -bsf:a aac_adtstoasc "%COMBINED%.mp4"
ECHO.
PAUSE
EXIT
这是一个示例脚本,根据我的理解,它应该可以满足您的需要:
@ECHO OFF
SETLOCAL ENABLEEXTENSIONS DISABLEDELAYEDEXPANSION
COLOR 0A
TITLE CONCAT MULTIPLE MP4 FILES
SET "FF=C:\MAB\local64\bin-video\ffmpeg.exe"
SET "COMBINEDBASENAME=FULL"
SET "CONCATLIST="
PUSHD "%~dp0"
FOR %%G IN (*.mp4) DO (
REM CREATE TEMP .TS VIDEOS OF THE FILES YOU WANT TO COMBINE
"%FF%" -hide_banner -y -i "%%~G" -c copy -bsf:v h264_mp4toannexb -f mpegts "%%~nG.ts"
IF NOT ERRORLEVEL 1 IF EXIST "%%~nG.ts" (
IF NOT DEFINED CONCATLIST (SET "CONCATLIST=%%~nG.ts") ELSE (
SETLOCAL ENABLEDELAYEDEXPANSION
FOR %%H In ("!CONCATLIST!|%%~nG.ts") DO ENDLOCAL & SET "CONCATLIST=%%~H"
)
)
)
IF NOT DEFINED CONCATLIST GOTO :EOF
REM COMBINE TEMP .TS FILES INTO COMBINED .MP4
"%FF%" -hide_banner -y -i concat:"%CONCATLIST%" -c copy -bsf:a aac_adtstoasc "%COMBINEDBASENAME%.mp4"
REM REMOVE :: FROM THE NEXT LINE TO DELETE THE .TS FILES
::DEL "%CONCATLIST:|=" "%"
ECHO=
PAUSE
GOTO :EOF
我正在尝试将一个文件夹中的所有“.mp4”文件转换为“.ts”文件,以便我可以使用FFmpeg.exe将它们全部组合成一个长的“.mp4”视频。
我在使用ffmpeg时必须使用concat
命令来合并.ts文件。
下面是执行此操作的有效代码行....我想使用 for 循环以防我要组合的文件不止 3 个。
ffmpeg.exe -hide_banner -y -i concat:"a.ts|b.ts|c.ts" -c copy -bsf:a aac_adtstoasc "COMBINED.mp4"
我可以使用下面的 for command
让这个循环工作,但是找到的最后一个文件后面不能有管道 |
就像上面的 c.ts"
一样没有。
FOR /F "USEBACKQ TOKENS=* DELIMS= ,|" %%I IN ('%%~dpnG.ts') DO (
SET FNAME=%%~dpnI
ECHO.
ECHO !FNAME!
PAUSE>NUL
EXIT
)
有谁知道是否可以(可能使用令牌)在批处理文件中执行此操作?如果没有任何建议? PowerShell?
为了回答 Compo 的问题,这是我的工作脚本:
@ECHO OFF
SETLOCAL
COLOR 0A
TITLE CONCAT MULTIPLE MP4 FILES
PUSHD "%~dp0"
SET FF="C:\MAB\local64\bin-video\ffmpeg.exe"
:: SET VIDEO NAME WITHOUT EXTENSION (.MP4)
SET IN01=a
SET IN02=b
SET IN03=c
SET COMBINED=FULL
:: CREATE TEMP .TS VIDEOS OF THE FILES YOU WANT TO COMBINE
%FF% -hide_banner -y -i "%IN01%.mp4" -c copy -bsf:v h264_mp4toannexb -f mpegts "%IN01%.ts"
%FF% -hide_banner -y -i "%IN02%.mp4" -c copy -bsf:v h264_mp4toannexb -f mpegts "%IN02%.ts"
%FF% -hide_banner -y -i "%IN03%.mp4" -c copy -bsf:v h264_mp4toannexb -f mpegts "%IN03%.ts"
:: COMBINE TEMP .TS FILES INTO COMBINED .MP4
%FF% -hide_banner -y -i concat:"%IN01%.ts|%IN02%.ts|%IN03%.ts" -c copy -bsf:a aac_adtstoasc "%COMBINED%.mp4"
ECHO.
PAUSE
EXIT
这是一个示例脚本,根据我的理解,它应该可以满足您的需要:
@ECHO OFF
SETLOCAL ENABLEEXTENSIONS DISABLEDELAYEDEXPANSION
COLOR 0A
TITLE CONCAT MULTIPLE MP4 FILES
SET "FF=C:\MAB\local64\bin-video\ffmpeg.exe"
SET "COMBINEDBASENAME=FULL"
SET "CONCATLIST="
PUSHD "%~dp0"
FOR %%G IN (*.mp4) DO (
REM CREATE TEMP .TS VIDEOS OF THE FILES YOU WANT TO COMBINE
"%FF%" -hide_banner -y -i "%%~G" -c copy -bsf:v h264_mp4toannexb -f mpegts "%%~nG.ts"
IF NOT ERRORLEVEL 1 IF EXIST "%%~nG.ts" (
IF NOT DEFINED CONCATLIST (SET "CONCATLIST=%%~nG.ts") ELSE (
SETLOCAL ENABLEDELAYEDEXPANSION
FOR %%H In ("!CONCATLIST!|%%~nG.ts") DO ENDLOCAL & SET "CONCATLIST=%%~H"
)
)
)
IF NOT DEFINED CONCATLIST GOTO :EOF
REM COMBINE TEMP .TS FILES INTO COMBINED .MP4
"%FF%" -hide_banner -y -i concat:"%CONCATLIST%" -c copy -bsf:a aac_adtstoasc "%COMBINEDBASENAME%.mp4"
REM REMOVE :: FROM THE NEXT LINE TO DELETE THE .TS FILES
::DEL "%CONCATLIST:|=" "%"
ECHO=
PAUSE
GOTO :EOF