在过去的两周里,我一直在做这件事,这让我发疯了。几天前我问了这个问题(提取iPod库原始样本并播放声音效果),虽然答案让我半途而废,但我还是被困住了。
基本上,我试图实现的是加载多首歌曲从iPod库,以播放效果,如音高弯曲,eq效果等.
我沿着AVPlayer和AVAudioPlayer的路线走,这太简单了。我看到的唯一可以播放这些效果的框架是OpenAL。我已经尝试过一些目标c包装器(Finch和ObjectAL)芬奇不播放压缩音频,而ObjectAL只会为我传递文件的URL (这是我不能做的,因为我只有一个不兼容的iPod库URL)。
一个应用程序做我想要的漂亮的例子是Tap DJ。它可以快速加载iPod库中的歌曲(与TouchDJ不同,它可以播放各种效果)。
任何帮助都将不胜感激。
发布于 2011-02-06 06:54:49
如果您可以将音频数据转换为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:我刚刚将"freeDataOnDestroy“属性添加到ALBuffer中,这样您现在就可以控制它是否释放数据(默认为YES)。
编辑3:去他的。我要走这么远,还是一路走吧。将"playBuffer“方法添加到OALSimpleAudio中。
所以现在你可以呆在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...https://stackoverflow.com/questions/4826800
复制相似问题