【问题标题】:Processing audio "on-fly" (C#, WP7)“即时”处理音频(C#,WP7)
【发布时间】:2012-03-10 18:53:40
【问题描述】:

有没有办法在 C# 中,在 .NET 中“即时”处理音频?例如,如果我想在录制时评估音频的平均强度(为此,我需要最后几毫秒)。

【问题讨论】:

标签: c# .net windows-phone-7 audio


【解决方案1】:

麦克风的初始化和录制的声音处理:

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

整体信号的幅度。您可以在不是所有字节数组中找到平均值,而是在较小的窗口中找到幅度曲线:

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

其他可以即时生成声音的东西,将来可能会对您有所帮助:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-09
    • 2015-09-03
    • 1970-01-01
    • 2011-02-11
    • 2015-07-18
    • 2017-08-02
    • 1970-01-01
    相关资源
    最近更新 更多