2013-10-08 14 views
6

Ich verwende AudioQueue in iOS, um das Streaming von Aufzeichnungen ins Internet zu implementieren.Verzerrte (robotische) Audioaufnahme unter iOS mit AudioQueue

Das Problem ist, dass es in der Regel funktioniert ziemlich gut, aber manchmal (~ 20% meiner Versuche) ist der Sound schrecklich verzerrt - es klingt roboterhaft.

Edit: Ich bin in der Lage, es zu reproduzieren ganz leicht auf dem iOS6 und ios6.1 Simulator - aber ich war nicht in der Lage es auf einem echten Telefon zu reproduzieren (ios6.1.3).

Versuch zu debuggen Ich speichere die PCM-Daten in eine Datei. Die gleiche Verzerrung wird in der PCM-Datei angezeigt. Dies ist also kein Problem im Codierungs- oder Upload-Code. Ich habe auch versucht, mit der Anzahl der Puffer und der Größe der Puffer zu spielen - nichts half.

Das Problem ist, ich weiß nicht, wie es weiter zu debuggen - es scheint der Puffer als Eingabe für den Rückruf verzerrt - bevor mein Code aktiviert ist (mit Ausnahme der Audio-Warteschlange Config).

  • Haben Sie Ideen, was könnte das Problem sein?
  • oder wie es weiter zu debuggen?

Queue-Setup-Code:

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); 
} 

Starten Aufnahmefunktion:

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

Code Rückruf:

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

Das gleiche Problem hier ... – Idan

Antwort