//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. C# 13(.Net 9) 中的新特性 - 半自动属性

    C# 13 即 .Net 9 按照计划会在2024年11月发布,目前一些新特性已经定型,今天让我们来预览其中的一个新特性: 作者注:该特性虽然随着 C# 13 发布,但是仍然是处于 preview 状 ...

  2. 灵活轻巧的java接口自动化测试实战

    前言 无论是自动化测试还是自动化部署,撸码肯定少不了,所以下面的基于java语言的接口自动化测试,要想在业务上实现接口自动化,前提是要有一定的java基础. 如果没有java基础,也没关系.这里小编也 ...

  3. 轻松上云怎么操作?IoT_CLOUD之中移OneNET

    ​  最近来了很多新朋友,也经常被问:可以多讲些云平台的操作吗?当然可以!文末留言你想要了解的云平台,优先安排~ 接下来,本文将以Air780E+LuatOS作为示例,教你使用合宙IoT_CLOUD连 ...

  4. ARC151D Binary Representations and Queries

    ARC151D Binary Representations and Queries 题目链接:ARC151D Binary Representations and Queries 非常好思维题. 思 ...

  5. Docker之修改默认存储路径

    背景:Docker 默认安装的情况下,会使用 /var/lib/docker/ 目录作为存储目录,用以存放拉取的镜像和创建的容器等.不过由于此目录一般都位于系统盘,遇到系统盘比较小,而镜像和容器多了后 ...

  6. vagrant搭建开发环境

    一:我们为什么需要用这玩意 我们在开发中经常会面临的问题:环境不一致,有人用Mac有人用Windos还有几个用linux的,而我们的服务器都是linux. 在我本地是可以的啊,我测了都,没有问题啊,然 ...

  7. Blazor 组件库 BootstrapBlazor 中Row组件介绍

    组件介绍 在Bootstrap中,我们经常使用row和col通过栅格化来控制显示位置. 如 <div class="row"> <div class=" ...

  8. Mybatis【10】-- Mybatis属性名和查询字段名不同怎么做?

    很多时候我们有这样的需求,数据库的字段名与实体类的属性名不一致,这个时候我们需要怎么做呢?有两种解决方案,第一种:直接在查询的时候使用别名,将别名设置成与实体类的属性名一致.第二种:使用resultT ...

  9. 20号CSS学习

    前面部分笔记丢失(呜呜有机会补) 一.盒子模型 1.4表格的细线边框 border-collapse: collapse;表示相邻边框合并在一起. 1.5边框会影响盒子的实际大小 测量时不测边框. 1 ...

  10. Fiddler抓包iOS手机配置全流程

    前情 平时做移动移动端开必的时候经常需要抓包手机,用于接口请求跟踪,但iOS的抓包经常性的配不成功,经过踩过不少坑后终于知道了整个配置流程,此文记录Fiddler抓包iOS手机的配置流程. Step ...