效果图:

使用了 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. 1059 C语言竞赛 (20 分)

    题目:1059 C语言竞赛 (20 分) C 语言竞赛是浙江大学计算机学院主持的一个欢乐的竞赛.既然竞赛主旨是为了好玩,颁奖规则也就制定得很滑稽: 0.冠军将赢得一份“神秘大奖”(比如很巨大的一本学生 ...

  2. id NSObject instanceType 区别

    id 当不确定数组元素类型时,可以选择使用id NSObject和id都可以指向任何对象 NSObject使用时必须强转 instantceType 只能返回和方法所在类相同类型的对象    返回值类 ...

  3. iOS UICollectionViewCell 的拖动

    1.长按cell的情况下实现拖动,所以理应想到用长按手势. 2.既然实现移动cell,就要看看UICollectionView 有没有方法或者协议可以移动的.通过查看UICollectionView的 ...

  4. Linux系统使用IBMV3700存储(可用)

    第一步:在存储上添加主机,主机采用ISCSI连接,此时需要主机的iqn 主机上获取IQN的命令如下: cat /etc/iscsi/initiatorname.iscsi 此时添加的主机状态处于脱机的 ...

  5. 吴裕雄--天生自然python学习笔记:爬取我国 1990 年到 2017年 GDP 数据并绘图显示

    绘制图形所需的数据源通常是不固定的,比如,有时我们会需要从网页抓取, 也可能需从文件或数据库中获取. 利用抓取网页数据技术,把我国 1990 年到 2016 年的 GDP 数据抓取出来 ,再利用 Ma ...

  6. C++语言堆栈的详细讲解

    本文主要向大家介绍了C++语言堆栈的详细讲解,通过具体的内容向大家展示,希望对大家学习C++语言有所帮助. 一.预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区 ...

  7. 1005 继续(3n+1)猜想 (25 分)

    题目:链接 卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数.例如对 n=3 ...

  8. ffmpeg直播系统

    1.HLS协议 http live streaming 将本地文件或者摄像头视频转成hls流文件 https://www.ffmpeg.org/ffmpeg-all.html#hls-2 2.rtmp ...

  9. 写了个通作的分页存储过程,top,加入了排序

    USE [WebDB_TradeOrder]GO/****** Object:  StoredProcedure [dbo].[Boss_Proc_PagingWithOrder]    Script ...

  10. C语言标准库 常用函数说明

    void *memset(void *str, int c, size_t n) Syntax void *memset(void *str, int c, size_t n) Description ...