问题描述
我有一堆WAV文件和一个脚本,可以将它们复制到另一个目录,但是可以使用SoX处理某些文件。输出的文件应全部具有1个通道,并且采样率应为44.1khz或更低。我的大多数文件都具有多个通道,或者采样率大于44.1khz,但只有3个文件同时具有。使用下面的代码片段转换这3个文件时,出现“ sox WARN wav:.wav输入文件上的EOF过早”错误。
# $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和hz> 44100都执行一个sox命令,则代码如下所示。
if [[ $chan > 1 ]] && [[ $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
,它的行为相同,由于某些原因,在两个命令中执行该操作会导致问题。我找不到确切的答案。根据{{3}},由于hdr的长度实际上不是长度,因此可能发生错误,因此第一个SoX命令可能会稍微破坏文件吗?我不知道这是SoX转换的错误还是我的音频文件有问题。我已经上传了其中一个this,以防万一。
解决方法
sox $2/$x --channels 1 $2/$x
您不能将文件 $2/$x 连接到自身上。