gpt4 book ai didi

c# - NAudio 逐个样本写入文件

转载 作者:行者123 更新时间:2023-12-04 00:45:30 26 4
gpt4 key购买 nike

我正在构建一个应用程序,用于将麦克风的音频记录到一个文件 (.mp3) 中。我希望我的应用程序仅在检测到足够高的振幅时才将数据写入文件。我在尝试保存所选数据时遇到问题。我得到的只是快速失真,甚至与录制的内容相去甚远。

这是我的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using NAudio.Wave;

namespace NAudio_Testing
{
public partial class Form1 : Form
{
int counter = 0;
int passed = 0;
private BufferedWaveProvider bufferedWaveProvider;
WaveIn waveIn;
WaveFileWriter writer;
string output = "C:/Users/klein/AppData/Roaming/Microsoft/Windows/gravacao.mp3";
public Form1()
{
InitializeComponent();
waveIn = new WaveIn();
writer = new WaveFileWriter(output, waveIn.WaveFormat);

waveIn.DataAvailable += new EventHandler<WaveInEventArgs>(new_dataAvailable);

bufferedWaveProvider = new BufferedWaveProvider(waveIn.WaveFormat);
bufferedWaveProvider.DiscardOnBufferOverflow = true;
waveIn.StartRecording();
}

private void Form1_Load(object sender, EventArgs e)
{
timer1.Interval = 1000;
timer1.Start();
}

void new_dataAvailable(object sender, WaveInEventArgs e)
{
for (int i = 0; i < e.BytesRecorded; i+=2)
{
short sample = (short)((e.Buffer[i + 1] << 8) | e.Buffer[i + 0]);
float sample32 = sample / 32768f;
if (sample32 > 0.02) //0.02~0.03
{
writer.WriteSample(sample);
}
}
}

private void button1_Click(object sender, EventArgs e)
{
waveIn.StopRecording();
waveIn.Dispose();
waveIn = null;
writer.Close();
writer = null;
}

private void timer1_Tick(object sender, EventArgs e)
{
textBox1.Text = counter++.ToString();
}

}
}

编辑:如果我删除选择性 if 并且只添加行,我能够成功录制音频,问题当然是我无法根据音频的幅度录制或不录制:

writer.WriteByte(e.Buffer[i + 0]);
writer.WriteByte(e.Buffer[i + 1]);

像这样:

void new_dataAvailable(object sender, WaveInEventArgs e)
{
for (int i = 0; i < e.BytesRecorded; i+=2)
{
short sample = (short)((e.Buffer[i + 1] << 8) | e.Buffer[i + 0]);
float sample32 = sample / 32768f;

writer.WriteByte(e.Buffer[i + 0]);
writer.WriteByte(e.Buffer[i + 1]);

}
}

谢谢。

最佳答案

您的方法实质上是丢弃零交叉点附近的所有样本,无论当时的整体音频是否响亮。它会使信号失真并加速,因为音频信号通常每秒都有很多零交叉。

相反,您需要在短时间内测量所有样本的最大体积(多长时间取决于您,但您可以一次测量 1 秒)。如果在此期间任何样本的声音大于指定的最小值,那么您将记录整个 block 。

您的代码的第二个问题是您实际上并未创建 MP3 文件。 WaveFileWriter 生成 WAV 文件。将您的文件名更改为以 WAV 结尾,然后听听录音的结果。然后,您需要在录制后的第二步转换为 MP3。 (我有一篇关于如何在格式之间转换的文章 here )。

关于c# - NAudio 逐个样本写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14387393/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com