2013-10-08 3 views
6

Я использую AudioQueue в iOS для реализации потоковой передачи в Интернете.Искаженная (роботизированная) запись звука на iOS с использованием AudioQueue

Проблема в том, что она обычно работает довольно хорошо, но иногда (~ 20% от моих попыток) звук ужасно искажен - он звучит роботизирован.

Edit: Я могу воспроизвести это довольно легко на iOS6 и ios6.1 тренажере - но я не был в состоянии воспроизвести его на реальном телефоне (ios6.1.3).

Попытка отладки. Я сохраняю данные PCM в файл. Такое же искажение появляется в файле PCM, поэтому это не является проблемой в коде кодирования или загрузки. Я также пытался играть с количеством буферов и размером буферов - ничего не помогло.

Проблема в том, что я не знаю, как отлаживать ее дальше - кажется, что буфер искажен как вход для обратного вызова - до того, как мой код активирован (за исключением конфигурации очереди аудио).

  • У вас есть идеи, в чем проблема?
  • или как отладить его дальше?

Queue код установки:

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

ответ

0

у нас была такая же проблема в SoundJS веб-аудио на iOS всякий раз, когда присутствовал элемент видео и кеш был пуст. После кэширования проблема исчезла. Мы не смогли найти решение или проблему вокруг проблемы.

Вы можете прочитать подробности на форуме нашего сообщества:

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

Надежда, что помогает.

 Смежные вопросы

  • Нет связанных вопросов^_^