代码之家  ›  专栏  ›  技术社区  ›  Era

音频队列无法启动

  •  1
  • Era  · 技术社区  · 15 年前

    1. 使用创建新输出 AudioQueueNewOutput
    2. 为添加属性侦听器 kAudioQueueProperty_IsRunning
    3. 为我的缓冲区分配 AudioQueueAllocateBuffer
    4. 呼叫 AudioQueuePrime
    5. 呼叫 AudioQueueStart

    问题是,当我打电话 音频队列素数 它在控制台上输出以下错误

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

    这里怎么了?

    附言:

    1. 我在iOS(设备和模拟器)上遇到此错误
    2. 调用时安装的输出回调 音频队列新输出 从来没人叫过!
    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
    
    1 回复  |  直到 15 年前
        1
  •  4
  •   Peter Hosey    15 年前
    AudioConverterNew returned -50
    Prime failed (-50); will stop (11025/0 frames)
    

    这里怎么了?

    你做错了。

    全部

    这就是为什么 paramErr (-50)是一个非常烦人的错误代码:它一点也不说 什么 你(或其他人)做错了。

    对于它所抱怨的是什么,建立猜测的第一步是找出哪个函数返回了那个错误。改变你的 _reportError:

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