Я использую 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);
}
Такая же проблема здесь ... – Idan