如何从整首歌曲中获得WAV数据?

我正在使用FMOD(使用C ++语法,而不是C),并且无法获取整个声音文件的波形数据。

Channel :: GetWave()只获取当前正在播放的区域的波形数据。

该文件说:

不要使用这个函数来尝试显示声音的整个波形,因为这更像是当前波形被调用时的一个“快照”,并且如果连续很快被调用,可能会返回相同的数据。

看到DSP API捕捉连续播放的波形数据,或者如果您只想显示声音的波形,请参阅Sound :: lock / Sound :: unlock。

不幸的是,Sound :: lock和unlock函数相当混乱,至less对我来说。

锁:

FMOD_RESULT Sound::lock( unsigned int offset, unsigned int length, void ** ptr1, void ** ptr2, unsigned int * len1, unsigned int * len2 ); 

抵消

以字节为单位偏移到要locking在采样缓冲区中的位置。

长度

要在样本缓冲区中locking的字节数。

PTR1

指向locking数据的第一部分的指针的地址。

PTR2

指向locking数据第二部分的指针的地址。 如果locking的数据没有包装在缓冲区的末尾,这将是空的。

LEN1

为ptr1locking的数据字节长度

LEN2

为ptr2locking的数据字节数。 如果locking的数据没有包装在缓冲区的末尾,这将是0。

开锁:

 FMOD_RESULT Sound::unlock( void * ptr1, void * ptr2, unsigned int len1, unsigned int len2 ); 

PTR1

从Sound :: lock指向样本数据的第一个locking部分的指针。

PTR2

指向来自Sound :: lock的样本数据的第二个locking部分。

LEN1

为ptr1locking的数据字节长度

LEN2

为ptr2locking的数据字节数。 如果locking的数据没有包装在缓冲区的末尾,这将是0。

但正如我所说,我的目标是能够把歌曲开始的波形数据到最后。

我读的方式,最后四个参数是输出参数 。 所以你基本上传入了所需types的4个variables,并且在函数完成之后,这些variables被填充你所需要的数据。

你所做的是这样的:

 void *pointer1; void *pointer2; unsigned int length1; unsigned int length2; // lock the buffer mySound->lock(0, lengthOfYourSoundInBytes, &pointer1, &pointer2, &length1, &length2); // when we're here, pointer1, pointer2, length1 and length2 will be populated. // do something with the sound data found in pointer1. // the sound data will have a length stored in length1 // unlock the buffer once you're done mySound->unlock(pointer1, pointer2, length1, length2); 

根据我的理解,你根本不需要pointer2length2 。 你唯一需要弄清的是声音数据的长度(参见上面的lengthOfYourSoundInBytes )。 一旦你locking了缓冲区,你会得到一个指向数据的指针,你可以随心所欲地做任何事情。