为啥不使用 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 读取此音频文件?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能使用 ifstream 读取撇号而不崩溃?

为啥不读取 NetworkStream 中的数据? .net TcpClient

为啥 InputStreamReader 不实时读取进程的输出?

为啥在使用 Android MediaPlayer 读取 H.264 编码的 rtsp 流时出现“不支持的格式”错误?

为啥我设置的opengl视口宽度变小了,读取像素不对齐?

为啥不建议使用NSUserDefault存储大量数据