我在以下步骤中创建一个AudioQueue。


AudioQueueNewOutput创建新的输出
kAudioQueueProperty_IsRunning属性添加属性侦听器
AudioQueueAllocateBuffer分配我的缓冲区
致电AudioQueuePrime
致电AudioQueueStart


问题是,当我调用AudioQueuePrime时,它在控制台上输出以下错误

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


怎么了

PS:


我在iOS(设备和模拟器)上收到此错误
永远不会调用在调用AudioQueueNewOutput时安装的输出回调!
该文件有效,并且AudioStreamBasicDescription与格式(AAC)匹配
我用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

最佳答案

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

  
  怎么了


你做错了。

不完全是。这就是错误的含义,而这就是错误的含义。

这就是paramErr(-50)如此令人讨厌的错误代码的原因:它没有说您(或其他任何人)做错了什么该死的事情。

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

我自己的疯狂猜测是,因为您强加到ASBD中的值与样本缓冲区的特征不匹配。问题中包含的日志输出为“ 11025/0帧”; 11025是常用采样率(但不同于44100)。我想您会知道0指的是什么。

关于objective-c - AudioQueue无法启动,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4117776/

10-12 04:52