//by wgscd
//date:2022/11/7

UI:

 <Path Stroke="Red" Data="{Binding path}" RenderTransformOrigin="0.5,0.5">
<Path.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform Angle="180"/>
<TranslateTransform/>
</TransformGroup>
</Path.RenderTransform> </Path>

  

Code:

using NAudio.CoreAudioApi;
using NAudio.Wave.SampleProviders;
using NAudio.Wave;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using NAudio.Wave.Compression;
using System.Runtime.Remoting.Channels;
using System.ComponentModel;
using System.Collections.ObjectModel;
using HandyControl.Collections;
using System.Threading;
using System.Windows.Threading;
using System.Windows.Media;
using System.Windows.Shapes;
using System.Windows;
using System.CodeDom; namespace DouyuDanmu
{
//by wgscd
//date:2022/11/7
public class NAudioHelper
{ public static SampleData pathData = new SampleData();
public static void GetSampleData() {
// Redefine the capturer instance with a new instance of the LoopbackCapture class
WasapiLoopbackCapture _waveIn = new WasapiLoopbackCapture();
_waveIn.WaveFormat = new WaveFormat(16000, 16, 2); // Redefine the audio writer instance with the given configuration
//WaveFileWriter RecordedAudioWriter = new WaveFileWriter(outputFilePath, CaptureInstance.WaveFormat);
// When the capturer receives audio, start writing the buffer into the mentioned file
_waveIn.DataAvailable += (s, a) =>
{
// Write buffer into the file of the writer instance
AnalyzeVoice(a.Buffer); }; _waveIn.StartRecording(); } private static void SampleChannel_PreVolumeMeter(object sender, StreamVolumeEventArgs e)
{
Debug.Print(""+ e.MaxSampleValues[0]); } private static void waveIn_DataAvailable(object sender, NAudio.Wave.WaveInEventArgs e)
{
AnalyzeVoice(e.Buffer);
} static bool isbusy = false ;
/// <summary>
/// 语音分析
/// </summary>
/// <param name="buf"></param>
private async static void AnalyzeVoice(byte[] buffer)
{
if (isbusy) { return; } isbusy = true;
await Task.Delay(10); float[] sts = new float[buffer.Length / 2];
int outIndex = 0;
for (int n = 0; n < buffer.Length; n += 2)
{
sts[outIndex++] = BitConverter.ToInt16(buffer, n) / 32768f;
}
int channels = 20;//值越大提取的越稀疏
float value = 0;
List<Point> listPoint = new List<Point>(); float p=0;
float x = 0;
for (int n = 0; n < sts.Length; n += channels)
{ value = sts[n] > 0.0f ? sts[n] *400: 1f;//sts[n] * 400 是为了转化成有用的高度值
Debug.Print(""+value );//这个就是大概的波形图
p = value;
x += 2;
listPoint.Add(new Point(x,p));
}
UpdatePath(listPoint);//listPoint 更新一个类似贝塞尔曲线的效果
isbusy = false ;
} private static void UpdatePath(List<Point> points)
{ StringBuilder data = new StringBuilder("M");
data.AppendFormat("{0},{1} C", points[0].X, points[0].Y); for (int i = 1; i < points.Count; i++)
{
Point pre = new Point((points[i - 1].X + points[i].X) / 2, points[i - 1].Y); //控制点
Point next = new Point((points[i - 1].X + points[i].X) / 2, points[i].Y); //控制点
data.AppendFormat(" {0},{1} {2},{3} {4},{5}", pre.X, pre.Y, next.X, next.Y, points[i].X, points[i].Y);
}
// pathData.path = new Path { Stroke = Brushes.DodgerBlue, StrokeThickness = 1, Data = Geometry.Parse(data.ToString()) };
pathData.path = Geometry.Parse(data.ToString()); } } public class SampleData : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
void NotifyPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
float _value = 0;
public float value
{
get
{ return _value;
}
set
{
_value = value;
NotifyPropertyChanged(nameof(value));
}
} Geometry _path ;
public Geometry path
{
get
{ return _path;
}
set
{
_path = value;
NotifyPropertyChanged(nameof(path));
}
} } }

  

C# 获取系统声卡音频数据,并绘制波形的更多相关文章

  1. Android 获取系统的联系人

    本文主要介绍android中怎样获取系统的联系人数据 首先打开模拟器 点击联系人图标按钮 说明系统联系人数据库是空的,打开File explorer,找到data/data下面的文件夹: 将conta ...

  2. C# NAudio录音和播放音频文件-实时绘制音频波形图(从音频流数据获取,而非设备获取)

    NAudio的录音和播放录音都有对应的类,我在使用Wav格式进行录音和播放录音时使用的类时WaveIn和WaveOut,这两个类是对功能的回调和一些事件触发. 在WaveIn和WaveOut之外还有对 ...

  3. iOS 获取系统相册数据(不是调系统的相册)

    Framework:AssetsLibrary.framework 主要目的是获取到系统相册的数据,并把系统相册里的照片显示出来. 1.创建一个新的项目: 2.将AssetsLibrary.frame ...

  4. DirectSound播放PCM(可播放实时采集的音频数据)

    前言 该篇整理的原始来源为http://blog.csdn.net/leixiaohua1020/article/details/40540147.非常感谢该博主的无私奉献,写了不少关于不同多媒体库的 ...

  5. 使用AudioTrack播放PCM音频数据(android)

    众所周知,Android的MediaPlayer包含了Audio和video的播放功能,在Android的界面上,Music和Video两个应用程序都是调用MediaPlayer实现的.MediaPl ...

  6. Android音频系统之音频框架

    1.1 音频框架 转载请注明,From LXS, http://blog.csdn.net/uiop78uiop78/article/details/8796492 Android的音频系统在很长一段 ...

  7. Android 音视频开发(二):使用 AudioRecord 采集音频数据并保存到文件

    版权声明:转载请说明出处:http://www.cnblogs.com/renhui/p/7457321.html 一.AudioRecord API详解 AudioRecord是Android系统提 ...

  8. RTMPdump(libRTMP) 源代码分析 9: 接收消息(Message)(接收视音频数据)

    ===================================================== RTMPdump(libRTMP) 源代码分析系列文章: RTMPdump 源代码分析 1: ...

  9. 获取系统中所有进程&线程信息

    读书笔记--[计算机病毒解密与对抗] 目录: 遍历进程&线程程序 终止进程 获取进程信息 获取进程内模块信息 获取进程命令行参数 代码运行环境:Win7 x64 VS2012 Update3 ...

  10. 如何用 ajax 连接mysql数据库,并且获取从中返回的数据。ajax获取从mysql返回的数据。responseXML分别输出不同数据的方法。

    开讲前,先说下网上,大部分的关于这方面的博文或者其他什么的,就我自己的感觉,第一说得不详细,第二语言不能很好的被初学者了解. 我这篇博文的标题之所以用了三句,是为了方便其他人好查找: 这里介绍的方法有 ...

随机推荐

  1. mac 系统使用vscode 创建c/c++ 工程项目 并配置断点调试

    mac 使用vsCode 创建c/c++ 工程项目 并配置断点调试 使用vscode 创建c/c++工程项目 准备工作 使用 vscode 下载插件 C/C++ Project Generator 开 ...

  2. Java常见面试真题之中级进阶

    前言 本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!java反射的作用于原理?说说List,Set,Map三者的区别?Object 有哪些常用方法?大致说一下每个方法的含义?Java 创建对 ...

  3. 如何使用Ida Pro和Core Dump文件定位崩溃位置(Linux下无调试符号的进程专享)

    我们在嵌入式Linux开发过程中经常会遇到一个问题,就是程序崩溃后不知道具体位置.因为我们发布到生产环境的一般是没有调试符号的(使用strip或编译时加-s参数,CMake生成的编译指令中的-O3也会 ...

  4. SHA1withRSA签名Python版本

    from Crypto.PublicKey import RSA from Crypto.Signature import PKCS1_v1_5 from Crypto.Hash import SHA ...

  5. 如何看待:以色列在真主党订购的5000台寻呼机中放了TNT

    日常生活等关键物品的生产必须要有国内完全掌握,美国.日本.以色列等国惯用的这种暗杀方法.如果不能在本国国内做到自主可控的产品生产,那么无疑是把自己的脑袋交给敌人来保护,随时都有丢命的可能. 同时,这也 ...

  6. 21.Kubernetes配置默认存储类

    Kubernetes配置默认存储类 前言 今天在配置Kubesphere的时候,出现了下面的错误 经过排查,发现是这个原因 我通过下面命令,查看Kubernetes集群中的默认存储类 kubectl ...

  7. 超聚变服务器2288H V6使用 iBMC 安装 Ubuntu Server 24.04 LTS及后续系统配置

    一. 超聚变服务器iBMC远程管理 超聚变服务器的iBMC芯片集成了一个专用的管理GE网口,提供全面的故障诊断.自动化运维.硬件安全加固等管理特性.iBMC支持Redfish.SNMP.IPMI 2. ...

  8. Nuxt.js 应用中的 request 事件钩子

    title: Nuxt.js 应用中的 request 事件钩子 date: 2024/12/4 updated: 2024/12/4 author: cmdragon excerpt: 在构建现代 ...

  9. Java基础 —— 反射

    动态语言  动态语言,是指程序在运行时可以改变其结构(新函数可以引进,已有的函数可以被删除等结构上的变化).如:JavaScript.Python就属于动态语言,而C.C++则不属于动态语言,从反射的 ...

  10. nvm安装node.js无法使用

    前情 最近在使用某此第三方模块需要依赖不同的node版本,于是想通nvm来管理node版本 坑 网上下载nvm-window的安装包,一步步傻瓜式安装下去,发现nrm无法使用,设置环境变量也没有用,再 ...