2013-10-08 80 views
6

的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

回答

相關問題