2011-01-28 39 views
3

过去两周我一直在这样做,这让我疯狂。前几天我问了这个问题(Extract iPod Library raw PCM samples and play with sound effects),而答案让我一半在那里,我仍然坚持。在iPhone上播放多个iPod库歌曲同时播放弯音和其他效果

基本上,我想实现的是从iPod库中加载了多首歌曲与效果,如弯音,EQ效果等播放...

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

一个我想要美化的应用程序的例子是Tap DJ。它最多可以装载从iPod库中的快歌(不像TouchDJ并播放它们与各种影响。

任何帮助将非常感激。

回答

5

如果你能得到的音频数据转换成原始的PCM格式。这OpenAL的喜欢,你可以将其加载到ObjectAL

你需要的是:

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

你还需要一个ALSource起到缓冲的格式。如果您在使用本OALSimpleAudio的旁边(推荐,因为它会为你处理设备和环境),你需要告诉它不要采取一切可用来源:

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

创建源(应在初始化做到这一点):

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:拧紧它。我要走这么远,不妨一路走下去。向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... 
+0

现在还有一个更简单的`[OALManager sharedInstance] bufferFromUrl:URL reduceToMono: NO]调用内部使用`bufferWithName:data:size:format:frequency`。用它来创建一个`ALBuffer *`,然后使用`playBuffer`方法 – 2011-07-11 19:21:24