2010-11-07 30 views
1

我在以下步驟中創建了一個AudioQueue。AudioQueue無法啓動

  1. 創建AudioQueueNewOutput
  2. 一個新的輸出添加的屬性偵聽器kAudioQueueProperty_IsRunning財產
  3. 分配我的緩衝區與AudioQueueAllocateBuffer
  4. 呼叫AudioQueuePrime
  5. 呼叫AudioQueueStart

的問題是,當我打電話AudioQueuePrime它在控制檯上輸出以下錯誤

AudioConverterNew returned -50 
Prime failed (-50); will stop (11025/0 frames) 

這裏有什麼問題?

PS:

  1. 我在iOS上得到這個錯誤(設備&模擬器)
  2. 調用AudioQueueNewOutput安裝時的輸出回調不會被調用!
  3. 該文件是有效的,AudioStreamBasicDescription不匹配的格式(AAC)
  4. 我測試了墊的AudioStreamer文件,它似乎在那裏工作

示例初始化代碼:


// Get the stream description from the first sample buffer 
OSStatus err = noErr; 

EDSampleBuffer *firstBuf = [sampleBufs objectAtIndex:0]; 
AudioStreamBasicDescription asbd = firstBuf.streamDescription; 

// TODO: remove temporary format setup, just to ensure format for now 
asbd.mSampleRate = 44100.00; 
asbd.mFramesPerPacket = 1024; // AAC default 
asbd.mChannelsPerFrame = 2; 

pfcc(asbd.mFormatID); 
// ----------------------------------- 

// Create a new output 
err = AudioQueueNewOutput(&asbd, _audioQueueOutputCallback, self, NULL, NULL, 0, &audioQueue); 
if (err) { 
    [self _reportError:kASAudioQueueInitializationError]; 
    goto bail; 
} 

// Add property listener for queue state 
err = AudioQueueAddPropertyListener(audioQueue, kAudioQueueProperty_IsRunning, _audioQueueIsRunningCallback, self); 
if (err) { 
    [self _reportError:kASAudioQueuePropertyListenerError]; 
    goto bail; 
} 

// Allocate a queue buffers 
for (int i=0; i<kAQNumBufs; i++) { 
    err = AudioQueueAllocateBuffer(audioQueue, kAQDefaultBufSize, &queueBuffer[i]); 
    if (err) { 
     [self _reportError:kASAudioQueueBufferAllocationError]; 
     goto bail; 
    } 
} 

// Prime and start 
err = AudioQueuePrime(audioQueue, 0, NULL); 
if (err) { 
    printf("failed to prime audio queue %ld\n", err); 
    goto bail; 
} 

err = AudioQueueStart(audioQueue, NULL); 
if (err) { 
    printf("failed to start audio queue %ld\n", err); 
    goto bail; 
} 

這些是來自音頻文件流的格式標誌

rate: 44100.000000 
framesPerPacket: 1024 
format: aac 
bitsPerChannel: 0 
reserved: 0 
channelsPerFrame: 2 
bytesPerFrame: 0 
bytesPerPacket: 0 
formatFlags: 0 
cookieSize 39 
+0

你能提供我們的代碼嗎?謝謝。 – 2010-11-07 12:54:27

+0

@Jacob這不是很多,但我現在附上它 – 2010-11-07 12:59:42

回答

4
AudioConverterNew returned -50 
Prime failed (-50); will stop (11025/0 frames) 

這裏有什麼問題?

你做錯了。

不,真的。那就是那個錯誤的意思,那就是所有的那個錯誤的意思。

這就是爲什麼paramErr(-50)就是這樣一個惱人的錯誤代碼:這並不是說一個該死的東西有關什麼您(或其他人)沒有錯。

第一步制定關於它抱怨什麼的猜測是找出哪個函數返回了該錯誤。更改您的_reportError:方法,使您能夠記錄返回錯誤的函數的名稱。然後,記錄傳遞給該函數的參數,並找出爲什麼它認爲這些函數的參數沒有意義。

我自己瘋狂的猜測是,這是因爲您強制進入ASBD的值與樣本緩衝區的特徵不匹配。您在問題中包含的日誌輸出顯示「11025/0 frames」; 11025是一種常見的採樣率(但與44100不同)。我猜你會知道0指的是什麼。

+0

如果是這樣簡單,我不會問。返回錯誤的函數可以是'AudioQueuePrime'或'AudioQueueStart'。 'AudioStreamBasicDescription'對於我當前使用的文件是準確的(使用'AudioFileStream' API和Quicktime進行檢查) – 2010-11-07 15:53:29

+0

我附加了音頻文件流中的解析格式標誌 – 2010-11-07 15:56:37

+0

Erik Aigner:我沒有錯過你;這是一個非常模糊的錯誤代碼。正如我所說,所有錯誤代碼所說的是「你做錯了」。這很糟糕。無論如何,就像我說的,你應該確定哪個函數返回錯誤。另外請注意,有時一個函數失敗時可能會導致後來的失敗。 – 2010-11-07 16:01:47