首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用ASIO和Naudio将音频捕获保存为wav文件?

如何使用ASIO和Naudio将音频捕获保存为wav文件?
EN

Stack Overflow用户
提问于 2015-06-14 06:11:07
回答 1查看 1.1K关注 0票数 0

到目前为止,我写了:

代码语言:javascript
运行
复制
private AsioOut ASIODriver;
private BufferedWaveProvider buffer;

String[] drivernames = AsioOut.GetDriverNames();
ASIODriver = new AsioOut(drivernames[1]);
buffer = new BufferedWaveProvider(new WaveFormat(sampleRate, 16, 2));
ASIODriver.AudioAvailable += new EventHandler<AsioAudioAvailableEventArgs>(ASIODriver_AudioAvailable);
ASIODriver.InitRecordAndPlayback(buffer, 2, sampleRate);
ASIODriver.Play();

private void ASIODriver_AudioAvailable(object sender, AsioAudioAvailableEventArgs e)
{ 
    byte[] buf = new byte[e.SamplesPerBuffer * 4];
    for (int i = 0; i < e.InputBuffers.Length; i++)
    {
        Marshal.Copy(e.InputBuffers[i], buf, 0, e.SamplesPerBuffer * 4);
        Marshal.Copy(buf, 0, e.OutputBuffers[i], e.SamplesPerBuffer * 4);

        if (recorderOn && i == 1)
        {
            recorder.addInputToStream(buf);
        }
    }
}

此部分用于捕捉和回放来自ASIO吉他的声音。到目前为止还没有问题。

代码语言:javascript
运行
复制
public void addInputToStream(byte[] buffer)
{
    byte[] sample = new byte[buffer.Length / 4];
    if (waveWriter == null) waveWriter = new WaveFileWriter(@"C:\Temp\Test0001.wav", new WaveFormat(44100, 16, 1));
    for (int i = 0; i < buffer.Length; i = i + 4)
    {
        sample[i/4] = (byte)Convert.ToSingle(buffer[i] + buffer[i + 1] + buffer[i + 2] + buffer[i + 3]);
    }
    waveWriter.Write(sample, 0, sample.Length);
}

问题出现在方法addInputToStream中,声音很好地放在.wav文件中,但我在文件中有很多“音频寄生虫”。非常烦人。当我调用该方法时,我试图更改i变量,以不使用Convert.ToSingle而是相同的结果。

我怀疑waveWriterWaveFormat有问题,但我不知道我错过了什么。你们谁有线索?

EN

回答 1

Stack Overflow用户

发布于 2015-11-20 23:23:22

您需要创建一个WaveFileWriter并将示例写出来。这很简单,但我也花了一段时间才弄明白。(注意:我没有设置waveprovider,但您已经有了该部分)。

代码语言:javascript
运行
复制
 class AsioSample
{
    private NAudio.Wave.AsioOut _audioDevice;
    public WaveFileWriter AsioWaveFileWriter;
    public AsioSample()
    {
        //this is set for one channel
        AsioWaveFileWriter = new WaveFileWriter("sample.wav", new WaveFormat(48000, 1));
        _audioDevice = new NAudio.Wave.AsioOut(2);//or whatever
        _audioDevice.InitRecordAndPlayback(_waveProvider, 1, 48000);
        _audioDevice.AudioAvailable += new EventHandler<NAudio.Wave.AsioAudioAvailableEventArgs>(OnAudioAvailable);
        _audioDevice.Play();
    }

    private unsafe void OnAudioAvailable(object sender, NAudio.Wave.AsioAudioAvailableEventArgs e)
    {
        var floatsamples = new float[e.SamplesPerBuffer * e.InputBuffers.Length];
        e.GetAsInterleavedSamples(floatsamples);
        AsioWaveFileWriter.WriteSamples(floatsamples, 0, floatsamples.Length);
        AsioWaveFileWriter.Flush();
    }

} 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30824071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档