用多媒体库 Bass.dll 播放 mp3 [9] - 绘制波形图
代码文件:
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] - 绘制波形图相关推荐
- 用多媒体库 Bass.dll 播放 mp3 [8] - 实时显示左右声道的峰值
为什么80%的码农都做不了架构师?>>> 本例效果图: 代码文件: unit Unit1;interfaceusesWindows, Messages, SysUtils, V ...
- 用多媒体库 Bass.dll 播放 mp3 [15] - 设置与获取播放速度
本例效果图: 代码文件: unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Contr ...
- 使用go语言GUI库实现对mp3文件的播放1(简单的播放mp3文件)
使用go语言GUI库实现对mp3文件的播放1(简单的播放mp3文件) 使用beep播放mp3文件(10num) 使用go语言GUI库fyne实现音乐播放器 要是想使用go语言实现播放mp3需要借助be ...
- 让终端支持播放mp3,移植mp3解码库libmad和madplay到嵌入式linux
libmad简介 MAD (libmad)是一个开源的高精度 MPEG 音频解码库,支持 MPEG-1(Layer I, Layer II 和 LayerIII(也就是 MP3).LIBMAD 提供 ...
- 使用SDL2_mixer库播放MP3音乐
使用SDL2_mixer库播放MP3音乐 运行环境:Ubuntu:16.04 开发环境准备 安装libsdl2-mixer-dev ~$ sudo apt install libsdl2-mixer- ...
- AIR32F103(八) 集成Helix MP3解码库播放MP3
目录 AIR32F103(一) 合宙AIR32F103CBT6开发板上手报告 AIR32F103(二) Linux环境和LibOpenCM3项目模板 AIR32F103(三) Linux环境基于标准外 ...
- 我的Android进阶之旅------Android MediaPlayer播放mp3的实例--简易mp3播放器
大家好我们今天研究的是Android中很重要也最为复杂的媒体播放器---MediaPlayer. Android的MediaPlayer包含了Audio和video的播放功能,在Android的界面上 ...
- S3C2440 音频解码芯片WM8976声卡驱动移植、测试以及madplay播放mp3文件(三十一)
https://www.cnblogs.com/lifexy/p/7867782.html 本节学习: 分析linux中的OOS声卡系统 修改s3c2410-uda1341.c的控制部分,移植wm89 ...
- c语言 音乐循环,在C语言控制台程序中播放MP3音乐
游戏没有声音多单调. 这里做一个简单的范例,用 mciSendString 函数播放 MP3 格式的音乐,先看看代码吧: // 编译该范例前,请把 background.mp3 放在项目文件夹中 // ...
最新文章
- mysql数据没有真正提交,转MySQL 批量提交优化
- linux命令补遗 - 4
- 电池充放电中的C5A 的意义
- 以下选项中python用于异常处理结构_《Python 程序设计》复习题
- 安卓手机浏览器排行_安卓手机性能排行榜:国产手机集体“出位”,华为却在角落哭泣?...
- mysql html 转义_HTML/Mysql/XML 转义字符,备查
- 基于php校园失物招领,校园失物招领系统设计
- python代码_零基础小白必看篇:Python代码注释规范代码实例解析操作(收藏)
- C/C++线程与多线程工作笔记0005---c/c++中的wchar_t类型
- Oracle中表pagesize,Oracle 解决显示凌乱串行问题时column、pagesize、linesize的设定
- 学无止境,我还在进步
- php下xcache的安装
- 玩转大数据系列之二:数据分析与处理
- PHP经常用到的方法,[PHP]经常用到的实用函数集合第1/2页
- Java connot reduce_hadoop错误:org.apache.hadoop.mapreduce.lib.input.FileSplit cannot be cast t...
- 电源 PFC(功率因数校正)电路拓扑,共计100多份,内含A PFC,连续断续,交错,维也纳,各功率段的PFC电路
- 怎么删除网络文件服务器的帐号,linux连个文件都删除不了,什么鬼!
- 图神经网络解释性问题综述
- python竖线_Matplotlib示例.43 横线与竖线
- 博瑞ge 加装无线 carpaly方法和效果展示
热门文章
- 数据结构和算法(03)---栈和队列(c++)
- Java JUC工具类--Semaphore
- codeforces 110A-C语言解题报告
- Java基础——Java NIO详解(二)
- Android设计模式之——抽象工厂模式
- Android设计模式之——Builder模式
- 项目经理需要的思维批判
- 程序员的思考--终于确定了自己的技术发展方向
- 解决:Chrome 插件安装时提示 程序包无效:“CRX_HEADER_INVALID“
- 解决org.hibernate.loader.custom.NonUniqueDiscoveredSqlAliasException: Encountered a duplicated sql ...