【问题标题】:Do Audio Queue Services buffers need to be even multiples of packet size?音频队列服务缓冲区是否需要是数据包大小的倍数?
【发布时间】:2014-04-15 18:55:16
【问题描述】:
我正在尝试使用音频队列服务来播放从外部进程传递的 mp3 音频。我正在使用 NSTask 和 NSOutputHandle 来获取命令的输出 - 这部分工作正常。我正在使用音频文件流服务来解析命令中的数据——这似乎也有效。在我的音频文件流服务侦听器功能中,我不确定如何处理传入的数据包。如果我可以将它们扔到音频队列中会很棒,但显然它不会那样工作。您应该定义一系列缓冲区并将它们排入音频队列。缓冲区可以对应于数据包还是我必须以某种方式转换它们?我不太擅长 C 或指针数学,所以将任意大小的数据包转换为不匹配大小的缓冲区的想法对我来说有点可怕。我已经多次阅读 Apple 文档,但它只涵盖从文件中读取,这似乎跳过了整个数据包/缓冲区转换步骤。
【问题讨论】:
标签:
c
cocoa
core-audio
audioqueueservices
【解决方案1】:
您应该能够配置 AudioQueue,使缓冲区大小与您的数据包大小相匹配。此外,AudioQueue 将完成解码 mp3 的工作 - 您不需要自己进行任何转换。
使用inBufferByteSize参数配置缓冲区大小:
OSStatus AudioQueueAllocateBuffer (
AudioQueueRef inAQ,
UInt32 inBufferByteSize,
AudioQueueBufferRef *outBuffer
);
【解决方案2】:
如果您的数据包大小不同,您可以使用 AudioQueueAllocateBuffer 在填充之前使用该自定义大小分配每个缓冲区,并在音频队列回调使用后释放它而不是重新排队。
为了减少内存管理(这会影响性能),如果您知道最大数据包大小,则可以分配一个那么大的缓冲区,然后仅部分填充该缓冲区(在检查数据包大小以确保它适合之后)。有一个参数,mAudioDataByteSize,表示每个缓冲区实际填充的数量。