添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:control="clr-namespace:AudioDemo.Controls"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d" WindowStartupLocation="CenterScreen"
        Title="MainWindow" Height="800" Width="1800">
        <TextBlock Text="{Binding CurrentState}" Width="502" HorizontalAlignment="Center" VerticalAlignment="Center" Height="58" Margin="272,303,1018,408" FontWeight="Bold" FontSize="22"/>
        <Button Content="开始录音" Width="100" Click="StartRecord_Click"  x:Name="startRecord" Margin="125,76,1567,593" FontSize="22"/>
        <Button Content="结束录音" Width="100" Click="EndRecord_Click" x:Name="endRecord" Margin="125,201,1567,462" FontSize="22"/>
        <ProgressBar  Value="{Binding RecordTime}" HorizontalAlignment="Center" VerticalAlignment="Center" Width="300" Height="30" Margin="370,201,1122,538"/>
        <!--<Button Content="播放录音" Width="100"  x:Name="analysis" Margin="744,76,948,590"/>-->
        <Button Height="125" Width="144" x:Name="btnBoFang"  Click="AnalysisRecord_Click"  HorizontalAlignment="Left"  VerticalAlignment="Top" Canvas.Left="1673" Canvas.Top="859" Margin="751,70,0,0" >
            <Button.Background>
                <ImageBrush ImageSource="切图/播放01.png"/>
            </Button.Background>
        </Button>       
        <control:PolylineWaveFormControl x:Name="polylineWaveFormControl" BorderBrush="#FFFBF8F8" BorderThickness="1" Margin="272,70,1070,593" />
    </Grid>
</Window>

后台部分源码:
using NAudio.Wave;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.IO;
using System.Threading.Tasks;
using System.Windows;

namespace WpfApp1
{
///
/// MainWindow.xaml 的交互逻辑
///
public partial class MainWindow : Window, INotifyPropertyChanged
{
NAudioRecorder recorder;
NAudioReader aggregator;
ObservableCollection recordList;
WaveOut waveOutDevice;
int recordTime;
string currentState;
string outputFolder;
object lockList = new object();
bool boolPlay = false;
string strPlayAddress;

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string name)
        if (PropertyChanged != null)
            this.PropertyChanged(this, new PropertyChangedEventArgs(name));
    /// <summary>
    /// 录音时长
    /// </summary>
    public int RecordTime
        get { return recordTime; }
            recordTime = value;
            this.OnPropertyChanged("RecordTime");
    /// <summary>
    /// 录音文件列表
    /// </summary>
    //public ObservableCollection<string> RecordList
    //    get { return recordList; }
    //    set
    //    {
    //        recordList = value;
    //        this.OnPropertyChanged("RecoredList");
    //    }
    /// <summary>
    /// 界面正在执行任务状态
    /// </summary>
    public string CurrentState
        get { return currentState; }
            currentState = value;
            this.OnPropertyChanged("CurrentState");
    public MainWindow()
        InitializeComponent();
        this.DataContext = this;
            this.Closed += MainWindow_Closed;
        waveOutDevice = new WaveOut();
        //RecordList = new ObservableCollection<string>();
        recorder = new NAudioRecorder();
        outputFolder = System.Windows.Forms.Application.StartupPath+ "\\RecoredList\\";
        Directory.CreateDirectory(outputFolder);
        //analysis.IsEnabled = false;
        btnBoFang.IsEnabled = false;
        endRecord.IsEnabled = false;
    private void Recorder_MicrophoneVoiceReceived(object sender, MaxSampleEventArgs f)
        polylineWaveFormControl.AddValue(f.MaxSample);
    /// <summary>
    /// 退出程序时触发,释放相关资源
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void MainWindow_Closed(object sender, EventArgs e)
        if (waveOutDevice != null)
            waveOutDevice.PlaybackStopped -= WaveOutDevice_PlaybackStopped;
            waveOutDevice.Dispose();
        if (recorder != null)
            recorder.StopRec();
        if (aggregator != null)
            aggregator.Stop();
    /// <summary>
    /// 开始录音
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void StartRecord_Click(object sender, RoutedEventArgs e)
        CurrentState = "开始录音";
        var currentFileName = String.Format("NAudioDemo {0:yyy-MM-dd HH-mm-ss}.wav", DateTime.Now);
        var path = Path.Combine(outputFolder, currentFileName);
        recorder.DataAvailable += Recorder_DataAvailable;
        recorder.MaximumCalculated += Recorder_MicrophoneVoiceReceived;
        recorder.SetFileName(path);
        recorder.StartRec();
        lock (lockList)
           // RecordList.Clear();//清空数组
            //RecordList.Add(path);
            strPlayAddress = path;
        endRecord.IsEnabled = true;
        startRecord.IsEnabled = false;
    /// <summary>
    /// 停止录音
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void EndRecord_Click(object sender, RoutedEventArgs e)
        CurrentState = "结束录音";
        recorder.StopRec();
        //analysis.IsEnabled = true;
        btnBoFang.IsEnabled = true;
        startRecord.IsEnabled = true;
        endRecord.IsEnabled = false;
    /// <summary>
    /// 分析本地音频文件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void AnalysisRecord_Click(object sender, RoutedEventArgs e)
        btnBoFang.IsEnabled = false;
        CurrentState = "正在播放录音";
        var inputStream = new AudioFileReader(strPlayAddress); // recordList[0]);
        aggregator = new NAudioReader(inputStream);
        aggregator.MaximumCalculated += Aggregator_MaximumCalculated;
        aggregator.Start();
        waveOutDevice.Init(aggregator);
        waveOutDevice.Volume = 1;
        waveOutDevice.PlaybackStopped += WaveOutDevice_PlaybackStopped;
        waveOutDevice.Play();
    private void Aggregator_MaximumCalculated(object sender, MaxSampleEventArgs e)
        polylineWaveFormControl.AddValue(e.MaxSample);
    /// <summary>
    /// 进度条管理
    /// </summary>
    /// <param name="value"></param>
    private void Recorder_DataAvailable(int value)
        this.RecordTime = value * 10;
        if (value == 10)//倒计时十秒
            recorder.DataAvailable -= Recorder_DataAvailable;
            recorder.MaximumCalculated -= Recorder_MicrophoneVoiceReceived;
            recorder.StopRec();
            recorder = new NAudioRecorder();
            EndRecord_Click(this, new RoutedEventArgs()); //停止录音
            // StartRecord_Click(this, new RoutedEventArgs()); //重新开始录音
    /// <summary>
    /// 音频文件播放结束触发事件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void WaveOutDevice_PlaybackStopped(object sender, StoppedEventArgs e)
        waveOutDevice.PlaybackStopped -= WaveOutDevice_PlaybackStopped;
        //RecordList.RemoveAt(0);
        //if(recordList.Count > 0)
        //    AnalysisRecord_Click(null, null);
        //else
            CurrentState = "分析录音完成";
            aggregator.Stop();
        btnBoFang.IsEnabled = true;

最终效果图
在这里插入图片描述
源码下载
https://download.csdn.net/download/li_shidong/12241607
添加链接描述

后台部分源码:using NAudio.Wave;using System;using System.Collections.Generic;using System.Collections.ObjectModel;using System.ComponentModel;using System.IO;using System.Threading.Tasks;usi...
Naudio是集录音播放的源码库。https://github.com/naudio/NAudio,这是基于.net的框架。 在这链接的源码里有各种.net 框架的例子,对于基于.net wpf/universal 的程序,还提供了波形图绘制。 我从没接触过音频类的技术,有个基于wpf 的项目需要快速提供实时绘制录音的图形。 因为源码库提供的wpf例子是基于文件播放的,其还中包括了比较多参数设置,技术上用了很多反射。很不直观 ,又因为对音频api毫无概念,想快速修改为基于实时录音还是需要费点时间的。
在网上查了好久,后来终于用一位大佬的源码搞了出来,经这位大佬的同意,我把这个demo放上来,以方便以后有同样需求的人能够轻松的解决掉这个问题,不要像我一样这么苦呵呵的。 大佬的代码是winform,我放到了wpf上,代码都是一样的 MainWindow... 捕捉声卡输出: 实现音频可视化, 第一步就是获得音频采样, 这里我们选择使用计算机正在播放音频作为采样源进行处理: NAudio 中, 可以借助 WasapiLoopbackCapture 来进行捕捉: WasapiLoopbackCapture cap = new WasapiLoopbackCapture(); cap.DataAvailable += (sender, e) => // 录制数据可用时触发此事件, 参数中包含音频数据 float[] allSam <Window x:Class="WpfApplication3.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas. SoundPlayer类是.NET Framework 2.0的一部分,它限制有三个: 1仅支持.wav音频文件; 2不支持同时播放多个音频(任何新播放的操作将终止当前正在播放的); 3无法控制声音的音量; 下面展示SoundPlayer播放声音是如何使用的: SoundPlayer player = new SoundPlayer("薛之谦 - 演员.wav"); player. using VoiceRecorder.Core; using System.Windows.Input; using System.Collections.ObjectModel; using VoiceRecorder.Audio; using System.IO; using GalaSoft.MvvmLight.Command; using GalaSoft.MvvmLight; using GalaSoft.MvvmLight.Messaging; using System.Windows; using System.Threading; using GalaSoft.MvvmLight.Threading; private int deviceNumber = 0; // 选择的录音设备下标。多个设备时可设置为用户选择 private WaveIn waveIn; // waveIn操作类 pri...