La mia app iOS con unità audio con una frequenza di campionamento di 8000 Hertz restituisce una voce distorta
-
12-12-2019 - |
Domanda
Ho davvero bisogno di aiuto con questo problema.Sto sviluppando un'applicazione iOS con unità audio, l'audio registrato ha bisogno di una frequenza di campionamento a 8 bit / 8000 Hertz utilizzando il formato di anaw.Come mai ottengo una voce distorta che esce dall'altoparlante.
Ho trovato questo esempio online:
http://www.stefanpopp.de/2011/ Capture-iPhone-Microfono / Commento-Pagina-1 /
Durante il tentativo di eseguire il debug della mia app ho usato il mio audioformat nella sua applicazione e sto ottenendo lo stesso suono distorto.Immagino che io abbia una connessione errata o ho bisogno di fare qualcos'altro per abilitare questo di funzionare.Data l'applicazione nel link e il seguente AudioFormat può comunque dirmi se sto facendo qualcosa di sbagliato o manca qualcosa?Non so molto di questa roba, grazie.
Formato audio:
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;
. Soluzione
Alla fine l'ho capito per giocare correttamente. Sto postando qui per aiutare chiunque altro di fronte a problemi simili.
Problema principale che stavo affrontando è che c'è un'enorme differenza tra il simulatore e un dispositivo reale. Esecuzione dell'app sul dispositivo La qualità del suono era migliore ma continuava a saltare ogni secondo o 2, ho trovato un'impostazione che sembrava fissare questo e un'impostazione per cambiare la dimensione del buffer / durata. (L'impostazione della durata non funziona sul simulatore, alcuni dei miei problemi avevano bisogno che funzioni a una determinata tasso da sincronizzare con qualcos'altro, questo stava causando suoni distorti)
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);
.
La prima proprietà della sessione audio è ciò che ha interrotto il salto facendolo giocare molto più agevolmente. Il secondo regola la durata del buffer, questo è in pochi secondi la frequenza con cui vengono licenziate le callback e ti darà una dimensione del buffer diverso. Il suo miglior sforzo significa che si avvicinerà il più vicino possibile al valore che fornisci, ma sembra avere un elenco di dimensioni disponibili e seleziona il più vicino.
Vedi il post I collegamento nella mia domanda per un ottimo tutorial / programma di esempio per iniziare con questa roba.