Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.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 使用AudioQueueServices同时播放(10+;)_Iphone_Objective C_Audioqueueservices - Fatal编程技术网

Iphone 使用AudioQueueServices同时播放(10+;)

Iphone 使用AudioQueueServices同时播放(10+;),iphone,objective-c,audioqueueservices,Iphone,Objective C,Audioqueueservices,有人能告诉我iPhone是如何做到这一点的吗?我正在尝试制作一个能同时播放12种声音的游戏,但我不知道如何使用AudioQueueServices。我知道您必须初始化、添加缓冲区、播放它们并使用AudioQueuenBufferWithParameters实现同步播放,但我不知道如何将其转换为代码。任何有代码的人或者能向我解释的人都会很了不起 如果你听说过音格/音板,那正是我想要做的。我知道Appstore中已经有一些应用程序可以做到这一点,但我不知道它是如何做到的 TLDR;需要有关Audio

有人能告诉我iPhone是如何做到这一点的吗?我正在尝试制作一个能同时播放12种声音的游戏,但我不知道如何使用AudioQueueServices。我知道您必须初始化、添加缓冲区、播放它们并使用AudioQueuenBufferWithParameters实现同步播放,但我不知道如何将其转换为代码。任何有代码的人或者能向我解释的人都会很了不起

如果你听说过音格/音板,那正是我想要做的。我知道Appstore中已经有一些应用程序可以做到这一点,但我不知道它是如何做到的

TLDR;需要有关AudioQueueServices的帮助,可同时播放10多种声音

例如:

新播放 排队缓冲区 设置流格式字段
AudioQueue无法同时播放多个声音。它只是从排队的缓冲区中逐个发送音频数据值。所以你需要把所有你想同时播放的声音合成为一个声音。 你怎么能做到? 如果数据没有被压缩,就不会太硬。 你有两种不同的声音。它们中的每一个都可以描述为从-1到1的浮点值数组。当声音存储在文件中或排队到audioQueue时,它们必须以适当的格式表示。在您的例子中(kAudioFormatLinearPCM,streamFormat.mBitsPerChannel=16),它是两个字节的整数,每个值表示为-32767到32767之间的短整数。 因此,两个声音中的每一个都是一个短数组,当您将缓冲区放入队列时,您会用该数组的值填充它(如果声音不是从文件中动态生成的,则该数组不存在,但会逐个计算值)。 要创建这两个音频文件的“和”,您应该将每个新数组值构造为 两个声音数组对应值的平均值。
i、 e.结果声音[i]=sound1[i]/2+sound2[i]/2
对于任何数量的声音都是一样的。 例如,为了产生纯粹的谐波声音,您需要填充缓冲区,如:

buffer[i] = sin(i * 2 * M_PI * frequency / sampleRate) * 32767;
以及混合两种不同频率的谐波:

buffer[i] = sin(i * 2 * M_PI * frequency1 / sampleRate) + sin(i * 2 * M_PI * frequency2 / sampleRate) * 0.5 * 32767;

AudioQueue可以同时播放声音

来自苹果:

如何同时播放多个声音

使用音频队列服务(AudioToolbox/AudioQueue.h)中的接口。为要播放的每个声音创建一个音频队列对象。然后使用AudioQueuenQueueBufferWithParameters函数指定每个音频队列中第一个音频缓冲区的同时启动时间

以下限制适用于iPhone操作系统中的同步声音,具体取决于音频数据格式:

AAC、MP3和ALAC(苹果无损)音频:您可以同时播放多个AAC、MP3和ALAC格式的声音;播放这些格式的多种声音需要CPU资源进行解码

线性PCM和IMA/ADPCM(IMA4音频):您可以同时播放多个线性PCM或IMA4格式的声音,而无需担心CPU资源问题


请记住,您处理的是单个音频流,因此您需要自己创建组合流,或者您可以使用混音器单元为其提供多个流。请参阅苹果公司的“音频混音器(MixerHost)”示例代码。

对于仍想知道OpenAL是我认为最好的方式的人来说。
isPlaying = YES;
err = AudioQueueStart(outputQueue, nil);
if (err != noErr) { NSLog(@"AudioQueueStart() error: %d", err); isPlaying= NO; return; }
} else {
NSLog (@"Error: audio is already playing back.");
BOOL isHighSampleRate = (sampleRate > 16000);
int bufferByteSize;
AudioQueueBufferRef buffer;

AudioStreamBasicDescription streamFormat;
streamFormat.mSampleRate = sampleRate;
streamFormat.mFormatID = kAudioFormatLinearPCM;
streamFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked;
streamFormat.mBitsPerChannel = 16;
streamFormat.mChannelsPerFrame = 1;
streamFormat.mBytesPerPacket = 2 * streamFormat.mChannelsPerFrame;
streamFormat.mBytesPerFrame = 2 * streamFormat.mChannelsPerFrame;
streamFormat.mFramesPerPacket = 1;
streamFormat.mReserved = 0;
buffer[i] = sin(i * 2 * M_PI * frequency / sampleRate) * 32767;
buffer[i] = sin(i * 2 * M_PI * frequency1 / sampleRate) + sin(i * 2 * M_PI * frequency2 / sampleRate) * 0.5 * 32767;