La mia app iOS con unità audio con una frequenza di campionamento di 8000 Hertz restituisce una voce distorta

StackOverflow https://stackoverflow.com//questions/11690395

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;
.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top