7

我正在从包含编码 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 上我做不到。

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

任何帮助将不胜感激,特别是以示例代码的形式。

4

2 回答 2

7

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

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

注意:第一个链接还向您展示了如何使用 Audio Unit 进行播放。

于 2013-01-21T23:49:33.167 回答
3

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

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

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

您也可以使用 AudioUnits,不过要复杂一些。

于 2013-01-22T16:48:15.940 回答