在我的应用程序中,我正在接收需要播放的LinearPCM格式的音频数据。 我正在关注iOS SpeakHere示例。但是我无法得到如何以及在哪里我应该提供缓冲区到AudioQueue
。如何向AudioQueue提供音频缓冲区来播放音频?
任何人都可以提供我通过AudioQueue
在iOS中播放音频缓冲区的工作示例吗?
在我的应用程序中,我正在接收需要播放的LinearPCM格式的音频数据。 我正在关注iOS SpeakHere示例。但是我无法得到如何以及在哪里我应该提供缓冲区到AudioQueue
。如何向AudioQueue提供音频缓冲区来播放音频?
任何人都可以提供我通过AudioQueue
在iOS中播放音频缓冲区的工作示例吗?
在SpeakHere示例中,播放是使用AudioQueue
实现的。
在AudioQueue
的设置中,指定了一个将在队列需要更多数据时调用的函数。
你可以看到,在这个方法:
void AQPlayer::SetupNewQueue()
下面是指定回调函数行:
XThrowIfError(AudioQueueNewOutput(&mDataFormat, AQPlayer::AQBufferCallback, this,
CFRunLoopGetCurrent(), kCFRunLoopCommonModes, 0, &mQueue), "AudioQueueNew failed");
如果你看一看AQPlayer::AQBufferCallback
,你会看到它得到数据来自。在本例中,数据已写入磁盘上的文件。如果您想节省内存,或者音频文件可能非常大,那么这是一个很好的解决方案。
无论如何,看着AQPlayer::AQBufferCallback
,你会看到一个函数AudioFileReadPackets
的调用。这就是从磁盘上的文件中读取音频数据包的内容。它读取他们直入缓冲区AudioQueue
将使用:
OSStatus result = AudioFileReadPackets(THIS->GetAudioFileID(), false, &numBytes, inCompleteAQBuffer->mPacketDescriptions, THIS->GetCurrentPacket(), &nPackets,
inCompleteAQBuffer->mAudioData);
该缓冲区inCompleteAQBuffer->mAudioData
。第一
if (nPackets > 0) {
inCompleteAQBuffer->mAudioDataByteSize = numBytes;
inCompleteAQBuffer->mPacketDescriptionCount = nPackets;
AudioQueueEnqueueBuffer(inAQ, inCompleteAQBuffer, 0, NULL);
THIS->mCurrentPacket = (THIS->GetCurrentPacket() + nPackets);
}
注意,它有检查,我们有一些数据包玩:
最后,回调函数必须如下排队缓冲区。它还必须指定缓冲区中有多少个字节。
然后,这条线的位置:
THIS->mCurrentPacket = (THIS->GetCurrentPacket() + nPackets);
这令我们是整体在我们的音频缓冲,其中轨道。换句话说,随着从文件复制更多数据,我们需要将mCurrentPacket
转发到下一个副本将数据放入正确位置。