下面是“C#实现电脑麦克风录音”的完整攻略:
准备工作:
- C#编程环境,可以使用Visual Studio或者JetBrains Rider等开发工具。
- NAudio库,它是一个开源的音频处理库,可以在NuGet中进行安装。
实现步骤:
步骤1:初始化录音设备
我们需要调用System.Windows.Forms的API来检查电脑中可用的录音设备,然后选择合适的录音设备进行初始化。下面是代码示例:
using NAudio.Wave;
var waveInDevices = WaveIn.DeviceCount;
for (var i = 0; i < waveInDevices; i++)
{
var deviceInfo = WaveIn.GetCapabilities(i);
Console.WriteLine($"{i}: {deviceInfo.ProductName}");
}
输出的结果将会是这样的:
0: 麦克风 (Realtek High Definition Audio)
1: 麦克 (Steam Streaming Microphone)
这里我们选择使用第一个设备(即 Realtek High Definition Audio 麦克风)进行录音。
步骤2:开始录音
当我们初始化好录音设备之后,就可以开启录音了。我们可以通过调用WaveIn
的StartRecording()
方法来启动录音。下面是代码示例:
var waveIn = new WaveInEvent
{
DeviceNumber = 0,
WaveFormat = new WaveFormat(44100, WaveIn.GetCapabilities(0).Channels)
};
waveIn.DataAvailable += waveIn_DataAvailable;
waveIn.StartRecording();
在这段代码中,我们使用WaveInEvent
类来启动录音,DeviceNumber = 0
表示选择第一个设备进行录音,WaveFormat
则表示录音的采样率和频道数。
同时,我们需要为录音准备一个数据缓冲区,并将录音时的数据存储到这个缓冲区中。因此,我们需要为waveIn
对象添加一个DataAvailable
事件的监听器:
private static readonly List<byte> _recordedRawData = new List<byte>();
private static void waveIn_DataAvailable(object sender, WaveInEventArgs e)
{
_recordedRawData.AddRange(e.Buffer.Take(e.BytesRecorded));
}
在该函数中,我们使用一个名为_recordedRawData
的静态变量来存储录音得到的原始数据。
步骤3:结束录音并生成音频文件
当我们需要结束录音后,我们可以调用waveIn
的StopRecording()
方法,停止录音。然后我们需要将得到的原始数据进行处理,生成一个WAV格式的音频文件。下面是代码示例:
waveIn.StopRecording();
var audioData = _recordedRawData.ToArray();
using (var waveWriter = new WaveFileWriter("output.wav", waveIn.WaveFormat))
{
waveWriter.Write(audioData, 0, audioData.Length);
}
在这段代码中,我们使用WaveFileWriter
来生成WAV格式的音频文件,并将原始数据写入到文件中。
示例1: 录制5秒钟的音频文件
在这个例子中,我们将录制5秒钟的音频文件。
using NAudio.Wave;
static void Main(string[] args)
{
Console.WriteLine("Press any key to start recording ...");
Console.ReadKey();
using (var waveIn = new WaveInEvent
{
DeviceNumber = 0,
WaveFormat = new WaveFormat(44100, WaveIn.GetCapabilities(0).Channels)
})
{
var recordedData = new List<byte>();
waveIn.DataAvailable += (sender, e) => recordedData.AddRange(e.Buffer.Take(e.BytesRecorded));
waveIn.StartRecording();
Task.Delay(5000).Wait();
waveIn.StopRecording();
var audioData = recordedData.ToArray();
using (var waveWriter = new WaveFileWriter("output.wav", waveIn.WaveFormat))
{
waveWriter.Write(audioData, 0, audioData.Length);
}
}
Console.WriteLine("Recording is complete! Press any key to exit ...");
Console.ReadKey();
}
示例2: 实时输出声波
在这个例子中,我们将用一个控制台应用程序来实现实时输出麦克风的声波。
using NAudio.Wave;
static void Main(string[] args)
{
const int sampleRate = 44100;
const int channelCount = 1;
using (var stream = new WaveInEvent
{
DeviceNumber = 0,
WaveFormat = new WaveFormat(sampleRate, channelCount)
}.ToSampleProvider())
{
var soundOut = new WasapiOut();
soundOut.Init(() => stream);
soundOut.Play();
var soundPlot = new SoundPlot();
soundPlot.Play(stream);
}
Console.ReadLine();
}
class SoundPlot
{
public void Play(ISampleProvider source)
{
const int width = 100;
const int height = 25;
var soundData = new float[width];
var watch = Stopwatch.StartNew();
source.Read(soundData, 0, width);
while (true)
{
for (var i = 0; i < soundData.Length - 1; i++)
{
soundData[i] = soundData[i + 1];
}
source.Read(soundData, soundData.Length - 1, 1);
Console.Clear();
for (var y = 0; y < height; y++)
{
var amplitude = (float)y / height * 2.0f - 1.0f;
for (var x = 0; x < soundData.Length; x++)
{
var xMin = (float)x / soundData.Length;
var xMax = (float)(x + 1) / soundData.Length;
if (soundData[x] >= amplitude)
{
Console.BackgroundColor = ConsoleColor.DarkRed;
}
else
{
Console.BackgroundColor = ConsoleColor.Black;
}
Console.Write(" ");
}
Console.BackgroundColor = ConsoleColor.Black;
Console.WriteLine();
}
Thread.Sleep(10);
}
}
}
这段代码中,我们用WaveInEvent
来初始化录音设备,并将其转换成ISampleProvider
接口类型。ISampleProvider
代表一系列音频数据,可以被使用Read()
方法进行读取。
然后我们使用SoundPlot
类来输出实时的音频数据。在SoundPlot
类中,我们先读取一段音频数据,并存储到一个名为soundData
的数组中。
var soundData = new float[width];
source.Read(soundData, 0, width);
然后,在一个大循环中,我们首先将soundData
中的所有数据向左移动一个位置,再从接口中读取最后一个新数据,并将其插入到soundData
数组的最后一个位置。
for (var i = 0; i < soundData.Length - 1; i++)
{
soundData[i] = soundData[i + 1];
}
source.Read(soundData, soundData.Length - 1, 1);
接下来,我们用Console
类来输出声波图形。在Console
的输出中,我们可以使用颜色区分不同的音量级。
if (soundData[x] >= amplitude)
{
Console.BackgroundColor = ConsoleColor.DarkRed;
}
else
{
Console.BackgroundColor = ConsoleColor.Black;
}
Console.Write(" ");
最后,循环执行并持续输出声波图形。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#实现电脑麦克风录音 - Python技术站