【问题标题】:AudioQueue fails to startAudioQueue 无法启动
【发布时间】:2011-05-06 06:57:45
【问题描述】:

我在以下步骤中创建了一个 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. 我用 Mat 的 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

【问题讨论】:

  • 你能提供给我们代码吗?谢谢。
  • @Jacob 真的不多,不过我现在附上

标签: objective-c cocoa cocoa-touch core-audio audio-streaming


【解决方案1】:
AudioConverterNew returned -50
Prime failed (-50); will stop (11025/0 frames)

这里有什么问题?

你做错了。

不,真的。这就是那个错误的意思,这就是 ALL 这个错误的意思。

这就是为什么paramErr (-50) 是一个如此烦人的错误代码:它并没有说明你(或其他任何人)做错了什么。

对它所抱怨的问题进行猜测的第一步是找出哪个函数返回了该错误。更改您的 _reportError: 方法以使您能够记录返回错误的函数的名称。然后,记录您传递给该函数的参数,并找出为什么认为该函数的这些参数没有意义。

我自己的猜测是,这是因为您强制输入 ASBD 的值与样本缓冲区的特征不匹配。您在问题中包含的日志输出显示“11025/0 帧”; 11025 是常见的采样率(但不同于 44100)。我想你应该知道 0 指的是什么。

【讨论】:

  • 如果这么简单我就不会问了。返回错误的函数是AudioQueuePrimeAudioQueueStartAudioStreamBasicDescription 对于我当前使用的文件是准确的(使用 AudioFileStream API 和 Quicktime 检查)
  • 我从音频文件流中附加了解析的格式标志
  • 埃里克·艾格纳:我没有责怪你;这是一个非常模糊的错误代码。正如我所说,所有错误代码都是“你做错了”。太糟糕了。无论如何,就像我说的那样,您应该准确确定哪个函数正在返回错误。另外,请注意,有时一个功能较早失败可能会导致后来的功能失败。
  • 我知道这一点,如果某个功能在此之前失败,我已经检查了无数次。但他们没有:(
  • 经过 7 小时的修补,我得到了它......这是 EDSampleBuffer 类中的一个错误,导致未初始化的 AudioStreamBasicDescription 结构值被复制,从而导致一些随机描述参数
猜你喜欢
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
  • 2020-10-25
  • 2011-05-14
  • 1970-01-01
  • 2017-05-16
  • 2018-02-22
  • 1970-01-01
相关资源
最近更新 更多