iOS:从流中播放PCM缓冲区

时间:2013-01-21 22:08:36

标签: ios audio pcm

我从包含编码PCM缓冲区的套接字收到一系列UDP数据包。解码后,我留下了一个int16 *音频缓冲区,我想立即播放。

预期的逻辑是这样的:

init(){
   initTrack(track, output, channels, sample_rate, ...);
}

onReceiveBufferFromSocket(NSData data){
   //Decode the buffer
   int16 * buf = handle_data(data);

   //Play data
   write_to_track(track, buf, length_of_buf, etc);
}

我不确定与播放缓冲区有关的所有内容。在Android上,我可以通过创建一个AudioTrack对象来实现这一点,通过指定采样率,格式,通道等来设置它...然后只需用缓冲区调用“write”方法(就像我希望的那样)我可以在上面的伪代码中)但在iOS上我很快就会出现。

我尝试使用音频文件流服务,但我猜我做错了,因为没有声音出现,我觉得这些功能本身并没有实际播放。我还试图了解音频队列服务(我认为它可能接近我想要的),但我无法找到任何简单的代码示例供其使用。

非常感谢任何帮助,特别是以示例代码的形式。

2 个答案:

答案 0 :(得分:5)

您需要使用某种类型的缓冲区来保存传入的UDP数据。 This是一个简单而好用的循环缓冲区。

然后,要从缓冲区播放数据,您可以使用Audio Unit框架。 Here是一个很好的示例项目。

注意:第一个链接还会显示如何使用音频单元播放。

答案 1 :(得分:3)

您也可以使用audioQueue服务,确保您进行某种数据包重新排序,如果您使用ffmpeg对流进行解码,则可以选择此选项。

否则音频队列很容易设置。

https://github.com/mooncatventures-group/iFrameExtractor/blob/master/Classes/AudioController.m

你也可以使用AudioUnits,虽然有点复杂。