1

我正在尝试使用 FMOD 仅播放部分声音,例如 200000 帧文件的 50000-100000 帧。我找到了几种向前搜索的方法(即在第 50000 帧开始播放),但我还没有找到确保声音在 100000 停止播放的方法。有没有什么方法可以让 FMOD 本身做到这一点而无需添加 lbsndfile还是图片之类的?

我还应该提到我正在使用流式传输选项。我不得不假设这些声音是任意大的,并且不能舒适/快速地加载到内存中。

4

3 回答 3

4

您可以使用 Channel::setDelay 对声音的准确开始和停止进行采样。使用 FMOD_DELAYTYPE_DSPCLOCK_START 设置声音的开始时间,使用 FMOD_DELAYTYPE_DSPCLOCK_END 设置结束时间。

查看 Channel::setDelay、FMOD_DELAYTYPE、System::getDSPClock 的文档。

于 2010-03-25T21:32:29.970 回答
1

当您到达所需点时,您应该能够使用流回调来停止流。

选项 1:创建流时,设置lenbytes为要播放的帧数的偶数除数。在您的示例中,将“lenbytes”设置为 5000,然后在回调中保留一个计数器。当你到达 10 时,停止流。

选项 2:使用FSOUND_Stream_AddSyncPoint设置pcmoffset为您想要的停止点。使用 注册回调FSOUND_Stream_SetSyncCallback。在回调中停止流。

于 2010-02-26T22:14:49.283 回答
1

要在样本 50,000 处开始播放并在 100,000 处结束播放,假设声音文件采样率和系统采样率相同,您可以执行以下操作。由于 DSP 时钟在系统输出样本中工作,您可能需要进行一些数学运算来根据输出速率调整最终样本。声音采样率见 Sound::getDefaults,系统速率见 System::getSoftwareFormat。

unsigned int sysHi, sysLo;

// ... create sound, play sound paused ...

// Seek the data to the desired start offset
channel->setPosition(50000, FMOD_TIMEUNIT_PCM);

// For accurate sample playback get the current system "tick"
system->getDSPClock(&sysHi, &sysLo);

// Set start offset to a couple of "mixes" in the future, 2048 samples is far enough in the future to avoid issues with mixer timings
FMOD_64BIT_ADD(sysHi, sysLo, 0, 2048);
channel->setDelay(FMOD_DELAYTYPE_DSPCLOCK_START, sysHi, sysLo);

// Set end offset for 50,000 samples from our start time, which means the end sample will be 100,000
FMOD_64BIT_ADD(sysHi, sysLo, 0, 50000);
channel->setDelay(FMOD_DELAYTYPE_DSPCLOCK_END, sysHi, sysLo);

// ... unpause sound ...
于 2010-07-26T13:30:14.427 回答