我按照以下步骤创建了一个AudioQueue。
AudioQueueNewOutput
kAudioQueueProperty_IsRunning
属性AudioQueueAllocateBuffer
AudioQueuePrime
AudioQueueStart
问题是,当我呼叫AudioQueuePrime
时,它会在控制台上输出以下错误
AudioConverterNew returned -50
Prime failed (-50); will stop (11025/0 frames)
这里有什么问题?
PS:
AudioQueueNewOutput
时安装的输出回调!AudioStreamBasicDescription
符合格式(AAC)示例初始化代码:
// 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 :(得分:4)
AudioConverterNew returned -50 Prime failed (-50); will stop (11025/0 frames)
这里有什么问题?
你做错了。
不,真的。这就是错误的含义,而错误意味着 ALL 。
这就是为什么paramErr
( - 50)是一个令人烦恼的错误代码:它并没有说明你(或其他任何人)做错了什么
制定关于它抱怨的猜测的第一步是找出哪个函数返回了该错误。更改_reportError:
方法以使您能够记录返回错误的函数的名称。然后,记录您传递给该函数的参数,并找出为什么认为该函数的那些参数没有意义。
我自己的猜测是因为你被强制进入ASBD的值与样本缓冲区的特征不匹配。您在问题中包含的日志输出显示为“11025/0帧”; 11025是常见的采样率(但与44100不同)。我假设你知道0指的是什么。