效果图:

使用了 BASS.dll、  BASS.NET.dll   和  PeakMeterCtrl.dll

前面两个负责播放   最后一个负责绘制频谱,本文重点讲的是频谱部分,播放音频部分注意一点就是,下载的两个 bass文件  bass.dll是直接丢在debug目录,bass.net.dll是通过项目引入进来的。

这里直接省略了找官网下载步骤。

完整代码:

 using System;
using System.Windows.Forms;
using Un4seen.Bass; namespace WindowsFormsApp3
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
//启动频谱(参数是响应延迟,数字越小,音柱回起速度越快)
peakMeterCtrl1.Start( / Int32.Parse(cbo_fps.Text)); //-1 表示 默认设备输出
//44100 表示 输出采样率
//BASS_DEVICE_CPSPEAKERS 表示输出模式
if (!Bass.BASS_Init(-, , BASSInit.BASS_DEVICE_CPSPEAKERS, this.Handle))
{
MessageBox.Show("出错了," + Bass.BASS_ErrorGetCode().ToString());
} Timer t = new Timer();
t.Interval = ;
t.Tick += T_Tick;
t.Start();
} string fileName;
int stream; private void btn_open_Click(object sender, EventArgs e)
{
OpenFileDialog o = new OpenFileDialog();
if (o.ShowDialog() == DialogResult.OK)
{
fileName = o.FileName; //第一个参数是文件名,
//第二个参数是文件流开始位置,
//第三个是文件流长度 0为使用文件整个长度,
//最后一个是流的创建模式
stream = Bass.BASS_StreamCreateFile(fileName, 0L, 0L, BASSFlag.BASS_SAMPLE_FLOAT);
}
} private void btn_play_Click(object sender, EventArgs e)
{
Bass.BASS_ChannelPlay(stream, true); //开始播放
} private void btn_pause_Click(object sender, EventArgs e)
{
Bass.BASS_ChannelPause(stream);//音乐暂停
} private void btn_resume_Click(object sender, EventArgs e)
{
Bass.BASS_ChannelPlay(stream, false);
} private void btn_stop_Click(object sender, EventArgs e)
{
Bass.BASS_ChannelStop(stream); //停止播放
} private void btn_close_Click(object sender, EventArgs e)
{
Bass.BASS_Stop(); //停止所有输出
Bass.BASS_Free(); //释放所有资源 if (!Bass.BASS_Init(-, , BASSInit.BASS_DEVICE_CPSPEAKERS, this.Handle))
{
MessageBox.Show("出错了," + Bass.BASS_ErrorGetCode().ToString());
}
} private void btn_test_Click(object sender, EventArgs e)
{
this.peakMeterCtrl1.SetRange(, , );
} private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
Bass.BASS_ChannelStop(stream); //停止播放
Bass.BASS_StreamFree(stream); //释放音频流
Bass.BASS_Stop(); //停止所有输出
Bass.BASS_Free(); //释放所有资源
} const int BandsCount = ;
int[] FFTPeacks = new int[BandsCount];
int[] FFTFall = new int[BandsCount];
int rate = ; /// <summary>
/// 用计时器绘制频谱(如果有更好的思路欢迎留言)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void T_Tick(object sender, EventArgs e)
{
if (Bass.BASS_ChannelIsActive(stream) != BASSActive.BASS_ACTIVE_PLAYING) return;
int[] FFTFall = Array.ConvertAll<float, int>(GetFFTData(), delegate (float f) { return (int)Math.Abs(f * rate); });
this.peakMeterCtrl1.SetData(FFTFall, , FFTFall.Length);
} // 获取FFT采样数据,返回128个浮点采样数据
public float[] GetFFTData()
{
float[] fft = new float[BandsCount];
Bass.BASS_ChannelGetData(stream, fft, (int)BASSData.BASS_DATA_FFT256);
return fft;
} private void cbo_fps_SelectedIndexChanged(object sender, EventArgs e)
{
peakMeterCtrl1.Stop();
peakMeterCtrl1.Start( / Int32.Parse(cbo_fps.Text)); //fps
} private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
rate = Int32.Parse(numericUpDown1.Value.ToString()); //增益效果
} private void txt_LEDCount_TextChanged(object sender, EventArgs e)
{
peakMeterCtrl1.LEDCount = Convert.ToInt32(txt_LEDCount.Text);//纵向格子数量
} private void txt_BANDSCount_TextChanged(object sender, EventArgs e)
{
peakMeterCtrl1.BandsCount = Convert.ToInt32(txt_BANDSCount.Text); //横向格子数量
} private void cheb_ShowGrid_CheckedChanged(object sender, EventArgs e)
{
peakMeterCtrl1.ShowGrid = cheb_ColoredGrid.Enabled = cheb_ShowGrid.Checked; //显示背景格子
} private void cheb_ColoredGrid_CheckedChanged(object sender, EventArgs e)
{
peakMeterCtrl1.ColoredGrid = cheb_ColoredGrid.Checked; //显示彩色背景格子
} private void cheb_FalloffEffect_CheckedChanged(object sender, EventArgs e)
{
peakMeterCtrl1.FalloffEffect = cheb_FalloffEffect.Checked; //显示回落效果
}
} }

最后附上网盘下载地址:https://pan.baidu.com/s/1xQI2YTeYN-SUghhC1gCH_g 提取码: iirb

C# BASS音频库 + 频谱基本用法的更多相关文章

  1. Simple2D-18(音乐播放器)使用 bass 音频库

    BASS 简介 BASS是一个在多个平台上用于软件的音频库.其目的是为开发人员提供功能强大且高效的示例流(MP3,MP2,MP1,OGG,WAV,AIFF),MOD 音乐(XM,IT,S3M,MOD ...

  2. Waud.js – 使用HTML5降级处理的Web音频库

    Waud.js 是一个Web音频库,有一个HTML5音频降级处理方案. 它允许您利用Web音频API为你的Web应用程序控制音频功能.在不支持Web音频API的非现代浏览器使用HTML5音频降级方案. ...

  3. 移植eac3音频库

    2016-5-26 移植eac3音频库,从ffmpeg库中移植.经过验证是切实可行的. 感觉开源软件就是时间黑洞,有多少时间搭进去都不为过.已经3周过去了,ffmpeg还是没有熟悉完. 真正的移植工作 ...

  4. c/c++ 重载运算符 标准库function的用法

    重载运算符 标准库function的用法 问题:int(int, int)算不算一种比较通用的类型?? 比如函数: int add(int a, int b); 比如lambda:auto mod = ...

  5. Python爬虫入门之Urllib库的高级用法

    1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览 ...

  6. Python爬虫Urllib库的高级用法

    Python爬虫Urllib库的高级用法 设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Head ...

  7. $python爬虫系列(2)—— requests和BeautifulSoup库的基本用法

    本文主要介绍python爬虫的两大利器:requests和BeautifulSoup库的基本用法. 1. 安装requests和BeautifulSoup库 可以通过3种方式安装: easy_inst ...

  8. Python爬虫入门四之Urllib库的高级用法

    1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览 ...

  9. 转 Python爬虫入门四之Urllib库的高级用法

    静觅 » Python爬虫入门四之Urllib库的高级用法 1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我 ...

随机推荐

  1. python版本不同,修改cmd下的默认版本

    原文出处 https://blog.csdn.net/zyx_ly/article/details/93137014  感谢博主分享 即修改系统环境变量的位置,把想设置成为默认的上移即可

  2. 基于TCP的大文件发送、UDP、socketserver

    基于TCP的大文件发送 #server服务端 import struct import json import os import socket server = socket.socket() # ...

  3. phpcms添加图片投票

    1phpcms加入投票选项的图片上传功能,从我的文件下载,然后到phpcms目录下直接覆盖即可. 当然这边出现了一个bug,修改投票选项不能修改的bug,只需要修改vote_option_class. ...

  4. OpenCV 级联分类器

    #include "opencv2/objdetect/objdetect.hpp" #include "opencv2/highgui/highgui.hpp" ...

  5. deeplearning.ai 卷积神经网络 Week 1 卷积神经网络

    1. 传统的边缘检测(比如Sobel)手工设计了3*3的filter(或者叫kernel)的9个权重,在深度学习中,这9个权重都是学习出来的参数,会比手工设计的filter更好,不但可以提取90度.0 ...

  6. [LC] 211. Add and Search Word - Data structure design

    Design a data structure that supports the following two operations: void addWord(word) bool search(w ...

  7. 自主知识产权受热捧 瑞星ESM SOHO版全力护卫小微企业

    小微企业现在可以说是我国国民经济中最重要的组成部分,在总产值.利税.解决就业等方面,都在为国家积极贡献着自己的力量.但在小微企业一片欣欣向荣的背后,却有着难言之隐--那就是困扰着广大小微企业多年的企业 ...

  8. IDEA无法启动:Failed to create JVM:error code -1

    转自:https://blog.csdn.net/u013243986/article/details/52296944 随便设置把内存加大了, 结果idea就奔溃了,再打开时就提示这样的错误,Fai ...

  9. LINQ之路 7:子查询、创建策略和数据转换(要点笔记)

    匿名类型 上面我们自己定义了类型TempProjectionItem来存放查询的结果.通过使用匿名类型,我们可以省去这种中间类型的定义,而由编译器来帮我们完成: select item.Origina ...

  10. mybatis 添加后获得该新增数据自动生成的 id

    // useGeneratedKeys默认值为false,keyProperty的值对应的是User类中的主键字段名 // mybatis 写法如下 <insert id="inser ...