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() 是否需要shorts 或字节数作为第三个参数?另外,它返回shorts 的数量还是字节数? @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 最大帧数的主要内容,如果未能解决你的问题,请参考以下文章

错误:主要格式为 0(libsndfile,Qt)

Libsndfile - 如何处理额外的块(元数据)

qt中使用libsndfile实时播放声音c++

Windows下编译libsndfile音频库

为 ARM 架构构建 libsndfile 库

OSX 上的 Libsndfile 损坏数据