Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.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
C 音频队列服务缓冲区是否需要是数据包大小的偶数倍?_C_Cocoa_Core Audio_Audioqueueservices - Fatal编程技术网

C 音频队列服务缓冲区是否需要是数据包大小的偶数倍?

C 音频队列服务缓冲区是否需要是数据包大小的偶数倍?,c,cocoa,core-audio,audioqueueservices,C,Cocoa,Core Audio,Audioqueueservices,我正在尝试使用音频队列服务来播放从外部进程传送的mp3音频。我使用NSTask和NSOutputHandle从命令中获取输出-这部分工作正常。我正在使用音频文件流服务来解析来自命令的数据——这似乎也很有效。在我的音频文件流服务侦听器函数中,我不确定如何处理传入的数据包。如果我能把它们放到音频队列中,那就太好了,但显然不行。您应该定义一系列缓冲区并将它们放入音频队列。缓冲区是否与数据包相对应,或者我是否必须以某种方式转换它们?我不太擅长C或指针数学,所以将任意大小的数据包转换为大小不匹配的缓冲区的

我正在尝试使用音频队列服务来播放从外部进程传送的mp3音频。我使用NSTask和NSOutputHandle从命令中获取输出-这部分工作正常。我正在使用音频文件流服务来解析来自命令的数据——这似乎也很有效。在我的音频文件流服务侦听器函数中,我不确定如何处理传入的数据包。如果我能把它们放到音频队列中,那就太好了,但显然不行。您应该定义一系列缓冲区并将它们放入音频队列。缓冲区是否与数据包相对应,或者我是否必须以某种方式转换它们?我不太擅长C或指针数学,所以将任意大小的数据包转换为大小不匹配的缓冲区的想法让我有点害怕。我已经阅读了很多次Apple文档,但它只涉及从文件中读取,这似乎跳过了整个数据包/缓冲区转换步骤。

您应该能够配置音频队列,以便缓冲区大小与数据包大小匹配。此外,AudioQueue将完成解码mp3的工作-您不需要自己进行任何转换

使用inBufferByteSize参数配置缓冲区大小:

OSStatus AudioQueueAllocateBuffer (
    AudioQueueRef inAQ,
    UInt32 inBufferByteSize,
    AudioQueueBufferRef *outBuffer
);

如果您的数据包大小都不同,则可以使用AudioQueueAllocateBuffer在填充每个缓冲区之前使用该自定义大小分配缓冲区,并在音频队列回调使用后释放缓冲区,而不是重新排队

为了减少内存管理(这会影响性能),如果您知道最大数据包大小,可以分配一个如此大的缓冲区,然后只部分填充该缓冲区(在检查数据包大小以确保其适合之后)。有一个参数mAudioDataByteSize,表示每个缓冲区实际填充的量