2013-10-08 49 views
6

Web'de kayıt akışını uygulamak için iOS'ta AudioQueue kullanıyorum. o robotik sesler - AudioQueue kullanarak iOS'ta bozuk (robotik) ses kaydı

sorun

o genellikle eser oldukça iyi, ama bazen (~ benim girişimleri% 20) ses korkunç bozuk olmasıdır.

Düzenleme: Ben iOS6 ve ios6.1 simülatörde bunu kolaylıkla çoğalabilen değilim - ama gerçek bir telefonda çoğaltmak mümkün değildi (ios6.1.3).

Hata ayıklamayı denemek PCM verilerini bir dosyaya kaydediyorum. Aynı bozulma PCM dosyasında görünür, bu yüzden kodlama veya yükleme kodunda bir sorun olmaz. Ayrıca tamponların sayısı ve tamponların boyutuyla oynamaya çalıştım - hiçbir şey yardımcı olmadı.

Sorun, daha fazla hata ayıklamanın nasıl yapılacağını bilmem - arabellek etkinleştirilmeden önce - arabellek geri çağrıya girdi olarak görünüyor - kodum etkin olmadan önce (ses kuyruğu yapılandırması hariç).

  • Problemin ne olabileceğini biliyor musunuz?
  • veya daha fazla hata ayıklama nasıl yapılır?

Kuyruk kurulum kodu:

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

Başlangıç ​​kayıt fonksiyonu:

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

Geri arama kodu:

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

Aynı sorun burada ... – Idan

cevap