Мое приложение iOS с использованием аудиоустройств с частотой дискретизации 8000 герц Возвращает искаженный голос
-
12-12-2019 - |
Вопрос
Мне действительно нужна помощь в этом вопросе.Я разрабатываю приложение IOS с аудиоустройствами, записанный аудио нужен на частоте дискретизации 8bit / 8000 Hertz с использованием формата ALAW.Как когда-нибудь я получаю искаженный голос, выходящий из динамика.
Я наткнулся на этот образец онлайн:
http://www.stefanpopp.de/2011/ Capture-iPhone-Microphone / Comment-Page-1 /
AudioStreamBasicDescription audioFormat;
audioFormat.mSampleRate = 8000;
audioFormat.mFormatID = kAudioFormatALaw;
audioFormat.mFormatFlags = kAudioFormatFlagIsPacked | kAudioFormatFlagIsSignedInteger;
audioFormat.mFramesPerPacket = 1;
audioFormat.mChannelsPerFrame = 1;
audioFormat.mBitsPerChannel = 8;
audioFormat.mBytesPerPacket = 1;
audioFormat.mBytesPerFrame = 1;
. Решение
в конце концов получил его правильно. Я выложу здесь, чтобы помочь кому-либо еще, стоящую перед похожими вопросами.
Основная проблема, которую я сталкивался с тем, что существует огромная разница между симулятором и фактическим устройством. Запуск приложения на устройстве качество звука было лучше, но он продолжал пропустить каждую секунду или 2, я обнаружил настройку, которая, казалось, исправила это и настройку для изменения размера / длительности буфера. (Установка продолжительности не работает над симулятором, некоторые из моих проблем нуждаются в его, чтобы запустить определенную скорость синхронизации с чем-то другим, это вызывало искаженные звуки)
status = AudioSessionInitialize(NULL, kCFRunLoopDefaultMode, NULL, audioUnit);
UInt32 audioCategory = kAudioSessionCategory_PlayAndRecord;
status = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(audioCategory), &audioCategory);
[self hasError:status:__FILE__:__LINE__];
Float32 preferredBufferSize = 0.005805; // in seconds
status = AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, sizeof(preferredBufferSize), &preferredBufferSize);
[self hasError:status:__FILE__:__LINE__];
status = AudioSessionSetActive(true);
.
Первая собственность аудиосессии - это то, что остановило пропуск, заставляя его играть гораздо более плавно. Второе регулирует продолжительность буфера, это в считанные секунды, как часто обратные вызовы уволены и дадут вам другой размер буфера. Его наилучшие усилия, означающие, что он будет настолько близок, так как это может понадобиться, но, похоже, есть список доступных размеров и выбирает ближайший.
См. Почта, которую я ссылаюсь на мой вопрос для очень хорошего учебного пособия / образца программы, чтобы начать работу с этим.