SoX: преждевременный ввод EOF во входной файл .wav

#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. Я так занят в эти дни, что мне потребуются месяцы, чтобы опробовать это. Ответ имеет смысл, поэтому я отмечу его как принятый ответ. Еще раз спасибо за понимание.