【问题标题】:Sox --multi-thread option: Split stereo wav file to 2 mono files Windows Line commandSox --multi-thread 选项:将立体声 wav 文件拆分为 2 个单声道文件 Windows Line 命令
【发布时间】:2013-04-12 20:20:16
【问题描述】:

我已经在 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)。
请注意,−−buffer 的值较大会导致 SoX 响应终止或跳过当前输入文件的请求变慢。

两个问题。

  1. 是否可以使用上述的 --multi-thread 或其他方式同时将 1 个输入文件拆分为 2 个输出文件?
  2. 如果是这样,怎么做? (注意:我无法找出正确的语法来从上面的文档中获取 SOX_OPTS 以自行处理,不要介意在批处理文件中)

另外:我发现了一些与此类似的其他 stackoverflow 问题,但总是使用 java、php、linux 等。不幸的是,我对这些程序一无所知。请体谅我对编程的无知。

【问题讨论】:

    标签: windows command-line sox


    【解决方案1】:

    如果不熟悉你的 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 的任务列表传递给find 过滤器以查找字符串sox.exe 来找出有多少SOX.EXE 实例正在运行,/i 表示不考虑大小写和@ 987654335@ 表示输出一个计数。

    Running 因此获取正在进行的SOX 实例的计数。如果大于或等于 6(任意数字 - 选择适合自己的值。最好留一或两个处理器用于其他任务,因此 6 id 适合 8 处理器机器)然后执行 5 秒的超时5 秒后再次检查任务列表。 当实例少于 6 个时,wait 过程退出并开始下一个任务。

    所以 - WAIT 过程一直等到少于 6 个 SOX 实例。

    更改 6 以适合您的机器和 5 您的审美。

    编辑:删除旧的右括号

    【讨论】:

    • 我必须纠正的一件事是在混音 2 之后删除“)”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多