本例效果图:



代码文件:


unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, ExtCtrls, ComCtrls;typeTForm1 = class(TForm)OpenDialog1: TOpenDialog;PaintBox1: TPaintBox;Button1: TButton;Button2: TButton;Button3: TButton;ColorBox1: TColorBox;ColorBox2: TColorBox;procedure FormCreate(Sender: TObject);procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);procedure Button3Click(Sender: TObject);procedure ColorBox1Change(Sender: TObject);procedure ColorBox2Change(Sender: TObject);procedure FormDestroy(Sender: TObject);procedure PaintBox1Paint(Sender: TObject);privateprocedure Draw;end;varForm1: TForm1;implementation{$R *.dfm}uses Bass;varhs: HSTREAM;  {流句柄}Data: array of Cardinal;bit: TBitmap;procedure TForm1.FormCreate(Sender: TObject);
beginbit := TBitmap.Create;PaintBox1.Align := alTop;ColorBox1.Selected := clBlack;ColorBox2.Selected := clLime;if HiWord(BASS_GetVersion) <> BASSVERSION thenMessageBox(0, '"Bass.dll" 文件版本不合适! ', nil, MB_ICONERROR);if not BASS_Init(-1, 44100, 0, 0, nil) then ShowMessage('初始化错误');
end;{打开}
procedure TForm1.Button1Click(Sender: TObject);
varMp3Path: AnsiString;i: Cardinal;time: Double;hs2: HSTREAM;
beginBASS_StreamFree(hs);OpenDialog1.Filter := 'Mp3 文件(*.mp3)|*.mp3|Wav 文件(*.wav)|*wav';if OpenDialog1.Execute thenMp3Path := AnsiString(OpenDialog1.FileName);hs := BASS_StreamCreateFile(False, PAnsiChar(Mp3Path), 0, 0, 0);if hs < BASS_ERROR_ENDED thenText := '打开失败'else beginText := string(Mp3Path);bit.Free;bit := TBitmap.Create;PaintBox1.Repaint;{下面几行不好理解}{重新建立文件流 hs2, 最后的参数是: BASS_STREAM_DECODE, 这样可以提前读取波形数据}hs2 := BASS_StreamCreateFile(False, PAnsiChar(Mp3Path), 0, 0, BASS_STREAM_DECODE);{用 BASS_ChannelGetLevel 获取峰值时, 是以 20ms 为一个单位的; 先获取总时间}time := BASS_ChannelBytes2Seconds(hs2, BASS_ChannelGetLength(hs, BASS_POS_BYTE));{time * 1000 div 20 + 1 是可以获取的总的峰值数据, 也是数组需要的大小}SetLength(Data, Trunc(time * 50 + 1));{遍历峰值数据填充数组}for i := 0 to Length(Data) - 1 do Data[i] := BASS_ChannelGetLevel(hs2);{hs2 此时已完成使命, 释放它}BASS_StreamFree(hs2);{调用绘制过程}Draw;end;
end;{播放}
procedure TForm1.Button2Click(Sender: TObject);
beginBASS_ChannelPlay(hs, False);
end;{暂停}
procedure TForm1.Button3Click(Sender: TObject);
beginBASS_ChannelPause(hs);
end;{背景色}
procedure TForm1.ColorBox1Change(Sender: TObject);
beginDraw;
end;{前景色}
procedure TForm1.ColorBox2Change(Sender: TObject);
beginDraw;
end;procedure TForm1.FormDestroy(Sender: TObject);
beginBASS_Free;bit.Free;
end;{刷新}
procedure TForm1.PaintBox1Paint(Sender: TObject);
beginPaintBox1.Canvas.StretchDraw(Bounds(0, 0, PaintBox1.Width, PaintBox1.Height), bit);
end;{绘制波形图}
procedure TForm1.Draw;
vari,ch: Integer;L,R: SmallInt;
beginbit.Width := Length(Data);bit.Height := PaintBox1.Height;ch := bit.Height div 2;bit.Canvas.Brush.Color := ColorBox1.Selected;bit.Canvas.FillRect(Bounds(0, 0, bit.Width, bit.Height));bit.Canvas.Pen.Color := ColorBox2.Selected;for i := 0 to Length(Data) - 1 dobeginL := LoWord(Data[i]);R := HiWord(Data[i]);bit.Canvas.MoveTo(i, ch - Trunc(L/32768*ch));bit.Canvas.LineTo(i, ch + Trunc(R/32768*ch));end;PaintBox1.Repaint;
end;end.

窗体文件:


object Form1: TForm1Left = 222Top = 114Caption = 'Form1'ClientHeight = 173ClientWidth = 504Color = clBtnFaceFont.Charset = DEFAULT_CHARSETFont.Color = clWindowTextFont.Height = -11Font.Name = 'Tahoma'Font.Style = []OldCreateOrder = FalsePosition = poDesignedOnCreate = FormCreateOnDestroy = FormDestroyPixelsPerInch = 96TextHeight = 13object PaintBox1: TPaintBoxLeft = 40Top = 0Width = 105Height = 131OnPaint = PaintBox1Paintendobject Button1: TButtonLeft = 8Top = 137Width = 75Height = 25Caption = #25171#24320TabOrder = 0OnClick = Button1Clickendobject Button2: TButtonLeft = 89Top = 137Width = 75Height = 25Caption = #25773#25918TabOrder = 1OnClick = Button2Clickendobject Button3: TButtonLeft = 170Top = 137Width = 75Height = 25Caption = #26242#20572TabOrder = 2OnClick = Button3Clickendobject ColorBox1: TColorBoxLeft = 315Top = 139Width = 85Height = 22ItemHeight = 16TabOrder = 3OnChange = ColorBox1Changeendobject ColorBox2: TColorBoxLeft = 406Top = 139Width = 90Height = 22ItemHeight = 16TabOrder = 4OnChange = ColorBox2Changeendobject OpenDialog1: TOpenDialogLeft = 192Top = 32end
end

用多媒体库 Bass.dll 播放 mp3 [9] - 绘制波形图相关推荐

  1. 用多媒体库 Bass.dll 播放 mp3 [8] - 实时显示左右声道的峰值

    为什么80%的码农都做不了架构师?>>>    本例效果图: 代码文件: unit Unit1;interfaceusesWindows, Messages, SysUtils, V ...

  2. 用多媒体库 Bass.dll 播放 mp3 [15] - 设置与获取播放速度

    本例效果图: 代码文件: unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Contr ...

  3. 使用go语言GUI库实现对mp3文件的播放1(简单的播放mp3文件)

    使用go语言GUI库实现对mp3文件的播放1(简单的播放mp3文件) 使用beep播放mp3文件(10num) 使用go语言GUI库fyne实现音乐播放器 要是想使用go语言实现播放mp3需要借助be ...

  4. 让终端支持播放mp3,移植mp3解码库libmad和madplay到嵌入式linux

    libmad简介 MAD (libmad)是一个开源的高精度 MPEG 音频解码库,支持 MPEG-1(Layer I, Layer II 和 LayerIII(也就是 MP3).LIBMAD 提供 ...

  5. 使用SDL2_mixer库播放MP3音乐

    使用SDL2_mixer库播放MP3音乐 运行环境:Ubuntu:16.04 开发环境准备 安装libsdl2-mixer-dev ~$ sudo apt install libsdl2-mixer- ...

  6. AIR32F103(八) 集成Helix MP3解码库播放MP3

    目录 AIR32F103(一) 合宙AIR32F103CBT6开发板上手报告 AIR32F103(二) Linux环境和LibOpenCM3项目模板 AIR32F103(三) Linux环境基于标准外 ...

  7. 我的Android进阶之旅------Android MediaPlayer播放mp3的实例--简易mp3播放器

    大家好我们今天研究的是Android中很重要也最为复杂的媒体播放器---MediaPlayer. Android的MediaPlayer包含了Audio和video的播放功能,在Android的界面上 ...

  8. S3C2440 音频解码芯片WM8976声卡驱动移植、测试以及madplay播放mp3文件(三十一)

    https://www.cnblogs.com/lifexy/p/7867782.html 本节学习: 分析linux中的OOS声卡系统 修改s3c2410-uda1341.c的控制部分,移植wm89 ...

  9. c语言 音乐循环,在C语言控制台程序中播放MP3音乐

    游戏没有声音多单调. 这里做一个简单的范例,用 mciSendString 函数播放 MP3 格式的音乐,先看看代码吧: // 编译该范例前,请把 background.mp3 放在项目文件夹中 // ...

最新文章

  1. mysql数据没有真正提交,转MySQL 批量提交优化
  2. linux命令补遗 - 4
  3. 电池充放电中的C5A 的意义
  4. 以下选项中python用于异常处理结构_《Python 程序设计》复习题
  5. 安卓手机浏览器排行_安卓手机性能排行榜:国产手机集体“出位”,华为却在角落哭泣?...
  6. mysql html 转义_HTML/Mysql/XML 转义字符,备查
  7. 基于php校园失物招领,校园失物招领系统设计
  8. python代码_零基础小白必看篇:Python代码注释规范代码实例解析操作(收藏)
  9. C/C++线程与多线程工作笔记0005---c/c++中的wchar_t类型
  10. Oracle中表pagesize,Oracle 解决显示凌乱串行问题时column、pagesize、linesize的设定
  11. 学无止境,我还在进步
  12. php下xcache的安装
  13. 玩转大数据系列之二:数据分析与处理
  14. PHP经常用到的方法,[PHP]经常用到的实用函数集合第1/2页
  15. Java connot reduce_hadoop错误:org.apache.hadoop.mapreduce.lib.input.FileSplit cannot be cast t...
  16. 电源 PFC(功率因数校正)电路拓扑,共计100多份,内含A PFC,连续断续,交错,维也纳,各功率段的PFC电路
  17. 怎么删除网络文件服务器的帐号,linux连个文件都删除不了,什么鬼!
  18. 图神经网络解释性问题综述
  19. python竖线_Matplotlib示例.43 横线与竖线
  20. 博瑞ge 加装无线 carpaly方法和效果展示

热门文章

  1. 数据结构和算法(03)---栈和队列(c++)
  2. Java JUC工具类--Semaphore
  3. codeforces 110A-C语言解题报告
  4. Java基础——Java NIO详解(二)
  5. Android设计模式之——抽象工厂模式
  6. Android设计模式之——Builder模式
  7. 项目经理需要的思维批判
  8. 程序员的思考--终于确定了自己的技术发展方向
  9. 解决:Chrome 插件安装时提示 程序包无效:“CRX_HEADER_INVALID“
  10. 解决org.hibernate.loader.custom.NonUniqueDiscoveredSqlAliasException: Encountered a duplicated sql ...