2010-11-07 169 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