#bash #command-line #channel #sox #sample-rate
#bash #командная строка #канал #sox #частота дискретизации
Вопрос:
У меня есть куча файлов WAV и скрипт, который копирует их в другой каталог, но обрабатывает некоторые файлы с помощью SoX. Все выводимые файлы должны иметь 1 канал и частоту дискретизации 44,1 кГц или меньше. Большинство моих файлов либо имеют более одного канала, либо частота дискретизации больше 44,1 кГц, но только 3 файла имеют оба. При преобразовании этих 3 файлов с помощью приведенного ниже фрагмента кода я получаю сообщение об ошибке «sox WARN wav: преждевременный ввод EOF во входной файл .wav».
# $x is the filename extension
# $2 is the destination folder
convertedWAV=false
hz=$(sox --info $PWD/$x | sed -n 4p | tr ' ' 'n' | tail -1)
chan=$(sox --info $PWD/$x | sed -n 3p | tr ' ' 'n' | tail -1)
# If its more than 44.1khz, then bring it down to that
if [[ $hz > 44100 ]]; then
echo "ADJUSTING HZ"
convertedWAV=true
sox $PWD/$x --rate 44100 $2/$x
fi
# If its more than 1 channel (AKA Stereo), then reduce it.
if [[ $chan > 1 ]]; then
echo "ADJUSTING CHANNELS"
if [[ $convertedWAV == false ]]; then
sox $PWD/$x --channels 1 $2/$x
else
sox $2/$x --channels 1 $2/$x
fi
convertedWAV=true
fi
if [[ $convertedWAV == false ]]; then
ln "$PWD/$x" "$2"
fi
Обратите внимание, как эти 3 файла прошли через две отдельные команды SoX. Затем я изменил свой скрипт так, чтобы, если оба канала> 1 и гц> 44100, он выполнял одну команду sox, код показан ниже.
if [[ $chan > 1 ]] amp;amp; [[ $hz > 44100 ]]; then
sox $PWD/$x --channels 1 --rate 44100 $2/$x
elif [[ $chan > 1 ]]; then
sox $PWD/$x --channels 1 $2/$x
elif [[ $hz > 44100 ]]; then
sox $PWD/$x --rate 44100 $2/$x
else
cp "$PWD/$x" "$2/$x"
fi
Теперь это работает. Мой вопрос в том, почему?Он ведет себя так же, если я делаю sox $PWD/$x --rate 44100 --channels 1 $2/$x
, по какой-то причине выполнение этого в двух командах вызывает проблему. Я не могу найти определенного ответа. В соответствии с этим ошибка может возникнуть из-за того, что длина hdr на самом деле не равна длине, поэтому, возможно, первая команда SoX слегка повреждает файл? Я не знаю, является ли это ошибкой с преобразованиями SoX или что-то не так с моими аудиофайлами. Я загрузил один из них здесь, чтобы это помогло.
Ответ №1:
sox $ 2 / $ x — каналы 1 $ 2 / $ x
Вы не можете объединить файл $ 2 / $ x с самим собой.
Комментарии:
1. О, я думал, что это берет 1-й файл в качестве исходного, выводит в какой-то временный файл, затем копирует и сохраняет его со 2-м именем файла. Я не понимал, что он просто пропустил временный файл. Мне нужно будет заново настроить среду разработки, чтобы протестировать это, но спасибо за разъяснение.
2. Нет, это было бы очень удобно, но, к сожалению, вам придется делать это вручную, я даже не смог найти необязательный флаг… В любом случае, я надеюсь, что вы отметите ответ как правильный, если / когда вы его протестируете, у меня еще не было ни одного, отмеченного как правильный 😉
3. Я так занят в эти дни, что мне потребуются месяцы, чтобы опробовать это. Ответ имеет смысл, поэтому я отмечу его как принятый ответ. Еще раз спасибо за понимание.