C# BASS音频库 + 频谱基本用法
效果图:
使用了 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音频库 + 频谱基本用法的更多相关文章
- Simple2D-18(音乐播放器)使用 bass 音频库
BASS 简介 BASS是一个在多个平台上用于软件的音频库.其目的是为开发人员提供功能强大且高效的示例流(MP3,MP2,MP1,OGG,WAV,AIFF),MOD 音乐(XM,IT,S3M,MOD ...
- Waud.js – 使用HTML5降级处理的Web音频库
Waud.js 是一个Web音频库,有一个HTML5音频降级处理方案. 它允许您利用Web音频API为你的Web应用程序控制音频功能.在不支持Web音频API的非现代浏览器使用HTML5音频降级方案. ...
- 移植eac3音频库
2016-5-26 移植eac3音频库,从ffmpeg库中移植.经过验证是切实可行的. 感觉开源软件就是时间黑洞,有多少时间搭进去都不为过.已经3周过去了,ffmpeg还是没有熟悉完. 真正的移植工作 ...
- c/c++ 重载运算符 标准库function的用法
重载运算符 标准库function的用法 问题:int(int, int)算不算一种比较通用的类型?? 比如函数: int add(int a, int b); 比如lambda:auto mod = ...
- Python爬虫入门之Urllib库的高级用法
1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览 ...
- Python爬虫Urllib库的高级用法
Python爬虫Urllib库的高级用法 设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Head ...
- $python爬虫系列(2)—— requests和BeautifulSoup库的基本用法
本文主要介绍python爬虫的两大利器:requests和BeautifulSoup库的基本用法. 1. 安装requests和BeautifulSoup库 可以通过3种方式安装: easy_inst ...
- Python爬虫入门四之Urllib库的高级用法
1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览 ...
- 转 Python爬虫入门四之Urllib库的高级用法
静觅 » Python爬虫入门四之Urllib库的高级用法 1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我 ...
随机推荐
- FP-Grow树
序言 FP-growth(Frequent Pattern Tree, 频繁模式树),是韩家炜老师提出的挖掘频繁项集的方法,是将数据集存储在一个特定的称作FP树的结构之后发现频繁项集或频繁项对,即常在 ...
- in+sb's+基数词的复数形式|UFO|the minutes|
Hawking became world-famous in ________. A. his thirties in the 1970's B. the thirties in his 1970 ...
- Hypothesis Tests for One Population Mean When σ Is Unknown|other
9.5 Hypothesis Tests for One Population Mean When σ Is Unknown 使用t分布: What If the Assumptions Are No ...
- 关于AI行业创业的6个问题
第一个问题:互联网 vs 人工智能 首先如果今天大家选择创业,我建议更应该关注人工智能,而非互联网.为什么这么讲? 1. 互联网的流量红利已经消失: 以PC来说,全球PC出货量连续5年下滑.大家知道国 ...
- java面试题 -- 基础
1.抽象和封装的不同点抽象和封装是互补的概念.一方面,抽象关注对象的行为.另一方面,封装关注对象行为的细节.一般是通过隐藏对象内部状态信息做到封装,因此,封装可以看成是用来提供抽象的一种策略.2.重载 ...
- Qt 非阻塞延时
void delay(int mSec)//ms { QEventLoop loop; QTimer::singleShot(mSec, &loop, SLOT(quit())); loop. ...
- CF-1111C-Creative Snap
前两天过年,所以两天前的比赛题目现在才来回顾. 这题是一个最平常的递归,加一个剪枝.题目说如果一段距离没有复仇者看守,消耗的能量为A,A一定是正整数.由此可知对于没有复仇者看守的段,不拆一定比拆成两半 ...
- Nginx笔记总结十三:sub_filter内容替换
Nginx变异安装加上参数 --with-http_sub_module 配置文件: location ~* ^/portalproxy/([-]*)/portal(.*)$ { #sub_filte ...
- js 实现排序算法 -- 选择排序(Selection Sort)
原文: 十大经典排序算法(动图演示) 选择排序(Selection Sort) 选择排序(Selection-sort)是一种简单直观的排序算法.它的工作原理:首先在未排序序列中找到最小(大)元素,存 ...
- java连接sqlserver数据简单操作
首先我们下载微软的JDBC驱动包 https://www.microsoft.com/en-us/download/details.aspx?id=11774 下载好后我们打开如下图 点击Unzip ...