Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sox--多线程选项:将立体声wav文件拆分为2个单声道文件Windows行命令_Windows_Command Line_Sox - Fatal编程技术网

Sox--多线程选项:将立体声wav文件拆分为2个单声道文件Windows行命令

Sox--多线程选项:将立体声wav文件拆分为2个单声道文件Windows行命令,windows,command-line,sox,Windows,Command Line,Sox,我在windows命令行中编写了一个批处理程序,使用sox v.14.4.0音频程序获取立体声wav文件,并将左右声道分割为单独的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-th

我在windows命令行中编写了一个批处理程序,使用sox v.14.4.0音频程序获取立体声wav文件,并将左右声道分割为单独的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)。
−−缓冲区适用于输入、效果和输出处理
−−输入−缓冲区仅适用于输入处理(它会覆盖输入处理)−−缓冲区(如果两者都给定)。
请注意,对于−−缓冲区将导致SoX响应终止请求或跳过当前输入文件的速度变慢

两个问题

  • 是否可以像上面解释的那样,使用--multi-thread或其他方法同时将1个输入文件拆分为2个输出文件
  • 如果是,怎么做?(注意:我还没有找到正确的语法,以便从上面的文档中获得SOX_选项来处理它自己的问题,更不用说在批处理文件中了)

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

    如果不熟悉你的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`name

    runsox
    过程将调用
    wait
    过程,我将谈到这个过程。当
    WAIT
    完成时,它将放在左侧的sox上,然后再次等待并放在右侧,然后返回下一个文件名,直到完成所有操作。名称中的
    %~1
    表示“给定给此例程的第一个参数,减去任何引号”-这是调用提供的文件名(%%n)

    wait
    过程通过将
    tasklist
    中的任务列表传递给
    find
    过滤器,以查找字符串
    SOX.EXE
    /i表示不考虑大小写,而
    /c
    表示输出计数,从而找出有多少
    SOX.EXE
    实例正在运行

    因此,
    运行
    将获取正在进行的
    SOX
    的实例计数。如果大于或等于6(任意数字-根据您自己的情况选择。最好留下一个或两个处理器用于其他任务,因此对于8处理器的机器,6 id很好),则执行5秒的超时,5秒后再次检查任务列表。 当实例少于6个时,
    wait
    过程退出并启动下一个任务

    So-WAIT过程等待,直到SOX实例少于6个

    更改6以适合您的机器,更改5以符合您的美学


    编辑:删除旧的右括号

    但我必须纠正的一件事是删除混音2之后的“)”