我从包含编码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上我很快就会出现。
我尝试使用音频文件流服务,但我猜我做错了,因为没有声音出现,我觉得这些功能本身并没有实际播放。我还试图了解音频队列服务(我认为它可能接近我想要的),但我无法找到任何简单的代码示例供其使用。
非常感谢任何帮助,特别是以示例代码的形式。
答案 0 :(得分:5)
您需要使用某种类型的缓冲区来保存传入的UDP数据。 This是一个简单而好用的循环缓冲区。
然后,要从缓冲区播放数据,您可以使用Audio Unit框架。 Here是一个很好的示例项目。
注意:第一个链接还会显示如何使用音频单元播放。
答案 1 :(得分:3)
您也可以使用audioQueue服务,确保您进行某种数据包重新排序,如果您使用ffmpeg对流进行解码,则可以选择此选项。
否则音频队列很容易设置。
https://github.com/mooncatventures-group/iFrameExtractor/blob/master/Classes/AudioController.m
你也可以使用AudioUnits,虽然有点复杂。