2012-02-20 8 views
11

Czy istnieje sposób, w języku C# na .NET, do przetwarzania dźwięku "w locie"? Na przykład, jeśli chcę ocenić średnią intensywność dźwięku AT w momencie nagrywania (do tego będę potrzebował ostatnich kilku milisekund).Przetwarzanie dźwięku "w locie" (C#, WP7)

+1

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

+0

oh. Streaming Audio, tak to się nazywa. – nicks

+0

również chciałbym wiedzieć, czy istnieje sposób, aby rzeczywiście PRACOWAĆ z dźwiękiem, mieć dostęp do poszczególnych próbek. czy jest tam API? – nicks

Odpowiedz

17

Inicjacja mikrofonu oraz rejestrowane przetwarzania dźwięków:

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(); 
} 

Amplituda całkowitego sygnału. Można znaleźć średnie nie we wszystkich tablicy bajtów, ale w mniejszych okien, aby uzyskać krzywą Amplituda:

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

inne rzeczy do generowania dźwięków on-the-fly to możliwe pomóc w przyszłości:

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); 
}