2016-10-25 183 views
0

我正在嘗試使用AudioQueue從服務器播放PCM流數據。如何設置AudioStreamBasicDescription屬性?

PCM數據格式:

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

而且,服務器不流固定字節到客戶端。 (可變字節) (例如:30848,128,2764,...字節)

如何設置ASBD? 我不知道如何設置mFramesPerPacket,mBytesPerFrame,mBytesPerPacket。 我已閱讀Apple參考文檔,但沒有詳細說明。

請給我任何想法。

新增加的:在這裏,ASBD結構是我設定的。 (language: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)

請給我任何的想法。

回答

1

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; 
+0

謝謝您的回答。但是,我已經像上面那樣設置了ASBD結構。 AudioQueue很好地播放流媒體PCM數據幾秒鐘,但很快播放停止。我能做什麼? – user6081283

+0

檢查音頻對象是否未釋放 – Bogdan