为啥不使用 sf_read_double 读取此音频文件?
Posted
技术标签:
【中文标题】为啥不使用 sf_read_double 读取此音频文件?【英文标题】:Why isn't this audio file being read with sf_read_double?为什么不使用 sf_read_double 读取此音频文件? 【发布时间】:2013-06-24 03:38:07 【问题描述】:我正在尝试将鼓序列的每个细分分成二维数组内的单独数组(细分的行,每个细分中的数据列)。 我根据用户对速度和所需细分的规范,在代码的前面确定每个细分有多少样本。我觉得我有一种比较合理的方法来计算样本中输入文件的大小(显示的第一部分)。 我的问题是:按原样,sf_read_double while 循环不会运行。只有当我将“buflen”乘以 2(可能是通道数)时,循环才会运行。当它运行时 循环超过计算的样本总数并导致 sug 故障。我在这段代码中做错了什么?
double framesArray[sfinfo.frames];
int numframes = (sizeof(framesArray)/sizeof(double));
int totalSamps = numframes * sfinfo.channels;
int totalSubdivisions = totalSamps / sampsPerSubdivision;
int buflen = sampsPerSubdivision;
int i;
double** choppeddata = (double**) malloc(totalSubdivisions * sizeof(double**));
for (i = 0; i < totalSubdivisions; i++)
choppeddata[i] = (double*) malloc(buflen * sizeof(double*));
double* buffereddata = (double*) malloc(buflen * sizeof(double*));
double* outdata = (double*) malloc(totalSamps * sizeof(double*));
int j = 0, k = 0, sampnum = 0;
while ((readcount = sf_read_double (infile, buffereddata, buflen)))
for (k = 0; k < buflen; k++)
choppeddata[j][k] = buffereddata[k];
sampnum++;
j++;
【问题讨论】:
【参考方案1】:不应该铸造sampsPerSubdivision
吗?我想它已被声明为int
。在这种情况下,您需要类似:
int totalSubdivisions = (int)(totalSamps / (double)sampsPerSubdivision);
所以totalSubdivisions
可能是错误的...无论如何,这无法解释为什么您的buflen
不适合要读取的数据。我的猜测是 sampsPerSubdivision
首先是不正确的。
我不能说更多。希望这可以帮助...
【讨论】:
我有点像新手程序员,所以我想我不知道,也不知道我为什么需要这样做。关于缓冲区,当我打印出循环在做什么时,缓冲区长度效果很好。 演员故事与整数除法有关(如果您不转换为双精度数)。剩下的,你说as is, the sf_read_double while loop will not run. It is only when I multiply "buflen" by 2 (perhaps number of channels) that the loop runs
这让我推断sf_read_double
一开始就返回零……我说得对吗?
另一个想法:如果您阅读样本一个是一个而不是按大小为buflen
的块会发生什么?尝试这样做会给您提供可用样本的真实数量 (sampnum
),因此您将能够确保这个数字是正确的……很抱歉,但我必须离开。如果您发现了新的东西,请随时关注我。
我有点搞砸了。我还没有让其他实现工作。我使用二维数组的原因是,一旦我让这个简化的代码工作,我想对输入进行输出随机切割——本质上是一个鼓式绞肉机或切割机。如果你有兴趣,代码在这里:link。我终于让它打印音频,但它要么切断数据导致它结结巴巴,要么以两倍的速度播放它。正如我所提到的,我是新手。这只是命令行,我稍后会学习类等。以上是关于为啥不使用 sf_read_double 读取此音频文件?的主要内容,如果未能解决你的问题,请参考以下文章
为啥不读取 NetworkStream 中的数据? .net TcpClient
为啥 InputStreamReader 不实时读取进程的输出?