libsndfile sf_readf_short 最大帧数
Posted
技术标签:
【中文标题】libsndfile sf_readf_short 最大帧数【英文标题】:libsndfile sf_readf_short max number of frames 【发布时间】:2013-06-20 07:35:39 【问题描述】:我需要尽快读入波形文件。我目前正在做的事情如下:
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
时遇到分段错误。
从help我得到“sf_readf_XXXX 函数返回读取的帧数。除非在读取过程中到达文件末尾,否则返回值应该等于请求的帧数。尝试读取超出文件末尾不会导致错误,但会导致 sf_readf_XXXX 函数返回少于请求的帧数,如果已经在文件末尾,则返回 0。"
所以我希望这也适用于 10MB。
感谢任何提示。
【问题讨论】:
你能编译short tmpSignal[readBlockSize];
这一行吗?无法在 C++ 中分配具有非编译时 const 值大小的数组。
你从哪里得到分段错误?我假设在sf_readf_short
,对吗?
@Gonmator:完全正确。我更新了我的帖子。
sf_readf_short()
是否需要short
s 或字节数作为第三个参数?另外,它返回short
s 的数量还是字节数?
@Gonmator:帮助说:“文件读取帧函数用请求的数据帧数填充 ptr 指向的数组。数组必须足够大以容纳帧的乘积和频道的数量。” .. ?
【参考方案1】:
来自 libsndfile 文档:
sf_count_t sf_readf_short (SNDFILE *sndfile, short *ptr, sf_count_t frames) ;
文件读取帧函数用 ptr 指向的数组填充 请求的数据帧数。数组必须足够大 保存帧数和通道数的乘积。
必须注意确保数组中有足够的空间 由 ptr 指向,取 (frames * channels) 项目数 (短裤、整数、浮点数或双精度数)。
readBlockSize
指定帧数,但你必须为帧数 * 通道数分配内存。
我不知道您如何真正分配tmpSignal
缓冲区,但您应该使用readBlockSize
* 通道数(大概是2)来分配。 (或者将指定给readBlockSize
调用函数的帧数除以2)。
【讨论】:
我使用的wave文件只有一个通道 @ezdazuzena:在这种情况下,这不是解决方案,对不起!【参考方案2】:问题是堆栈大小,所以在访问变量 `tmpSignal' 时,由分配的
//..
short tmpSignal[readBlockSize];
//..
我得到了分段错误。
这种行为可以被复制(至少在我的机器上)
short tmp[10485760];
for(unsigned int i = 0; i < 10485760; ++i )
tmp[i] = 0;
【讨论】:
以上是关于libsndfile sf_readf_short 最大帧数的主要内容,如果未能解决你的问题,请参考以下文章