zoukankan      html  css  js  c++  java
  • C# BASS音频库 + 频谱基本用法

    效果图:

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

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

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

    完整代码:

      1 using System;
      2 using System.Windows.Forms;
      3 using Un4seen.Bass;
      4 
      5 namespace WindowsFormsApp3
      6 {
      7     public partial class Form1 : Form
      8     {
      9         public Form1()
     10         {
     11             InitializeComponent();
     12         }
     13 
     14         private void Form1_Load(object sender, EventArgs e)
     15         {
     16             //启动频谱(参数是响应延迟,数字越小,音柱回起速度越快)
     17             peakMeterCtrl1.Start(1000 / Int32.Parse(cbo_fps.Text));
     18 
     19             //-1 表示 默认设备输出
     20             //44100 表示 输出采样率
     21             //BASS_DEVICE_CPSPEAKERS 表示输出模式
     22             if (!Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_CPSPEAKERS, this.Handle))
     23             {
     24                 MessageBox.Show("出错了," + Bass.BASS_ErrorGetCode().ToString());
     25             }
     26 
     27             Timer t = new Timer();
     28             t.Interval = 1;
     29             t.Tick += T_Tick;
     30             t.Start();
     31         }
     32 
     33         string fileName;
     34         int stream;
     35 
     36         private void btn_open_Click(object sender, EventArgs e)
     37         {
     38             OpenFileDialog o = new OpenFileDialog();
     39             if (o.ShowDialog() == DialogResult.OK)
     40             {
     41                 fileName = o.FileName;
     42 
     43                 //第一个参数是文件名,
     44                 //第二个参数是文件流开始位置,
     45                 //第三个是文件流长度 0为使用文件整个长度,
     46                 //最后一个是流的创建模式
     47                 stream = Bass.BASS_StreamCreateFile(fileName, 0L, 0L, BASSFlag.BASS_SAMPLE_FLOAT);
     48             }
     49         }
     50 
     51        
     52         private void btn_play_Click(object sender, EventArgs e)
     53         {
     54             Bass.BASS_ChannelPlay(stream, true); //开始播放
     55         }
     56 
     57         private void btn_pause_Click(object sender, EventArgs e)
     58         {
     59             Bass.BASS_ChannelPause(stream);//音乐暂停
     60         }
     61 
     62         private void btn_resume_Click(object sender, EventArgs e)
     63         {
     64             Bass.BASS_ChannelPlay(stream, false);
     65         }
     66 
     67         private void btn_stop_Click(object sender, EventArgs e)
     68         {
     69             Bass.BASS_ChannelStop(stream);  //停止播放
     70         }
     71 
     72         private void btn_close_Click(object sender, EventArgs e)
     73         {
     74             Bass.BASS_Stop();   //停止所有输出
     75             Bass.BASS_Free();   //释放所有资源
     76 
     77             if (!Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_CPSPEAKERS, this.Handle))
     78             {
     79                 MessageBox.Show("出错了," + Bass.BASS_ErrorGetCode().ToString());
     80             }
     81         }
     82 
     83         private void btn_test_Click(object sender, EventArgs e)
     84         {
     85             this.peakMeterCtrl1.SetRange(33, 66, 100);
     86         }
     87 
     88         private void Form1_FormClosing(object sender, FormClosingEventArgs e)
     89         {
     90             Bass.BASS_ChannelStop(stream);  //停止播放
     91             Bass.BASS_StreamFree(stream);   //释放音频流
     92             Bass.BASS_Stop();   //停止所有输出
     93             Bass.BASS_Free();   //释放所有资源
     94         }
     95 
     96         const int BandsCount = 128;
     97         int[] FFTPeacks = new int[BandsCount];
     98         int[] FFTFall = new int[BandsCount];
     99         int rate = 1500;
    100 
    101         /// <summary>
    102         /// 用计时器绘制频谱(如果有更好的思路欢迎留言)
    103         /// </summary>
    104         /// <param name="sender"></param>
    105         /// <param name="e"></param>
    106         private void T_Tick(object sender, EventArgs e)
    107         {
    108             if (Bass.BASS_ChannelIsActive(stream) != BASSActive.BASS_ACTIVE_PLAYING) return;
    109             int[] FFTFall = Array.ConvertAll<float, int>(GetFFTData(), delegate (float f) { return (int)Math.Abs(f * rate); });
    110             this.peakMeterCtrl1.SetData(FFTFall, 0, FFTFall.Length);
    111         }
    112 
    113         // 获取FFT采样数据,返回128个浮点采样数据
    114         public float[] GetFFTData()
    115         {
    116             float[] fft = new float[BandsCount];
    117             Bass.BASS_ChannelGetData(stream, fft, (int)BASSData.BASS_DATA_FFT256);
    118             return fft;
    119         }
    120 
    121         private void cbo_fps_SelectedIndexChanged(object sender, EventArgs e)
    122         {
    123             peakMeterCtrl1.Stop();
    124             peakMeterCtrl1.Start(1000 / Int32.Parse(cbo_fps.Text)); //fps
    125         }
    126 
    127         private void numericUpDown1_ValueChanged(object sender, EventArgs e)
    128         {
    129             rate = Int32.Parse(numericUpDown1.Value.ToString()); //增益效果
    130         }
    131 
    132         private void txt_LEDCount_TextChanged(object sender, EventArgs e)
    133         {
    134             peakMeterCtrl1.LEDCount = Convert.ToInt32(txt_LEDCount.Text);//纵向格子数量
    135         }
    136 
    137         private void txt_BANDSCount_TextChanged(object sender, EventArgs e)
    138         {
    139             peakMeterCtrl1.BandsCount = Convert.ToInt32(txt_BANDSCount.Text); //横向格子数量
    140         }
    141 
    142         private void cheb_ShowGrid_CheckedChanged(object sender, EventArgs e)
    143         {
    144             peakMeterCtrl1.ShowGrid = cheb_ColoredGrid.Enabled = cheb_ShowGrid.Checked; //显示背景格子
    145         }
    146 
    147         private void cheb_ColoredGrid_CheckedChanged(object sender, EventArgs e)
    148         {
    149             peakMeterCtrl1.ColoredGrid = cheb_ColoredGrid.Checked; //显示彩色背景格子
    150         }
    151 
    152         private void cheb_FalloffEffect_CheckedChanged(object sender, EventArgs e)
    153         {
    154             peakMeterCtrl1.FalloffEffect = cheb_FalloffEffect.Checked;  //显示回落效果
    155         }
    156     }
    157 
    158        
    159     
    160 }
    View Code

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

  • 相关阅读:
    设计模式相关,单例模式!
    混合App交互相关,jsBridge的原理
    Vue相关,插槽怎么用!
    Mysql相关,查询功能整理
    图文并茂讲解进程与线程
    线程与进程的区别及其通信方式
    算法,十进制数转任意进制数
    JavaScript,leetcode第198题,打家劫舍
    2.4G无线控制器附加AT2401C功放IC增加距离
    超低功耗WiFi :ESP8089
  • 原文地址:https://www.cnblogs.com/mumu9008/p/12469384.html
Copyright © 2011-2022 走看看