我已经在 Windows 命令行中编写了一个批处理程序来获取立体声 wav 文件,并使用 sox v.14.4.0 音频程序将左右声道拆分为单独的 FLAC 文件。像这样..
for /r %%n in (*.wav) do (
C:\sox\sox.exe %%n -c 1 %%n.left.flac remix 1
C:\sox\sox.exe %%n -c 2 %%n.right.flac remix 2)
但是,这比我希望的要长一些。我对此进行了更多研究,看来我可以使用 SOX_OPTS 和 --multi-thread 选项以及 --buffer 来同时执行两个 sox 操作。
Sox 文档说明了这一点:
SOX_OPTS 环境变量可用于为 SoX 的全局选项提供替代默认值。例如:
SOX_OPTS="−−buffer 20000 −−play−rate−arg −hs −−temp /mnt/temp"
请注意,设置环境变量的方式因系统而异。 以下是一些示例:MS-DOS/MS-Windows:
set SOX_OPTS=−V −−no-clobber −−buffer BYTES, −−input−buffer BYTES
设置用于处理音频的缓冲区的大小(默认为 8192)。
−−buffer 适用于输入、效果、输出处理;
−−input−buffer 仅适用于输入处理(如果两者都给定,它会覆盖 −−buffer)。
请注意,缓冲区的较大值会导致 SoX 响应终止或跳过当前输入文件的请求变得缓慢。
两个问题。
- 是否可以使用上面解释的 --multi-thread 或其他方式同时将 1 个输入文件拆分为 2 个输出文件?
- 如果是,怎么做? (注意:我一直无法找出正确的语法来从上面的文档中获取 SOX_OPTS 来处理它自己没关系在批处理文件中)
另外:我发现了其他一些与此类似但总是使用 java、php、linux 等的 stackoverflow 问题。不幸的是,我对这些程序一无所知。请同情我的编程无知。
请您参考如下方法:
如果不熟悉你的 SoX,我就不知道了......
不过,我会试试这个:
作为测试,使用单个 .wav 文件
for /r %%n in (justone.wav) do (
START "Left" C:\sox\sox.exe %%n -c 1 %%n.left.flac remix 1
START "Right" C:\sox\sox.exe %%n -c 2 %%n.right.flac remix 2)
也许它会在多处理器机器上同时运行两个实例。 (窗口标题为“左”或“右”)
现在——如果可行,那就试试
@ECHO OFF
SETLOCAL
for /r %%n in (*.wav) do CALL :runsox "%%n"
GOTO :eof
:runsox
CALL :wait
START "%~1.left" C:\sox\sox.exe %~1 -c 1 %~1.left.flac remix 1
CALL :wait
START "%~1.right" C:\sox\sox.exe %~1 -c 2 %~1.right.flac remix 2
GOTO :eof
:wait
FOR /f %%c IN ('tasklist^|find /i /c "sox.exe"') DO SET running=%%c
IF %running% GEQ 6 timeout /t 5 >nul&GOTO wait
GOTO :eof
这将做的是为遇到的每个 .wav
执行 :runsox
过程,传递 .wav` 名称。
runsox
过程将调用 wait
过程 - 我稍后会谈到。当 WAIT
完成时,它会放在左边的 sox 上,然后再次等待并放在右边,然后返回下一个文件名,直到全部完成。名称中的 %~1
表示“为该例程提供的第一个参数,减去任何括起来的引号”——这就是 CALL 提供的文件名 (%%n)。
wait
过程通过将 tasklist
中的任务列表传递到 来找出有多少
过滤器查找字符串 SOX.EXE
实例正在运行findsox.exe
/i
表示不区分大小写,/c
表示输出一个计数。
Running
因此获取正在进行的 SOX
实例的计数。如果它大于或等于 6(任意数字 - 选择适合自己的。最好为其他任务留出一个或两个处理器,因此 6 id 适合 8 处理器机器)然后执行 5 秒的超时5 秒后再次检查任务列表。 当少于 6 个实例时,wait
过程退出并开始下一个任务。
所以 - WAIT
过程一直等到 SOX 实例少于 6 个。
更改 6 以适合您的机器和 5 您的审美。
编辑:删除遗留的右括号