在iPhone上播放多个iPod库歌曲同时使用音高弯曲&其他影响

时间:2011-01-28 09:48:46

标签: iphone objective-c ipod openal audio

过去两周我一直在这,这让我发疯。几天前我问了这个问题(Extract iPod Library raw PCM samples and play with sound effects),虽然答案让我走了一半,但我仍然陷入困境。

基本上我想要实现的是从iPod库中加载多首歌曲,以便通过弯音,等效效果等效果进行播放......

我走了AVPlayer和AVAudioPlayer的路线太简单了。我见过的唯一可以用这些效果播放音频的框架是OpenAL。我已经尝试了一些目标c包装器(Finch和ObjectAL)Finch不播放压缩音频,而ObjectAL只会为我转换它,如果我传入一个文件的URL(这是我不能做的,因为我只有一个不兼容的iPod库URL)。

我想要美化的应用程序的一个例子是Tap DJ。它可以快速加载来自iPod库的歌曲(与TouchDJ不同,它可以播放各种各样的效果。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:5)

如果您可以将音频数据转换为OpenAL喜欢的原始PCM格式,您可以将其加载到ObjectAL中。

您需要的是:

  • 音频数据
  • 数据的字节大小
  • 数据格式(AL_FORMAT_MONO16或AL_FORMAT_STEREO16)
  • 采样率

您还需要一个ALSource来播放缓冲区。如果您在OALSimpleAudio旁边使用它(建议,因为它将为您处理设备和上下文),您需要告诉它不要采用所有可用的来源:

[OALSimpleAudio sharedInstance].reservedSources = 20; // or some number < 32

创建源代码(应该在init中执行此操作):

mySource = [[ALSource source] retain];

您可以使用自定义数据创建ALBuffer,如下所示:

ALBuffer* myBuffer = [ALBuffer bufferWithName:someName
                           data:myAudioData
                           size:audioDataSizeInBytes
                         format:audioFormat
                      frequency:sampleRateInHz];

现在你可以玩:

[mySource play:myBuffer];

编辑:ALBuffer接管音频数据的管理,并在取消分配时调用free()。所以要注意不要双重免费:)

编辑2:我刚刚向ALBuffer添加了“freeDataOnDestroy”属性,因此您现在可以控制它是否释放数据(默认为YES)。

编辑3:拧紧它。我走得这么远,不妨一路走下去。在OALSimpleAudio中添加了“playBuffer”方法。

所以现在你可以留在OALSimpleAudio中了解整个事情:

myBuffer = [[ALBuffer bufferWithName:someName
                           data:myAudioData
                           size:audioDataSizeInBytes
                         format:audioFormat
                      frequency:sampleRateInHz] retain];

...

id<ALSoundSource> source = [[OALSimpleAudio sharedInstance] playBuffer:myBuffer
                                                                volume:1.0
                                                                 pitch:1.0
                                                                   pan:0
                                                                  loop:NO];

[source pitchTo:2.0
       duration:5.0
         target:nil
       selector:nil];
// And so on...