【发布时间】:2021-01-27 07:01:44
【问题描述】:
我有一堆 WAV 文件和一个将它们复制到另一个目录的脚本,但使用 SoX 处理一些文件。输出的文件都应该有 1 个通道,并且采样率为 44.1khz 或更低。我的大多数文件要么有多个通道,要么采样率大于 44.1khz,但只有 3 个文件两者都有。当使用下面的代码 sn-p 转换这 3 个文件时,我收到“sox WARN wav: Premature EOF on .wav input file”错误。
# $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,它的行为是一样的,出于某种原因,在两个命令中执行它会导致问题。我找不到明确的答案。根据this 的说法,可能会发生错误,因为 hdr 的长度实际上并不是长度,所以第一个 SoX 命令可能会稍微损坏文件?我不知道这是 SoX 转换的错误还是我的音频文件有问题。我已经上传了其中一个 here 以防万一。
【问题讨论】:
标签: bash command-line channel sox sample-rate