同时使用音高弯曲和其他效果在iPhone上播放多个iPod库歌曲

Din*_*ino 3 iphone audio openal ipod objective-c

过去两周我一直在这里,这让我发疯.几天前我问过这个问题(提取iPod库原始PCM样本并播放声音效果),虽然答案让我走了一半,但我仍然卡住了.

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

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

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

任何帮助将非常感激.

Kar*_*arl 5

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

你需要的是:

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

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

[OALSimpleAudio sharedInstance].reservedSources = 20; // or some number < 32
Run Code Online (Sandbox Code Playgroud)

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

mySource = [[ALSource source] retain];
Run Code Online (Sandbox Code Playgroud)

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

ALBuffer* myBuffer = [ALBuffer bufferWithName:someName
                           data:myAudioData
                           size:audioDataSizeInBytes
                         format:audioFormat
                      frequency:sampleRateInHz];
Run Code Online (Sandbox Code Playgroud)

现在你可以玩:

[mySource play:myBuffer];
Run Code Online (Sandbox Code Playgroud)

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

编辑2:我刚刚将"freeDataOnDestroy"属性添加到ALBuffer,因此您现在可以控制是否释放数据(默认为YES).

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

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

myBuffer = [[ALBuffer bufferWithName:someName
                           data:myAudioData
                           size:audioDataSizeInBytes
                         format:audioFormat
                      frequency:sampleRateInHz] retain];
Run Code Online (Sandbox Code Playgroud)

...

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...
Run Code Online (Sandbox Code Playgroud)