2012-02-20 20 views
11

¿Hay alguna manera, en un C#, en .NET, para procesar el audio "en marcha"? Por ejemplo, si quiero evaluar la intensidad promedio del audio AT en el momento de la grabación (para eso, necesitaré tener un par de milisegundos).Procesamiento de audio "en marcha" (C#, WP7)

+1

http : //msdn.microsoft.com/en-us/library/dd231917.aspx http://www.un4seen.com/ – vulkanino

+0

oh. Streaming Audio, así se llama. – nicks

+0

también, me gustaría saber, si hay una forma de REALMENTE TRABAJAR con audio, tener acceso a muestras individuales. ¿hay una API para eso? – nicks

Respuesta

17

inicialización de un micrófono, y grabado de procesamiento de sonidos:

private void Initialize() 
{ 
    Microphone microphone = Microphone.Default; 
    // 100 ms is a minimum buffer duration 
    microphone.BufferDuration = TimeSpan.FromMilliseconds(100); 

    DispatcherTimer updateTimer = new DispatcherTimer() 
    { 
     Interval = TimeSpan.FromMilliseconds(0.1) 
    }; 
    updateTimer.Tick += (s, e) => 
    { 
     FrameworkDispatcher.Update(); 
    }; 
    updateTimer.Start(); 

    byte[] microphoneSignal = new byte[microphone.GetSampleSizeInBytes(microphone.BufferDuration)]; 
    microphone.BufferReady += (s, e) => 
    { 
     int microphoneDataSize = microphone.GetData(microphoneSignal); 
     double amplitude = GetSignalAmplitude(microphoneSignal); 
     // do your stuff with amplitude here 
    }; 
    microphone.Start(); 
} 

amplitud de la señal global. Puede encontrar las medias no en todo el conjunto de bytes, pero en ventanas más pequeñas para obtener la curva de amplitud:

private double GetSignalAmplitude(byte[] signal) 
{ 
    int BytesInSample = 2; 

    int signalSize = signal.Length/BytesInSample; 

    double Sum = 0.0; 

    for (int i = 0; i < signalSize; i++) 
    { 
     int sample = Math.Abs(BitConverter.ToInt16(signal, i * BytesInSample)); 
     Sum += sample; 
    }    

    double amplitude = Sum/signalSize; 

    return amplitude; 
} 

Otras cosas para generar sonidos en la marcha que es posible que ayuda en el futuro:

DynamicSoundEffectInstance generatedSound = new DynamicSoundEffectInstance(SampleRate, AudioChannels.Mono); 
generatedSound.SubmitBuffer(buffer); 

private void Int16ToTwoBytes(byte[] output, Int16 value, int offset) 
{ 
    output[offset + 1] = (byte)(value >> 8); 
    output[offset] = (byte)(value & 0x00FF); 
}