2012-01-13 7 views
5

Si abro un archivo de audio con los servicios de archivos de audio extendidos, utilizando el formato de datos de cliente siguiente ...¿Cómo leo samples de una AudioBufferList?

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; 

y configurar un AudioBufferList como tal ....

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) 

¿Cómo, entonces , ¿los datos están organizados en mData? Si iterar a través de los datos así como

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

entonces ¿qué es somePieceOfAudioData.

¿Es una muestra o un marco (canales izquierdo y derecho)? Si se trata de una muestra, ¿para qué canal es una muestra? Si, por ejemplo, es una muestra del canal derecho, ¿el búfer [i + 1] será una muestra para el canal izquierdo?

¿Alguna idea, enlaces? ¡Gracias! Se espera

+0

"La memoria intermedia puede representar dos tipos diferentes de audio monofónico ... Un canal de noninterleaved única,, de sonido [o] intercalado de audio con cualquier cantidad de canales, según lo designado por el campo mNumberChannels ". La pregunta ahora, supongo, es ¿cómo sé cuál es cuál, y debería estar usando más de un buffer de audio? p.ej. bufferList.mNumberBuffers = audioFormat.mChannelsPerFrame –

Respuesta

9

datos de audio sean intercalados a menos que el kAudioFormatFlagIsNonInterleaved se establece. Descubrí que para las preguntas de Core Audio, la mejor fuente de documentación suele ser los encabezados. CoreAudioTypes.h contiene el siguiente comentario:

Típicamente, cuando se utiliza un ASBD, los campos describen el diseño completo de los datos de ejemplo en las memorias intermedias que están representados por esta descripción - donde típicamente esos tampones están representados por un AudioBuffer que está contenido en una AudioBufferList.

Sin embargo, cuando un ASBD tiene la bandera kAudioFormatFlagIsNonInterleaved, la AudioBufferList tiene una estructura diferente y semántica. En este caso , los campos ASBD describirán el formato de una de las AudioBuffers que están contenidas en la lista, y cada AudioBuffer en la lista se determina que tiene un único (mono) de canal de datos de audio. Entonces, mChannelsPerFrame del ASBD indicará el número total de AudioBuffers que están contenidos dentro de la AudioBufferList - donde cada tampón contiene un canal. Esto se usa principalmente con la representación AudioUnit (y AudioConverter) de esta lista, y no se encontrará en el uso de AudioHardware de esta estructura.

En su caso particular, la memoria intermedia consistirá en cortos intercalados comenzando por el canal izquierdo.

+0

Gracias, y sí, los archivos de encabezado han sido de gran ayuda. ¡Incluso encontré algunas unidades de audio no documentadas que están disponibles nuevamente para iOS! –

1

Sí, estás leyendo un marco y es dos muestras de 16 bits, izquierda y derecha. (En realidad, no estoy seguro de que es Izquierda y Derecha que es. Hmmm.)

Además de los archivos de cabecera, las referencias de clases integradas en Xcode son útiles. Me parece que estoy usando "opción-clic" y "comando-clic" en mi código cuando estoy solucionando este tipo de detalles. (para los nuevos en Xcode ... estos clics le brindan la información y los documentos, y la ubicación de salto a origen, respectivamente.)

El próximo libro "Aprendizaje de audio básico: una guía práctica para la programación de audio para Mac y iOS "de Kevin Avila y Chris Adamson hace un buen trabajo explicando cómo funciona todo esto.Está disponible en forma de "Rough Cut" ahora en Safari Books Online:

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

+0

¡Gracias! Voy a en segundo lugar todo eso. Ya leí ese libro y es bastante útil. Los archivos de encabezado también fueron útiles, pero muchas veces no es obvio dónde mirar. Por ejemplo, en esta situación, busco AudioStreamBasicDescription, AudioBuffer o ExtAudioFileRead. Finalmente encontré mi respuesta. –

Cuestiones relacionadas