2012-01-13 18 views
5

Se apro un file audio con i servizi di file audio estesi, utilizzando il seguente formato di dati cliente ...Come posso leggere i campioni da una lista AudioBuffer?

AudioStreamBasicDescription audioFormat; 
memset(&audioFormat, 0, sizeof(audioFormat)); 
audioFormat.mSampleRate = 44100.0; 
audioFormat.mFormatID = kAudioFormatLinearPCM; 
audioFormat.mFormatFlags = kAudioFormatFlagIsBigEndian | 
          kAudioFormatFlagIsSignedInteger | 
          kAudioFormatFlagIsPacked; 
audioFormat.mBytesPerPacket = 4; 
audioFormat.mFramesPerPacket = 1; 
audioFormat.mChannelsPerFrame = 2; 
audioFormat.mBytesPerFrame = 4; 
audioFormat.mBitsPerChannel = 16; 

e configurare un AudioBufferList in questo modo ....

AudioBufferList bufferList; 
bufferList.mNumberBuffers = 1; 
bufferList.mBuffers[0].mDataByteSize = bufferSize; 
bufferList.mBuffers[0].mNumberChannels = audioFormat.mChannelsPerFrame; 
bufferList.mBuffers[0].mData = buffer; //malloc(sizeof(UInt8) * 1024 * audioFormat.mBytesPerPacket) 

Come, allora , i dati sono disposti in mData? Se io scorrere i dati in questo modo

for (int i = 0; i < frameCount; i++) { 
     UInt8 somePieceOfAudioData = buffer[i]; 
} 

allora che cosa è somePieceOfAudioData.

È un campione o un frame (canali sinistro e destro insieme)? Se è un campione, per quale canale è un campione? Se per esempio è un campione dal canale destro, buffer [i + 1] sarà un campione per il canale sinistro?

Qualche idea, link? Grazie!

+0

"Il buffer può rappresentare due diversi tipi di audio ... Un singolo, monofonico, canale noninterleaved audio [o] Interleaved audio con qualsiasi numero di canali, come indicato dal campo mNumberChannels ". La domanda ora, immagino, è come faccio a sapere qual è, e dovrei usare più di un buffer audio? per esempio. bufferList.mNumberBuffers = audioFormat.mChannelsPerFrame –

risposta

9

I dati audio sono intercalati a meno che non sia impostato kAudioFormatFlagIsNonInterleaved. Ho trovato che per le domande di Core Audio la migliore fonte di documentazione sono solitamente le intestazioni. CoreAudioTypes.h contiene il seguente commento:

Tipicamente, quando si utilizza un ASBD, i campi descrivono il layout completo dei dati campione nel buffer che sono rappresentati da questa descrizione - dove tipicamente tali buffer sono rappresentati da un AudioBuffer contenuto in una Lista AudioBuffer.

Tuttavia, quando un ASBD ha il flag kAudioFormatFlagIsNonInterleaved, , l'Elenco AudioBuffer ha una struttura diversa e semantica. In questo caso , i campi ASBD descriveranno il formato di UNO dei AudioBuffer contenuti nell'elenco, E ogni AudioBuffer in l'elenco è determinato per avere un singolo (mono) canale di dati audio. Quindi, mChannelsPerFrame di ASBD indicherà il numero totale di AudioBuffer contenuti in AudioBufferList - dove ogni buffer contiene un canale. Viene utilizzato principalmente con la rappresentazione di AudioUnit (e AudioConverter) di questo elenco e non verrà trovato nell'utilizzo di questa struttura da parte di AudioHardware.

Nel vostro caso particolare, il buffer sarà costituito da cortocircuiti interfogliati che iniziano con il canale sinistro.

+0

Grazie, e sì, i file header sono stati molto utili. Ho persino trovato alcune unità audio non documentate che sono appena disponibili per iOS! –

1

Sì, stai leggendo un frame e sono due campioni a 16 bit, Left e Right. (In realtà, non sono sicuro quale sia Left e quale sia Right. Hmmm.)

Oltre ai file di intestazione, i riferimenti di classe incorporati in Xcode sono utili. Trovo che sto usando "option-click" e "command-click" nel mio codice molto quando sto riordinando questo tipo di dettagli. (per chi è nuovo a Xcode .. questi clic ti forniscono le informazioni e i documenti, e la posizione Jump-to-source, rispettivamente.)

Il libro in uscita "Learning Core Audio: una guida pratica alla programmazione audio per Mac e iOS "di Kevin Avila e Chris Adamson fa un buon lavoro di spiegare come funziona tutto questo.E 'disponibile in forma di "Rough Cut", ora al Safari Books Online:

http://my.safaribooksonline.com/book/audio/9780321636973

+0

Grazie! Assumerò tutto questo. Ho già letto quel libro ed è molto utile! Anche i file di intestazione erano utili, ma spesso non è chiaro dove cercare. Per esempio in questa situazione cerco AudioStreamBasicDescription, AudioBuffer o ExtAudioFileRead. Alla fine ho trovato la mia risposta. –

Problemi correlati