过去两周我一直在这,这让我发疯。几天前我问了这个问题(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不同,它可以播放各种各样的效果。
非常感谢任何帮助。
答案 0 :(得分:5)
如果您可以将音频数据转换为OpenAL喜欢的原始PCM格式,您可以将其加载到ObjectAL中。
您需要的是:
您还需要一个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...