SoX:.wav输入文件上的过早EOF

问题描述

我有一堆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 连接到自身上。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...