首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用SimpleAudioEngine按顺序播放声音

用SimpleAudioEngine按顺序播放声音
EN

Stack Overflow用户
提问于 2013-02-20 18:15:54
回答 2查看 1.5K关注 0票数 3

我正在用iOS 2构建一个cocos2d应用程序,我正在使用SimpleAudioEngine来发挥一些效果。

是否有一种方法可以在前一个声音完成后对多个声音进行排序?

例如,在我的代码中:

代码语言:javascript
复制
[[SimpleAudioEngine sharedEngine] playEffect:@"yay.wav"];
[[SimpleAudioEngine sharedEngine] playEffect:@"youDidIt.wav"];

当运行此代码时,yay.wavyouDidIt.wav完全同时在对方之上播放。

我想让yay.wav玩,一旦完成,youDidIt.wav就玩。

如果没有SimpleAudioEngine,是否有一种使用AudioToolbox的方法,或者其他的方法?

谢谢!

== 更新 ==

我想我将使用AVFoundation来使用这个方法:

代码语言:javascript
复制
AVPlayerItem *sound1 = [[AVPlayerItem alloc] initWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"yay" ofType:@"wav"]]];
AVPlayerItem *sound2 = [[AVPlayerItem alloc] initWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"YouDidIt" ofType:@"wav"]]];    
AVQueuePlayer *player = [[AVQueuePlayer alloc] initWithItems: [NSArray arrayWithObjects:sound1, sound2,  nil]];
[player play];
EN

回答 2

Stack Overflow用户

发布于 2013-02-20 18:51:57

简单的方法是使用-[CDSoundSource durationInSeconds]获得音轨的持续时间,然后在适当的延迟之后安排第二个效果的播放:

代码语言:javascript
复制
[[SimpleAudioEngine sharedEngine] performSelector:@selector(playEffect:) withObject:@"youDidIt.wav" afterDelay:duration];

获取音频持续时间的一种更容易的方法是修补SimpleAudioManager并添加一个查询其音频持续时间的CDSoundEngine (静态全局)的方法:

代码语言:javascript
复制
- (float)soundDuration {
    return [_engine bufferDurationInSeconds:_soundId];
}

第二种方法是轮询音频引擎的状态,然后等待它停止播放。

代码语言:javascript
复制
    alGetSourcei(sourceId, AL_SOURCE_STATE, &state);
    if (state == AL_PLAYING) {
      ...

sourceIdplayEffect返回的ALuint

票数 0
EN

Stack Overflow用户

发布于 2013-10-16 19:18:15

它很简单,用Cocos2D 2.1进行了测试:

  1. 在SimpleAudioEngine.h上创建属性durationInSeconds: @property (只读)浮动durationInSeconds;
  2. 合成它们: @合成durationInSeconds;
  3. 像这样修改playEffect: -(ALuint) playEffect:(NSString*) filePath音调:(Float32)音调pan:(Float32) pan增益:(Float32)增益{ int soundId = bufferManager bufferForFile:filePath create:YES;if (soundId = kCDNoBuffer) { durationInSeconds = soundEngine bufferDurationInSeconds:soundId;返回soundEngine播放声音:声基音:0:音调pan:pan增益:pan增益:增益循环:false;}否则{返回CD_MUTE;}
  4. 如您所见,我从durationInSeconds的结果中直接从soundEngine bufferDurationInSeconds插入了bufferManager值。
  5. 现在,只请求值SimpleAudioEngine sharedEngine.durationInSeconds,您就得到了这个声音的浮动持续时间(以秒为单位)。
  6. 在这几秒钟里放一个定时器,然后播放下一个声音的迭代,或者把旗子关了什么的。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14987061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档