我在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)
- 缓冲适用于输入,效果和输出处理;
--input-buffer仅适用于输入处理(如果两者都给出,它将覆盖 - 缓冲)
请注意, - 缓冲区的大值将导致SoX响应终止或跳过当前输入文件的请求变慢。
两个问题。
另外:我发现了一些类似于此的其他stackoverflow问题,但总是使用java,php,linux等。不幸的是,我对这些程序没有任何了解。请同情我的编程无知。
答案 0 :(得分:2)
不知道如果没有比我更喜欢你的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
这样做会对遇到的每个:runsox
执行.wav
过程,并传递.wav`名称。
runsox
程序会调用wait
程序 - 我将会这样做。当WAIT
完成后,它将放在左边的sox上,然后再次等待并放在右边,然后返回下一个文件名,直到完成所有操作。名称中的%~1
表示'给予此例程的第一个参数,减去任何封闭的引号` - 这是CALL提供的文件名(%% n)。
wait
过程通过将任务列表从SOX.EXE
传递到tasklist
过滤器来查找字符串{{1},从而找出正在运行的find
个实例数} sox.exe
表示无论情况如何,/i
表示输出计数。
/c
获取正在进行的Running
个实例的计数。如果大于或等于6(任意数字 - 选择它适合自己。最好留下一个或两个处理器用于其他任务,所以6个ID适用于8个处理器的机器)然后执行超时5秒5秒后,再次检查任务列表。
当少于6个实例时,SOX
过程退出并开始下一个任务。
所以 - wait
过程等待,直到少于6个SOX实例。
更改6以适合您的机器和5您的美学。
编辑:删除旧版关闭括号