2012-02-20 32 views
11

Có cách nào, trong C#, trên .NET, để xử lý âm thanh "on-fly" không? Ví dụ, nếu tôi muốn đánh giá cường độ trung bình của âm thanh tại thời điểm ghi âm (cho rằng, tôi sẽ cần phải có vài mili giây cuối cùng).Xử lý âm thanh "on-fly" (C#, WP7)

+1

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

+0

oh. Streaming Audio, đó là những gì nó được gọi. – nicks

+0

cũng có, tôi muốn biết, nếu có một cách để thực sự LÀM VIỆC với âm thanh, có quyền truy cập vào các mẫu riêng lẻ. có API cho điều đó không? – nicks

Trả lời

17

khởi của một micro, và xử lý âm thanh ghi:

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

Biên độ của tín hiệu tổng thể. Bạn có thể tìm thấy trung bình không phải trong mọi mảng byte, nhưng trong cửa sổ nhỏ để có được đường cong biên độ:

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

thứ khác để tạo ra âm thanh on-the-fly mà có thể giúp đỡ bạn trong tương lai:

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); 
} 
Các vấn đề liên quan