C# NAudio 录制声音和显示波形图
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;
using System.IO;
namespace TestAudio
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private IWaveIn waveIn;
private WaveFileWriter writer;
List<float> sampleAggregator = new List<float>();//用来储存波形数据
private void btnStart_Click(object sender, EventArgs e)
{
StartRecording();
} /// <summary>
/// 开始录音
/// </summary>
private void StartRecording()
{
if (waveIn != null) return;
Text = "start recording....";
btnStart.Text = "正在录制....";
btnStart.Enabled = false; waveIn = new WaveIn { WaveFormat = new WaveFormat(8000, 1) };//设置码率
writer = new WaveFileWriter("test.wav", waveIn.WaveFormat);
waveIn.DataAvailable += waveIn_DataAvailable;
waveIn.RecordingStopped += OnRecordingStopped;
waveIn.StartRecording();
} /// <summary>
/// 录音中
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void waveIn_DataAvailable(object sender, WaveInEventArgs e)
{ writer.Write(e.Buffer, 0, e.BytesRecorded);
byte[] buffer = e.Buffer;
int bytesRecorded = e.BytesRecorded; for (int index = 0; index < e.BytesRecorded; index += 2)
{
short sample = (short)((buffer[index + 1] << 8) |
buffer[index + 0]);
float sample32 = sample / 32768f;
sampleAggregator.Add(sample32);
} int secondsRecorded = (int)(writer.Length / writer.WaveFormat.AverageBytesPerSecond);//录音时间获取
if (secondsRecorded >= 3)//只录制6秒
{
waveIn.StopRecording();
Text = "complete";
btnStart.Text = "开始录制";
btnStart.Enabled = true; //------------------------------------开始画波形图。
Text = sampleAggregator.Min() + "," + sampleAggregator.Max();
int baseMidHeight = 50;
float h = 0;
for (int i = 0; i < sampleAggregator.Count; i+=60) {//大概意思意思 60的步长是怕太多了。 h= sampleAggregator[i] * 300;
flowLayoutPanel1.Controls.Add(new Label() { BackColor = Color.Pink, Width = 5, Height = (int)h, Margin = new Padding(0, baseMidHeight-(int)h, 0, 0) }); }
//----------------------------------------------------- } }
/// <summary>
/// 停止录音
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnRecordingStopped(object sender, StoppedEventArgs e)
{ if (waveIn != null) // 关闭录音对象
{
waveIn.Dispose();
waveIn = null;
}
if (writer != null)//关闭文件流
{
writer.Close();
writer = null;
}
if (e.Exception != null)
{
MessageBox.Show(String.Format("出现问题 " + e.Exception.Message));
} } private void Form1_Load(object sender, EventArgs e)
{ } }
}
WPF 例子:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using NAudio.Wave;
using System.Collections.ObjectModel;
using System.ComponentModel;
namespace TestAudioWPF
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{ InitializeComponent();
listView.DataContext = listView.ItemsSource = sampleAggregator; } private IWaveIn waveIn;
private WaveFileWriter writer;
ObservableCollection<WaveInfo> sampleAggregator = new ObservableCollection<WaveInfo> ();//用来储存波形数据 /// <summary>
/// 开始录音
/// </summary>
private void StartRecording()
{
if (waveIn != null) return;
Title = "start recording....";
btnStart.Content = "正在录制....";
btnStart.IsEnabled = false;
sampleAggregator.Clear(); waveIn = new WaveIn { WaveFormat = new WaveFormat(8000, 1) };//设置码率
writer = new WaveFileWriter("test.wav", waveIn.WaveFormat);
waveIn.DataAvailable += waveIn_DataAvailable;
waveIn.RecordingStopped += OnRecordingStopped;
waveIn.StartRecording();
} /// <summary>
/// 录音中
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void waveIn_DataAvailable(object sender, WaveInEventArgs e)
{ writer.Write(e.Buffer, 0, e.BytesRecorded);
byte[] buffer = e.Buffer;
int bytesRecorded = e.BytesRecorded; //------------------------------------开始画波形图。
sampleAggregator.Clear();//可以不清除,就会一直保持历史记录
// short s = BitConverter.ToInt16(e.Buffer, 0);//这样采样比较少,反正是int16型的
// int w= Math.Abs(s / 50);
// sampleAggregator.Add(new WaveInfo() { heigth = w });
for (int index = 0; index < e.BytesRecorded; index += 2)
{
short sample = (short)((buffer[index + 1] << 8) |
buffer[index + 0]);
float sample32 = sample / 32768f;
if (sample32 > 0.03f)
{
sampleAggregator.Add(new WaveInfo() { heigth = sample32*300f });
}
}
//---------------------------------------------------------
int secondsRecorded = (int)(writer.Length / writer.WaveFormat.AverageBytesPerSecond);//录音时间获取
if (secondsRecorded >= 552)//只录制552秒
{
waveIn.StopRecording();
Title = "complete";
btnStart.Content = "开始录制";
btnStart.IsEnabled = true;
}
}
/// <summary>
/// 停止录音
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnRecordingStopped(object sender, StoppedEventArgs e)
{
if (waveIn != null) // 关闭录音对象
{
waveIn.Dispose();
waveIn = null;
}
if (writer != null)//关闭文件流
{
writer.Close();
writer = null;
}
if (e.Exception != null)
{
MessageBox.Show(String.Format("出现问题 " + e.Exception.Message));
}
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void btnStart_Click(object sender, RoutedEventArgs e)
{
StartRecording();
}
}
public class WaveInfo :INotifyPropertyChanged{
public event PropertyChangedEventHandler PropertyChanged;
private float _heigth;
public float heigth
{
get {
return _heigth;
}
set {
if (value != _heigth)
{ _heigth = value;
OnPropertyChanged("heigth");
}
}
}
private string text;
public string Text
{
get { return text; }
set { text = value; OnPropertyChanged("Text"); }
}
protected void OnPropertyChanged(string propertyName = "")
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
}
<Window x:Class="TestAudioWPF.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Button x:Name="btnStart" Click="btnStart_Click" Content="btnStart" HorizontalAlignment="Left" Margin="145,20,0,0" VerticalAlignment="Top" Width="169" Height="37"/>
<ListView BorderThickness="0" Name="listView" DataContext="sampleAggregator" Height="232" VerticalAlignment="Bottom">
<ListView.ItemTemplate>
<DataTemplate>
<Label Margin="0" Padding="0" Background="Pink" Width="2" Height="{Binding heigth}"></Label>
</DataTemplate>
</ListView.ItemTemplate>
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel IsItemsHost="True" ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Disabled" Orientation="Horizontal" />
</ItemsPanelTemplate>
</ListView.ItemsPanel>
</ListView>
<WrapPanel ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Disabled" Orientation="Horizontal" Height="70" VerticalAlignment="Bottom">
<Label Margin="0" Padding="0" Background="Pink" Width="2" Height="22"></Label>
<Label Margin="0" Padding="0" Background="Pink" Width="2" Height="33"></Label>
<Label Margin="0" Padding="0" Background="Pink" Width="2" Height="44"></Label>
</WrapPanel>
</Grid>
</Window>
参考:
https://channel9.msdn.com/coding4fun/articles/AutotuneNET
https://github.com/markheath/voicerecorder
http://www.codesoso.com/code/Curve_RealTime.aspx
C# NAudio 录制声音和显示波形图的更多相关文章
- Android使用的开发MediaRecorder录制声音
至 Android 录制声音的应用,Android提供 MediaRecorder 类别.大约MediaRecorder可以参考一个特定的解释<Android开发之MediaRecorder类具 ...
- Microsoft Web Test Recorder在录制时没有显示
在进行web test录制时,IE启动后,在左侧可能没有显示Microsoft Web Test Recorder,这很有可能是因为IE加载项中,该项被禁止了,按照如下操作可解决此问题: 1. 打开I ...
- 电脑没有声音,显示“未插入耳机或扬声器”,检测不到Realtek高清晰音频管理器
2018-7-16,电脑彻夜未关,早上发现已经死机了.关机重启之后,就发现没有声音了,提示“未插入耳机或扬声器”,并且检测不到Realtek高清晰音频管理器,只能检查到显卡音频输出.首先,音箱在其他电 ...
- Android上使用MP3格式录制声音
0. 下载LAME 并解压缩 http://lame.sourceforge.net/download.php http://sourceforge.net/projects/lame/files/l ...
- NI CWGraph 显示波形图
ptrWaveBox.Axes(1).Maximum = 1000 ptrWaveBox.Axes(2).Maximum = 20 ptrWaveBox.Axes(2).Minimum = 0 Dim ...
- android中使用MediaRecoder录制声音
package com.test.mediarecorder; import java.io.File; import android.media.MediaRecorder; import andr ...
- C# NAudio录音和播放音频文件-实时绘制音频波形图(从音频流数据获取,而非设备获取)
NAudio的录音和播放录音都有对应的类,我在使用Wav格式进行录音和播放录音时使用的类时WaveIn和WaveOut,这两个类是对功能的回调和一些事件触发. 在WaveIn和WaveOut之外还有对 ...
- 使用MediaRecorder录制视频短片
MediaRecorder除了可用于录制音频之外,还可用于录制视频,使用MediaRecorder录制视频与录制音频的步骤基本相同.只是录制视频时不仅需要采集声音,还需要采集图像.为了让MediaRe ...
- Android使用的开发MediaRecorder录制视频
MediaRecorder除了使用录制音频.还可用于录制视频.关于MediaRecorder的具体解释大家能够參考<Android开发之MediaRecorder类具体解释>.使用Medi ...
随机推荐
- 第九篇 float浮动
float浮动 首先老师要声明,浮动这一块,和边距.定位相比,它是比较难的,但是用它,页面排版会更好. 这节课就直接上代码,看着代码去学浮动. 我们先弄一个div,给它一个背景颜色: HTML ...
- 基于Zabbix 3.2.6版本的low-level-discover(lld)
个人使用理解: 1.使用一个返回值是JSON的KEY,在Templates或者Hosts中创建一个Discovery规则.该key的返回值类似于: 索引key -- value 类型 ...
- SSD源码解读——数据读取
之前,对SSD的论文进行了解读,可以回顾之前的博客:https://www.cnblogs.com/dengshunge/p/11665929.html. 为了加深对SSD的理解,因此对SSD的源码进 ...
- centos7.2升级openssh7.9p1
Centos7.2版本yum升级openssh版本最高到7.4,想要升级到更高的版本需要重新编译 一.查看当前openssh版本: [root@localhost ~]# ssh -VOpenSSH_ ...
- CUDA, CUDNN 版本查询
CUDA 查询: cat /usr/local/cuda/version.txt 或者 nvcc -V (也可以看到版本信息) CUDNN 查询 cat /usr/local/cuda/include ...
- [CF#592 E] [二分答案] Minimizing Difference
链接:http://codeforces.com/contest/1244/problem/E 题意: 给定包含$n$个数的数组,你可以执行最多k次操作,使得数组的一个数加1或者减1. 问合理的操作, ...
- 【hdu 6071】Lazy Running
菜鸡永远都在做着变聚的梦. 题意 有 \(4\) 个点连成一个环,连接顺序依次为 \(1-2-3-4-1\).相邻两个点之间有个距离 \(d_{i,i+1}\)(特别地,当 \(i=4\) 时为 \( ...
- Python基于机器学习方法实现的电影推荐系统
推荐算法在互联网行业的应用非常广泛,今日头条.美团点评等都有个性化推荐,推荐算法抽象来讲,是一种对于内容满意度的拟合函数,涉及到用户特征和内容特征,作为模型训练所需维度的两大来源,而点击率,页面停留时 ...
- JAVA笔记4-static关键字
1.static方法中不能使用this关键字 2.例题:static成员变量用于计数
- LVS 学习
参考网站:http://www.linuxvirtualserver.org 一,部分概念 服务器集群系统: 通过高性能网络或局域网互联的服务器集群正成为实现高可伸缩的.高可用网络服务的有效结构,这种 ...