如何设置AudioStreamBasicDescription属性?

use*_*283 5 pcm audioqueue ios

我正在尝试使用 AudioQueue 从服务器播放 PCM 流数据。

PCM数据格式:

Sample rate = 48000, num of channel = 2, Bit per sample = 16
Run Code Online (Sandbox Code Playgroud)

并且,服务器不会将固定字节流式传输到客户端。(可变字节。)(例如:30848、128、2764、...字节)

如何设置ASBD?不知道怎么设置mFramesPerPacket,,mBytesPerFramemBytesPerPacket我看过Apple的参考文档,但是没有详细的说明。

请给我任何想法。

新添加: 这里,ASBD结构是我设置的。(语言:斯威夫特)

// 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)

...
Run Code Online (Sandbox Code Playgroud)

我已经像上面一样设置了 ASBD 结构。

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

但很快比赛就停止了。我能做些什么?

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

请给我任何想法。

Qas*_*sim 3

ASBD 只是一个底层定义的结构,如下所示:

struct AudioStreamBasicDescription
{
    Float64             mSampleRate;
    AudioFormatID       mFormatID;
    AudioFormatFlags    mFormatFlags;
    UInt32              mBytesPerPacket;
    UInt32              mFramesPerPacket;
    UInt32              mBytesPerFrame;
    UInt32              mChannelsPerFrame;
    UInt32              mBitsPerChannel;
    UInt32              mReserved;
};
typedef struct AudioStreamBasicDescription  AudioStreamBasicDescription;
Run Code Online (Sandbox Code Playgroud)

您可以像这样设置结构体的变量:

AudioStreamBasicDescription streamFormat;

streamFormat.mFormatID = kAudioFormatLinearPCM;
streamFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked;

streamFormat.mSampleRate = sampleRate;
streamFormat.mBitsPerChannel = bitsPerChannel;
streamFormat.mChannelsPerFrame = channelsPerFrame;
streamFormat.mFramesPerPacket = 1;

int bytes = (bitsPerChannel / 8) * channelsPerFrame;
streamFormat.mBytesPerFrame = bytes;
streamFormat.mBytesPerPacket = bytes;
Run Code Online (Sandbox Code Playgroud)