gpt4 book ai didi

windows - Windows中的递归ffmpeg批处理脚本

转载 作者:行者123 更新时间:2023-12-04 23:06:33 29 4
gpt4 key购买 nike

完全改变问题!

我现在有以下脚本:

@echo off
REM keep a counter for files converted
set /A nfile=0
REM do not copy empty folders or any files
@echo Copying directory structure from %0 to %1 ...
xcopy /T %1 %2
REM walk directory structure and convert each file in quiet mode
for /R %1 %%v in (*.mp4, *.aac, *.flv, *.m4a, *.mp3) do (
echo converting "%%~nxv" ...
ffmpeg -v quiet -i "%%v" -vcodec libx264 "%2\%%~nv-converted.mp4"
set /A nfile+=1
)
echo Done! Converted %nfile% file(s)

取自: http://mostlybuggy.wordpress.com/2012/09/25/windows-batch-file-how-to-copy-and-convert-folders-recursively-with-ffmpeg/

当我运行以下命令时,视频正在按预期转换:
convert ..\..\folder ..\..\converted\

但是,转换后的文件最终以“已转换”而不是在其各自的子文件夹中。

有任何想法吗?

最佳答案

您需要将每个源文件的相对路径合并到您的目标中。如果您希望脚本是防弹的,这并非易事。

下面未经测试的代码使用批处理函数来确定字符串的长度。 There are many techniques for computing string length in batch .

一旦我知道了根源路径的长度,就很容易对源文件的完整路径进行子字符串操作以获得相对路径。

@echo off
setlocal disableDelayedExpansion

REM get absolute path of source and destination roots
for %%F in ("%~1\x") do set "src=%%~dpF"
for %%F in ("%~2\x") do set "dst=%%~dpF"

REM get length of root source path
call :strlen src srcLen

REM keep a counter for files converted
set /A nfile=0
REM do not copy empty folders or any files
@echo Copying directory structure from %1 to %2 ...
xcopy /T "%src%\." "%dst%\."

REM walk directory structure and convert each file in quiet mode
for /R "%src%" %%F in (*.mp4, *.aac, *.flv, *.m4a, *.mp3) do (
set "file=%%~fF"
set "file2=%%~dpnF"
echo converting "%%~nxF" ...
setlocal enableDelayedExpansion
ffmpeg -v quiet -i "!file!" -vcodec libx264 "!dst!!file2:~%srcLen%!-converted.mp4"
endlocal
set /A nfile+=1
)
echo Done! Converted %nfile% file(s)
exit /b


:strlen strVar [rtnVar]
setlocal EnableDelayedExpansion
set "s=!%~1!#"
set "len=0"
for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
if "!s:~%%P,1!" NEQ "" (
set /a "len+=%%P"
set "s=!s:~%%P!"
)
)
(
endlocal
if "%~2" equ "" (echo %len%) else set "%~2=%len%"
exit /b
)

如果您有两个未分配的驱动器号可以映射到您的根源文件夹和目标文件夹,那么有一个非常简单的解决方案。这将允许您使用完整的绝对路径(没有驱动器号)。我假设 X: 和 Y: 可用
@echo off
setlocal disableDelayedExpansion

REM map unused drive letters to source and destination
for %%F in ("%~1\.") do subst x: "%%~fF"
for %%F in ("%~2\.") do subst y: "%%~fF"

REM keep a counter for files converted
set /A nfile=0
REM do not copy empty folders or any files
@echo Copying directory structure from %1 to %2 ...
xcopy /T x:\ y:\

REM walk directory structure and convert each file in quiet mode
for /R x:\ %%F in (*.mp4, *.aac, *.flv, *.m4a, *.mp3) do (
echo converting "%%~nxF" ...
ffmpeg -v quiet -i "%%F" -vcodec libx264 "y:%%~pnF-converted.mp4"
set /A nfile+=1
)
echo Done! Converted %nfile% file(s)
exit /b

REM release mapped drive letters
subst /d x:
subst /d y:

关于windows - Windows中的递归ffmpeg批处理脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19098247/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com