我创建了一个批处理文件,它将读取文件夹中的音频,标准化音频的 LUFS,并在同一个文件夹中使用修改后的名称生成输出音频,保留原始文件。
我用来生成规范化文件的命令,不使用副本,在同一文件夹中有另一个名称:
"..\Áudios LUFS\!filename!_LUFS_!vLUF!.flac"
例如。
Original file : Music.flac
Normalized file: Music_LUFS_-10.0.flac
笔记。我使用变量“vLUF”来组成规范化文件的名称。
事实证明,如果我再次运行该命令,Music_LUFS_-10.0.flac 文件将保留在文件夹中并创建一个新文件。
例如。
Music_LUFS_-10.0_LUFS_-10.0.flac
所以文件夹中有两个内容相同但名称不同的文件:
Music_LUFS_-10.0.flac
Music_LUFS_-10.0_LUFS_-10.0.flac
我正在尝试更改批处理文件,以便如果文件夹中已经有一个同名的文件,它不会保存该文件,但我遇到了一些困难和疑问。
更改批处理文件以避免在文件夹中已存在相同名称时保存文件。
批处理开始,我定义了变量,但 FOR 命令内的变量不显示 ECHO 中的值,只有 FOR 外部定义的变量正确显示值:
@echo off
chcp 65001
cls
ENDLOCAL
SETLOCAL ENABLEEXTENSIONS
cd\Users\%username%\Desktop\Áudios LUFS
SET vLUF=-10.0
SET vPEAK=-0.5
SET previousfile=""
FOR %%a IN (*.flac) DO (
SET "file=%%a"
SET "filename=%%~na"
ECHO %file% CURRENT READ FILE
ECHO %filename% JUST NAME CURRENT READ FILE
ECHO %vLUF% LUF VALEU
ECHO %vPEAK% PEAK VALUE
ECHO %previousfile% PREVIOUS FILE
下面是变量中带有 ECHO 的终端屏幕。请注意,只有在 FOR 之外定义的变量才能正确显示其值:
下面,比较 IF,在 FOR 中,当文件已经存在于文件夹中时不生成文件。最后请注意,在 FOR 读取下一个文件之前,我尝试使用生成的文件的名称更新“previousfile”变量:
If "%file%" NEQ "%previousfile%" (
ffmpeg -hide_banner -i "%%a" -af "[0:a]loudnorm=print_format=summary" -f null NUL 2> "%%~na.log"
@FOR /F "tokens=3" %%b IN ('FINDSTR /C:"Input Integrated" "%%~na.log"') DO (SET II=%%b)
@FOR /F "tokens=4" %%b IN ('FINDSTR /C:"Input True Peak" "%%~na.log"') DO (SET ITP=%%b)
@FOR /F "tokens=3" %%b IN ('FINDSTR /C:"Input LRA" "%%~na.log"') DO (SET ILRA=%%b)
@FOR /F "tokens=3" %%b IN ('FINDSTR /C:"Input Threshold" "%%~na.log"') DO (SET IT=%%b)
@FOR /F "tokens=3" %%b IN ('FINDSTR /C:"Target Offset" "%%~na.log"') DO (SET TO=%%b)
DEL "%%~na.log"
SETLOCAL ENABLEDELAYEDEXPANSION
ECHO !II! Input Integrated
ECHO !ITP! Input True Peak
ECHO !ILRA! Input LRA
ECHO !IT! Input Threshold
ECHO !TO! Target Offset
FOR /F "tokens=1,2 delims=," %%b IN ('ffprobe -v 0 -select_streams a -show_entries "stream=sample_fmt,sample_rate" -of "csv=p=0" "!filename!.flac"') DO (
ffmpeg -hide_banner -y -i "!filename!.flac" -af "loudnorm=linear=true:I=!vLUF!:LRA=11:tp=!vPEAK!:measured_I=!II!:measured_LRA=!ILRA!:measured_tp=!ITP!:measured_thresh=!IT!:offset=!TO!:print_format=summary" -c:v copy -id3v2_version 3 -metadata:s:v title="Album cover" -metadata:s:v comment="Cover (front)" -map 0:0 -c:a flac -sample_fmt:a %%b -ar:a %%c "..\Áudios LUFS\!filename!_LUFS_!vLUF!.flac"
SET "previousfile=!filename!_LUFS_!vLUF!.flac"
)
)
ENDLOCAL
)
注意:在我用来生成输出文件的命令中"..\Áudios LUFS\!filename!_LUFS_!vLUF!.flac"
,是否有任何参数可以使文件夹中已经存在的文件被替换而不是用其他名称创建?
我认为你让这变得比它必须的更复杂,只需跳过名称中已经包含LUFS的文件。
代替:
你用: