Опция Sox --multi-thread: разделить стереофонический wav-файл на 2 монофайла Команда Windows Line

Я написал пакетную программу в командной строке Windows, чтобы взять стереофайл wav и разделить правый и левый канал на отдельные файлы FLAC с помощью аудиопрограммы sox v.14.4.0. Вот так..

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. Можно ли разделить 1 входной файл на 2 выходных файла одновременно, используя --multi-thread, как описано выше, или другим способом?
  2. Если да, то как? (примечание: мне не удалось выяснить правильный синтаксис, чтобы заставить SOX_OPTS из приведенной выше документации работать самостоятельно, не говоря уже о пакетном файле)

Кроме того: я нашел некоторые другие вопросы о стеке, похожие на этот, но всегда использующие java, php, linux и т. д. К сожалению, я ничего не знаю об этих программах. Пожалуйста, с пониманием отнеситесь к моему невежеству в программировании.


person julesverne    schedule 12.04.2013    source источник


Ответы (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

Что это будет делать, так это выполнять процедуру :runsox для каждого встречающегося .wav, передавая имя .wav`.

Процедура runsox вызовет процедуру wait, к которой я перейду. Когда WAIT закончится, он поместит левый sox, затем снова подождет и поместит справа, затем вернется к следующему имени файла, пока все не будет сделано. %~1 в именах означает "первый параметр, указанный в этой подпрограмме, за вычетом всех окружающих кавычек" - и это имя файла (%%n), предоставленное CALL.

процедура wait определяет, сколько запущено экземпляров SOX.EXE, передавая список задач из tasklist через фильтр find, чтобы найти строку sox.exe /i означает независимо от регистра, а /c означает вывод количества.

Таким образом, Running получает количество экземпляров SOX в процессе выполнения. Если это число больше или равно 6 (произвольное число - выбирайте по своему усмотрению. Лучше всего оставить один или два процессора для других задач, поэтому 6 id подходит для 8-процессорной машины), то выполняется тайм-аут 5 секунд. и через 5 секунд снова проверяется список задач. Когда экземпляров меньше 6, процедура wait завершает работу и запускается следующая задача.

Итак, процедура WAIT ждет, пока не останется менее 6 экземпляров SOX.

Измените 6 в соответствии с вашим оборудованием и 5 вашей эстетикой.

Изменить: удалить устаревшую закрывающую скобку

person Magoo    schedule 12.04.2013
comment
Одна вещь, которую я должен был исправить, это удаление ) после ремикса 2. - person julesverne; 13.04.2013