gpt4 book ai didi

ios - 如何在 iOS 中播放来自服务器的流式 PCM 数据?

转载 作者:可可西里 更新时间:2023-11-01 00:36:04 27 4
gpt4 key购买 nike

我正在尝试开发从服务器播放流式 PCM 数据的应用。

我使用过 AudioQueue,但效果不佳。

PCM 数据格式(来自服务器):

Sample rate = 48000, num of channel = 2, Bit per sample = 16

并且,服务器不会将固定字节流式传输到客户端。

(流式可变字节。例如:30848、128、2764,...字节)

我的源代码:

在这里,ASBD 构建我设置的内容并创建音频队列对象(语言:Swift)

// Create ASBD structure & set properties.
var streamFormat = AudioStreamBasicDescription()

streamFormat.mSampleRate = 48000
streamFormat.mFormatID = kAudioFormatLinearPCM
streamFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked
streamFormat.mFramesPerPacket = 1
streamFormat.mChannelsPerFrame = 2
streamFormat.mBitsPerChannel = 16

streamFormat.mBytesPerFrame = (streamFormat.mBitsPerChannel / 8) * streamFormat.mChannelsPerFrame
streamFormat.mBytesPerPacket = streamFormat.mBytesPerFrame
streamFormat.mReserved = 0

// Create AudioQueue for playing PCM streaming data.
var err = AudioQueueNewOutput(&streamFormat, self.queueCallbackProc, nil, nil, nil, 0, &aq)

...

我已经像上面那样设置了 ASBD 结构并创建了 AudioQueue 对象。

AudioQueue 可以很好地播放流式 PCM 数据几秒钟,

但很快播放声音就断断续续了。我能做什么?

(仍在流式传输,并排队 AudioQueue)

请给我任何想法。

最佳答案

你需要(至少)做两件事:

您需要缓冲数据以处理来自服务器的数据与音频队列回调请求的数据之间的延迟抖动和不同的数据包大小。一个典型的解决方案涉及使用循环 fifo/缓冲区,预先填充一定数量的数据,足以处理最糟糕的网络抖动情况(您需要统计分析这个数字)。音频队列回调可以从循环 fifo 中复制请求的数据量。网络代码试图让它充满。

当两个比率不够相同时,您可能还需要一些方法来隐藏错误:例如一些在网络速率太慢时复制或合成额外声音的方法,以及一些在网络速率太高时省略样本的方法,这两种方法都试图尽可能地听不见并且不会在任何速率不连续或网络辍学。

关于ios - 如何在 iOS 中播放来自服务器的流式 PCM 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40733147/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com