失真(机器人)的音频使用AudioQueue

问题描述:

的iOS我使用AudioQueue iOS中实现记录到网络的数据流记录。失真(机器人)的音频使用AudioQueue

问题是,它通常工作得很好,但有时(〜20%的尝试)声音可怕地扭曲 - 这听起来是机器人。

编辑: 我能够重现它很容易在iOS6的和ios6.1模拟器 - 但我无法重现它真正的手机上(ios6.1.3)。

试图调试它我将PCM数据保存到文件。 PCM文件中出现相同的失真,所以这在编码或上传代码中不是问题。我也尝试过使用缓冲区的数量和缓冲区的大小 - 没有任何帮助。

的问题是我不知道如何进一步调试它 - 它出现在缓冲区被扭曲为输入回调 - 被激活(除了音频队列配置)我的代码之前。

  • 你有什么想法可能是什么问题?
  • 或如何进一步调试呢?

队列设置代码:

audioFormat.mFormatID   = kAudioFormatLinearPCM; 
audioFormat.mSampleRate  = SAMPLE_RATE; //16000.0; 
audioFormat.mChannelsPerFrame = CHANNELS; //1; 
audioFormat.mBitsPerChannel = 16; 
audioFormat.mFramesPerPacket = 1; 
audioFormat.mBytesPerFrame = audioFormat.mChannelsPerFrame * sizeof(SInt16); 
audioFormat.mBytesPerPacket = audioFormat.mBytesPerFrame * audioFormat.mFramesPerPacket; 
audioFormat.mFormatFlags  = kLinearPCMFormatFlagIsSignedInteger 
            | kLinearPCMFormatFlagIsPacked; 

AudioQueueNewInput(
    &audioFormat, 
    recordCallback, 
    self,    // userData 
    CFRunLoopGetMain(), // run loop 
    NULL,    // run loop mode 
    0,     // flags 
    &recordQueue); 

UInt32 trueValue = true; 
    AudioQueueSetProperty(recordQueue,kAudioQueueProperty_EnableLevelMetering,&trueValue,sizeof (UInt32)); 

for (int t = 0; t < NUMBER_AUDIO_DATA_BUFFERS; ++t) 
{ 
    AudioQueueAllocateBuffer(
     recordQueue, 
     bufferByteSize, 
     &recordQueueBuffers[t]); 
} 

for (int t = 0; t < NUMBER_AUDIO_DATA_BUFFERS; ++t) 
{ 
    AudioQueueEnqueueBuffer(
     recordQueue, 
     recordQueueBuffers[t], 
     0, 
     NULL); 
} 

开始录制功能:

pcmFile = [[NSOutputStream alloc] initToFileAtPath:pcmFilePath append:YES]; 
[pcmFile scheduleInRunLoop:[NSRunLoop currentRunLoop] 
         forMode:NSDefaultRunLoopMode]; 
[pcmFile open]; 
setupQueue(); // see above 
AudioQueueStart(recordQueue, NULL); 

回调代码:

static void recordCallback(
    void* inUserData, 
    AudioQueueRef inAudioQueue, 
    AudioQueueBufferRef inBuffer, 
    const AudioTimeStamp* inStartTime, 
    UInt32 inNumPackets, 
    const AudioStreamPacketDescription* inPacketDesc) 

    Recorder* recorder = (Recorder*) inUserData; 
    if (!recorder.recording) 
     return; 
    [recorder.pcmFile write:inBuffer->mAudioData maxLength:inBuffer->mAudioDataByteSize]; 
    AudioQueueEnqueueBuffer(inAudioQueue, inBuffer, 0, NULL); 
} 
+0

同样的问题... – Idan

我们在SoundJS网络音频iOS上完全一样的问题,每当一个视频元素的存在,以及缓存是空的。一旦缓存,问题就消失了。我们无法找到解决方法或解决此问题的方法。

您可以在我们的社区论坛上阅读的细节:

http://community.createjs.com/discussions/soundjs/162-ios-audio-distortion-when-video-element-exists

希望有所帮助。这里