2010-01-21 10 views
7

Estoy buscando desarrollar una aplicación de iPhone que potencialmente implique un análisis "simple" de audio que está recibiendo desde el micrófono estándar del teléfono. Específicamente, estoy interesado en los altibajos de las imágenes de los micrófonos, y realmente todo lo que está en medio es irrelevante para mí.

¿Hay una aplicación que hace esto ya (solo para que yo pueda ver de lo que es capaz)? ¿Y dónde debería buscar comenzar con dicho código?

Gracias por su ayuda.Análisis de audio de iPhone

+0

fantástico, gracias a todos por sus respuestas. Todavía no llegué a bombardear la aplicación, así que me temo que no tengo idea de quién es la respuesta correcta hasta que lo haga. –

Respuesta

9

Mire en el Audio Queue framework. Esto es lo que utilizo para obtener una alta marca de agua:

AudioQueueRef audioQueue; // Imagine this is correctly set up 
UInt32 dataSize = sizeof(AudioQueueLevelMeterState) * recordFormat.mChannelsPerFrame; 
AudioQueueLevelMeterState *levels = (AudioQueueLevelMeterState*)malloc(dataSize); 

float channelAvg = 0; 

OSStatus rc = AudioQueueGetProperty(audioQueue, kAudioQueueProperty_CurrentLevelMeter, levels, &dataSize); 
if (rc) { 
    NSLog(@"AudioQueueGetProperty(CurrentLevelMeter) returned %@", rc); 
} else {  
    for (int i = 0; i < recordFormat.mChannelsPerFrame; i++) { 
     channelAvg += levels[i].mPeakPower; 
    } 
} 
free(levels); 

// This works because one channel always has an mAveragePower of 0. 
return channelAvg; 

, usted puede obtener la potencia pico, ya sea en dB Escala gratuito (con kAudioQueueProperty_CurrentLevelMeterDB) o simplemente como un flotador en el intervalo [0.0, 1.0] (con kAudioQueueProperty_CurrentLevelMeter) .

+0

Brillante respuesta y ese código de muestra es realmente útil. –

2

Compruebe el código de muestra 'SpeakHere'. le mostrará cómo grabar audio utilizando la API de AudioQueue. También contiene algún código para analizar el audio en tiempo real para mostrar un medidor de nivel.

En realidad, es posible que pueda utilizar la mayor parte de ese código de medidor de nivel para responder a 'altos' y 'bajos'.

3

No se olvide de activar la medición de nivel por primera AudioQueue:

UInt32 d = 1; 
OSStatus status = AudioQueueSetProperty(mQueue, kAudioQueueProperty_EnableLevelMetering, &d, sizeof(UInt32)); 
Cuestiones relacionadas