如何设置AudioStreamBasicDescription属性



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

数据格式:

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

并且,服务器没有将固定字节流式传输到客户端。(可变字节)。(例:30848,128,2764,…字节)

如何设置ASBD ?我不知道如何设置mFramesPerPacket, mBytesPerFrame, mBytesPerPacket。我已经阅读了Apple的参考文档,但是没有详细的描述。

请给我一些建议。

新增:这里,我已经设置的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播放流PCM数据非常好几秒钟,

但很快演奏就停止了。我能做什么?

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

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;

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

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;

相关内容

  • 没有找到相关文章

最新更新