0

我需要尽可能快地读入波形文件。我目前正在做的事情如下:

SFINFO sfinfo;
SNDFILE *wavFilefd = sf_open ("mySong.wav", SFM_READ, &sfinfo);
int readBlockSize = 1024*1024; // 1MB
if( sfinfo.frames * 2 < readBlockSize )
{
    // actually I don't know where this factor two comes from, but it work's for me
    readBlockSize = sfinfo.frames * 2; 
}                      
short tmpSignal[readBlockSize];
int readcount = -1;
std::vector< short > wavVector;
while ((readcount = sf_readf_short (wavFilefd, tmpSignal, readBlockSize)) > 0)
{
    ++nRead;
    wavVector.reserve( (nRead-1) * readBlockSize + nRead);
    wavVector.insert( wavVector.end(), tmpSignal, tmpSignal+readcount);
}                     
sf_close(wavFilefd);

到目前为止,此代码运行良好。

问题:当我将 readBlockSize 的值增加 10 倍,然后尝试读取 115212164 字节的波形文件时,我在执行sf_readf_short.

帮助我得到“sf_readf_XXXX 函数返回读取的帧数。除非在读取过程中到达文件末尾,否则返回值应等于请求的帧数。尝试读取超出文件末尾不会导致错误,但将导致 sf_readf_XXXX 函数返回少于请求的帧数,如果已经在文件末尾,则返回 0。”

所以我希望这也适用于 10MB。

感谢您的任何提示。

4

2 回答 2

0

从 libsndfile 文档:

sf_count_t  sf_readf_short   (SNDFILE *sndfile, short *ptr, sf_count_t frames) ;

文件读取帧函数用请求的数据帧数填充 ptr 指向的数组。阵列必须足够大以容纳帧和通道数的乘积。

必须注意确保 ptr 指向的数组中有足够的空间,以获取 (frames * channels) 数量的项目(shorts、ints、float 或 doubles)。

readBlockSize指定帧数,但您必须为帧数 * 通道数分配内存。

我不知道您如何真正分配tmpSignal缓冲区,但您应该使用readBlockSize* 通道数(大概 2 个)来分配。readBlockSize(或将指定调用函数的帧数除以 2 )。

于 2013-06-20T08:16:20.090 回答
0

问题是堆栈大小,所以在访问变量“tmpSignal”时,由

//..
short tmpSignal[readBlockSize];
//..

我得到分段错误。

这种行为可以通过以下方式重现(至少在我的机器上)

short tmp[10485760];
for(unsigned int i = 0; i < 10485760; ++i ) 
{
    tmp[i] = 0;
}
于 2013-06-21T14:30:04.083 回答