Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用音调弯曲&;在iPhone上同时播放多首iPod库歌曲;其他影响_Iphone_Objective C_Ipod_Openal_Audio - Fatal编程技术网

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

使用音调弯曲&;在iPhone上同时播放多首iPod库歌曲;其他影响,iphone,objective-c,ipod,openal,audio,Iphone,Objective C,Ipod,Openal,Audio,在过去的两周里,我一直在这样做,这让我发疯。几天前我问了这个问题(),虽然答案让我半途而废,但我还是被卡住了 基本上,我试图实现的是从iPod库中加载多首歌曲,以便播放效果,如音调弯曲、eq效果等 我已经走上了AVPlayer和AVAudioPlayer的路线,它们太简单了。我所见过的唯一一个可以用这些效果播放音频的框架是OpenAL。我尝试了一些objective c包装(Finch和ObjectAL)Finch不会播放压缩音频,而ObjectAL只会在我传入文件的URL时为我转换它(这是我无

在过去的两周里,我一直在这样做,这让我发疯。几天前我问了这个问题(),虽然答案让我半途而废,但我还是被卡住了

基本上,我试图实现的是从iPod库中加载多首歌曲,以便播放效果,如音调弯曲、eq效果等

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

一个应用程序的例子,做什么我想美化是。它可以快速从iPod音乐库中加载歌曲(与之不同),并以各种效果播放歌曲


任何帮助都将不胜感激。

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

您需要的是:

  • 音频数据
  • 数据的大小(以字节为单位)
  • 数据的格式(AL_格式MONO16或AL_格式MONO16)
  • 抽样率
您还需要一个ALSource来播放缓冲区。如果您将此与OALSimpleAudio一起使用(推荐使用,因为它将为您处理设备和上下文),您需要告诉它不要使用所有可用的源:

[OALSimpleAudio sharedInstance].reservedSources = 20; // or some number < 32
您可以使用自定义数据创建ALBuffer,如下所示:

ALBuffer* myBuffer = [ALBuffer bufferWithName:someName
                           data:myAudioData
                           size:audioDataSizeInBytes
                         format:audioFormat
                      frequency:sampleRateInHz];
现在您可以玩:

[mySource play:myBuffer];
编辑:ALBuffer接管了音频数据的管理,并将在解除分配时对其调用free()

编辑2:我刚刚将“freeDataOnDestroy”属性添加到ALBuffer中,以便您现在可以控制它是否释放数据(默认为“是”)

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

因此,现在您可以一直呆在OALSimpleAudio中:

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

id source=[[OALSimpleAudio sharedInstance]播放缓冲区:myBuffer
卷数:1.0
音高:1.0
潘:0
循环:否];
[来源:2.0]
持续时间:5.0
目标:零
选择器:无];
//等等。。。

现在还有一个更简单的
[[OALManager sharedInstance]bufferFromUrl:url reduceToMono:NO]调用,它在内部使用
bufferWithName:data:size:format:frequency
。使用它创建一个
ALBuffer*`然后使用
playBuffer
方法
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...