AudioQueue无法启动

时间:2010-11-07 12:52:55

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

我按照以下步骤创建了一个AudioQueue。

  1. 使用AudioQueueNewOutput
  2. 创建新输出
  3. kAudioQueueProperty_IsRunning属性
  4. 添加属性侦听器
  5. 使用AudioQueueAllocateBuffer
  6. 分配我的缓冲区
  7. 致电AudioQueuePrime
  8. 致电AudioQueueStart
  9. 问题是,当我呼叫AudioQueuePrime时,它会在控制台上输出以下错误

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

    这里有什么问题?

    PS:

    1. 我在iOS(设备和模拟器)
    2. 上遇到此错误
    3. 永远不会调用调用AudioQueueNewOutput时安装的输出回调!
    4. 该文件有效且AudioStreamBasicDescription符合格式(AAC)
    5. 我用Mat的AudioStreamer测试了该文件,似乎在那里工作
    6. 示例初始化代码:


      // 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 个答案:

答案 0 :(得分:4)

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

这里有什么问题?

你做错了。

不,真的。这就是错误的含义,而错误意味着 ALL

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

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

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