мое приложение iOS, использующее аудиоустройства с частотой дискретизации 8000 Гц, возвращает искаженный голос

Мне очень нужна помощь в этом вопросе. Я разрабатываю приложение iOS с аудиоустройствами, записанный звук должен иметь частоту дискретизации 8 бит/8000 Гц с использованием формата alaw. Как всегда я получаю искаженный голос, выходящий из динамика.

Я наткнулся на этот образец в Интернете:

http://www.stefanpopp.de/2011/capture-iphone-microphone/comment-page-1/

при попытке отладить свое приложение я использовал свой audioFormat в своем приложении, и я получаю тот же искаженный звук. Я предполагаю, что у меня либо неправильные настройки, либо мне нужно сделать что-то еще, чтобы это работало. Учитывая приложение в ссылке и аудиоформат ниже, может ли кто-нибудь сказать мне, делаю ли я что-то не так или что-то упускаю? Я мало что знаю об этом, спасибо.

Аудио формат:

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;

person Simon McLoughlin    schedule 27.07.2012    source источник
comment
Какие искажения вы получаете?   -  person hotpaw2    schedule 27.07.2012
comment
из вашего вопроса неясно, где вы используете это AudioStreamBasicDescription. У вас может быть несколько AudioStreamBasicDescriptions, все разные, в типичной настройке AUGraph, которая (например) фильтрует, рисует и записывает на диск. Кроме того, откуда вы взяли эти значения? Это твоя спецификация? Кроме того, вы должны сделать голосовое приложение для роботов.   -  person hooleyhoop    schedule 27.07.2012
comment
-hotpaw2 Искажение в том, что я слышу свой голос, но на заднем плане есть помехи. Кто-то еще описал это так, будто вход и выход используют разные частоты дискретизации. @hooleyhoop Я использую только одно описание, я помещаю его в ссылку. Моя спецификация - 8000 герц с использованием alaw, остальные настройки либо по ссылке, либо путем экспериментов с различными значениями, чтобы увидеть наилучший результат. Я только что прочитал онлайн-источник, в котором утверждается, что я должен использовать 44k linear PCM и конвертировать в то, что хочу. Это необходимо?   -  person Simon McLoughlin    schedule 28.07.2012
comment
Но вы не хотите отправлять ALaw на динамик — это то, что настраивается audioFormat в примере проекта. Если бы вы хотели сохранить аудио в файл - вы бы не изменили это.   -  person hooleyhoop    schedule 29.07.2012
comment
нет, я говорю, что я заменил audioFormat в примере на тот, который я разместил выше, это устанавливает как вход, так и выход на 8000 герц. Я не понимаю, почему теперь это звучит искаженно, поскольку оба настроены на одно и то же.   -  person Simon McLoughlin    schedule 29.07.2012


Ответы (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);

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

См. сообщение, на которое я ссылаюсь в своем вопросе, для очень хорошего учебника / примера программы, чтобы начать работу с этим материалом.

person Simon McLoughlin    schedule 09.08.2012
comment
Я также столкнулся с той же проблемой, но не похоже на вашу проблему. не могли бы вы взглянуть stackoverflow.com/questions/21964477/ - person Titus; 03.04.2014