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

本例效果图:

o_88211.gif

代码文件:
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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466555.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我是如何使用wireshark软件的

长按二维码识别关注技术共享|资料共享|沟通交流01简介这篇文章介绍一个好用的抓包工具Wireshark&#xff0c; 用来获取网络数据封包&#xff0c;包括HTTP、TCP、UDP等网络协议包。开始界面wireshark是捕获机器上的某一块网卡的网络包&#xff0c;当你的机器上有多块网卡的时候&…

揩油

揩油&#xff0c;说的是老是有人送上来给我揩油&#xff0c;让我很没有心理准备&#xff0c;而且很不适应。 昨天去家乐福买东西&#xff0c;排队付钱的时候&#xff0c;我和前面一个女孩子的距离间隔<?xml:namespace prefix st1 ns "urn:schemas-microsoft-com:off…

AfxGetMainWnd( )函数

AfxGetMainWnd( )函数 版权声明&#xff1a;需要转载的请注明出处 https://blog.csdn.net/qq_22642239/article/details/52241405 AfxGetMainWnd( )&#xff1a; 使用AfxGetMainWnd函数获取MFC程序中的主框架类指针是一个常用作法。 就是获得应用程序主窗口的指针&#xff…

8086 汇编

8086 汇编速查手册 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神的无限的。 一、数据传输指令 ─────────────────────────────────────── 它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. 1. 通用数…

BZOJ4681 [jsoi2010]旅行

时间限制&#xff1a; 3S空间限制&#xff1a; 256M具体思路:DPf[i][j][k]表示1-i,前L条路上用了 j条,L后的路上换了k条的最小代价枚举一下L就有了一个复杂度O(nlognk^3)的做法AC代码#include<bits/stdc.h> using namespace std; #define INF 100000000 #define P pair&l…

IIC踩过的坑

读取IT8563WE时&#xff0c;读取第一次正确&#xff0c;第二次错误&#xff0c;第三次正确&#xff0c;第四次错误。。。。。。看到读取成功之后&#xff0c;SDA信号没有被正确拉高&#xff0c;电平大概只有一半。再次读取&#xff0c;主机设置读模式时&#xff0c;从机会发送N…

PostMessage()

PostMessage函数 PostMessage是Windows API(应用程序接口) 中的一个常用函数&#xff0c;用于将一条消息放入到消息队列中。消息队列里的消息通过调用GetMessage和PeekMessage取得。 函数功能 该函数将一个消息放入&#xff08;寄送&#xff09;到与指定窗口创建的线程相联系…

ATT汇编指令总结

AT&T汇编指令总结 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 1.寄存器引用 引用寄存器要在寄存器号前加百分号%,如“movl %eax, %ebx”。 80386有如下寄存器&#xff1a; 8个32-bit寄存器 %eax&#xff0c;%ebx&#xff0c;%ecx&#xff0c;…

jpush 极光推送 java

https://www.jianshu.com/p/22a4d630c01a http://blog.csdn.net/qq_35860097/article/details/75117323转载于:https://www.cnblogs.com/volatileAndCrazy/p/8508061.html

1万字30张图说清TCP协议

本篇文章较长&#xff0c;大家先看下目录1、简介2、TCP协议头3、TCP 数据包的编号&#xff08;SEQ&#xff09;4、三次握手建立连接5、四次挥手断开连接6、TCP可靠性的保证7、滑动窗口技术9、窗口滑动的数据重发9、TCP 流控制10、网线“断”了怎么办01简介TCP(Transmission Con…

比tween更有效的tween包.

感谢经典feixing1的提示. TweenLite&#xff1a; http://blog.greensock.com/tweenliteas3/ Tweener: http://code.google.com/p/tweener/ Burrows 翻译的 TweenLite中文文档http://www.troikaer.cn/blog/

蓝牙模块测试

蓝牙测试 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神的无限的。 1、发送AT&#xff0c;回复OK&#xff0c;连接成功 2、先发送 ATBTPOWER1&#xff1b;打开蓝牙功能&#xff0c;回复OK 3、发送ATBTHOST?&#xff1b;查询模块蓝牙地址和名称 4、发送ATBTSC…

Spring源码解析(二)BeanDefinition的Resource定位

IOC容器的初始化过程主要包括BeanDefinition的Resource定位、载入和注册。在实际项目中我们基本上操作的都是ApplicationContex的实现&#xff0c;我们比较熟悉的ClassPathXmlApplicationContext、FileSystemXmlApplicationContext、XmlWebapplicationContext等。ApplicationCo…

JSON.parse()

JSON.parse() 方法用于将一个 JSON 字符串转换为对象。 语法 JSON.parse(text[, reviver]) 参数说明&#xff1a; text:必需&#xff0c; 一个有效的 JSON 字符串。 reviver: 可选&#xff0c;一个转换结果的函数&#xff0c; 将为对象的每个成员调用此函数。 返回值&#xf…

apache+php+mysql+phpadmin 服务环境搭建

前些日子&#xff0c;有朋友问如何用apache/php/mysql/phpadmin搭建PHP网站服务环境.现在就这个问题&#xff0c;我把我的一些经验与大家分享。各位同行有何建议&#xff0c;敬请在评论区指出&#xff0c;谢谢&#xff01; 1.下载apache软件&#xff0c;以apache2.2为例。安装…

单片机(MCU)如何才能不死机之对齐访问(Aligned Access)

从一个结构体说起。如下&#xff0c;在 STM32F0 的程序中&#xff0c;我们定义了一个结构体My_Struct &#xff0c;那么这个结构体占用多少内存呢&#xff1f;struct Struct_Def { uint8_t Var_B; uint16_t Var_W0; uint16_t Var_W1; uint32_t Var_DW; }; struct Struct_Def My…

c_str()的用法

c_str()的用法ing&#xff0c;所以函数c_str()就是将C的string转化为C的字符串数组&#xff0c;c_str()生成一个const char *指针&#xff0c;指向字符串的首地址。 char *ps[10]; string a“welcome”; strcpy(p,a.c_str()); cout<<p; 结果为"welcome".

常见的蓝牙4.0模块

常见的蓝牙4.0模块 1、TI公司的cc2540/cc2640&#xff1b;2、nordic的蓝牙4.0&#xff08;BLE&#xff09;芯片nRF51822&#xff1b;3、汇承公司的HC-05蓝牙转串口模块&#xff1a;主芯片CSR BlueCore5 MM。

Sub-process /usr/bin/dpkg returned an error code (1)解决办法

在ubuntu 16.04更新了一些东西之后用apt装ros bringup包会出现如下错误&#xff1a; Sub-process /usr/bin/dpkg returned an error code (1) 解决办法&#xff1a; cd /var/lib/dpkg sudo mv info info.bak #即备份一个info sudo mkdir info #新建一个新的info目录 sudo apt i…

小米的隔空充电,看起来好酷

昨天是1月29号&#xff0c;昨天小米发布了一个隔空充电技术&#xff0c;很火爆&#xff0c;大胆想&#xff0c;如果有一条无线充电的高速公路&#xff0c;那电动汽车还担心没有电吗&#xff1f;—— 雷总的微博原文隔空充电技术&#xff1a;如科幻电影一般&#xff0c;拿着手机…