Delphi利用Bass.dll播放音频
2011-09-22 13:27
369 查看
正好要做一个能够播放音频的模块,看到万一的博客中关于用BASS做音频处理的一些例子,正好满足我的需求。
在http://www.un4seen.com下载BASS 2.4.8,解压包后要设置Bass.dll路径和导入Bass.pas。
Delphi 中使用前,
有三步工作要做:
1、复制 Bass.dll 到系统可以识别的文件夹, 譬如:
Windows\System32、Windows、Windows\System,
也可以是系统或用户的环境变量 Path 指定的任何目录, 还可以在做程序时放在当前目录, 随便放一个文件夹然后在程序中指定路径也可以.
2、把专为 Delphi 写的头文件 bass.pas 放在某个目录(譬如:
C:\Program Files\CodeGear\RAD Studio\6.0\Imports\Bass24).
3、然后从 Delphi 菜单 -> Tools -> Options
-> Library-Win32 -> Library path -> 然后 Add 这个目录
下面几个函数是从万一那copy来的,记在这里方便自己查阅。
好了,环境设置好后,动手做一个程序先
在http://www.un4seen.com下载BASS 2.4.8,解压包后要设置Bass.dll路径和导入Bass.pas。
Delphi 中使用前,
有三步工作要做:
1、复制 Bass.dll 到系统可以识别的文件夹, 譬如:
Windows\System32、Windows、Windows\System,
也可以是系统或用户的环境变量 Path 指定的任何目录, 还可以在做程序时放在当前目录, 随便放一个文件夹然后在程序中指定路径也可以.
2、把专为 Delphi 写的头文件 bass.pas 放在某个目录(譬如:
C:\Program Files\CodeGear\RAD Studio\6.0\Imports\Bass24).
3、然后从 Delphi 菜单 -> Tools -> Options
-> Library-Win32 -> Library path -> 然后 Add 这个目录
下面几个函数是从万一那copy来的,记在这里方便自己查阅。
function BASS_StreamCreateFile( mem: BOOL; {从文件载入这里是 False; 从内存载入这里是 True} f: Pointer; {文件名或内存流的指针} offset: QWORD; {播放起始点, 单位是 1/10 毫米; 只在参数 1: mem = False 时有效; 默认是 0} length: QWORD; {播放终止点, 单位是 1/10 毫米; 只在参数 1: mem = False 时有效; 默认是 0} flags: DWORD {BASS_SAMPLE_3D 等参数的组合; 控制播放效果、反复和解码等等} ): HSTREAM; stdcall; external bassdll; //获取文件流的长度, 单位是字节 function BASS_ChannelGetLength( handle: DWORD; {流句柄} mode: DWORD {获取模式; 有两种选择, 但对 HSTREAM 流只能使用 BASS_POS_BYTE} ): QWORD; stdcall; external bassdll; //获取流的当前指针位置, 单位是字节 function BASS_ChannelGetPosition( handle: DWORD; {流句柄} mode: DWORD {获取模式; 有两种选择, 但对 HSTREAM 流只能使用 BASS_POS_BYTE} ): QWORD; stdcall; external bassdll; //根据流的指针位置来获取时间点, 单位是秒, 是非常精确的浮点数 function BASS_ChannelBytes2Seconds( handle: DWORD; {流句柄} pos: QWORD {流的指针位置, 单位是字节, QWORD = Int64} ): Double; stdcall;external bassdll; //和 BASS_ChannelBytes2Seconds 相反, BASS_ChannelSeconds2Bytes 可以通过时间获取流的指针位置. function BASS_ChannelSeconds2Bytes( handle: DWORD; pos: Double ): QWORD; stdcall;external bassdll; //和 BASS_ChannelGetPosition 相反, BASS_ChannelSetPosition 可以设置流的指针位置. function BASS_ChannelSetPosition( handle: DWORD; pos: QWORD; mode: DWORD ): BOOL; stdcall; external bassdll;
好了,环境设置好后,动手做一个程序先
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) btnOpen: TButton; btnPlay: TButton; btnPause: TButton; edt1: TEdit; dlgOpen1: TOpenDialog; lbl1: TLabel; chkLoop: TCheckBox; btnDelete: TButton; procedure FormCreate(Sender: TObject); procedure btnOpenClick(Sender: TObject); procedure btnPlayClick(Sender: TObject); procedure btnPauseClick(Sender: TObject); procedure chkLoopClick(Sender: TObject); procedure btnDeleteClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} uses bass; var hs:HSTREAM; //流句柄 //Open procedure TForm1.btnOpenClick(Sender: TObject); var soundPath:AnsiString; str:string; time:Double; timeStr:String; hour:Integer; minute:Integer; second:Integer; begin dlgOpen1.Filter:='Mp3 File(*.mp3)|*.mp3|Wav File(*.wav)|*wav' ; if dlgOpen1.Execute then soundPath:=AnsiString(dlgOpen1.FileName); BASS_StreamFree(hs); hs:=BASS_StreamCreateFile(False,PAnsiChar(soundPath),0,0,0); //创建播放流,第一个参数False为从文件载入,true从内存载入。第二个参数为文件名或内存流的指针 edt1.Text:=ExtractFileName(soundPath);//edt1用来显示读取的文件名 if hs < BASS_ERROR_ENDED then //判断打开是否失败 begin ShowMessage('Open '+soundPath+' fail!'); Exit; end; time:=BASS_ChannelBytes2Seconds(hs,BASS_ChannelGetLength(hs,BASS_POS_BYTE)); //获取音频的总时间,BAss_Channel2Seconds根据流的指针位置来获取时间点, 单位是秒, //BASS_ChannelGetLength是获取文件流的长度,BASS_ChannelGetPosition是获得指针的位置 hour:=Trunc(time/3600); time:=time-hour*3600; minute:=Trunc(time/60); time:=time-minute*60; second:=Trunc(time); timeStr:=Format('%.2d',[hour])+':'+Format('%.2d',[minute])+':'+Format('%.2d',[second]); lbl1.Caption:='Total Time: '+timeStr; end; //Play procedure TForm1.btnPlayClick(Sender: TObject); begin BASS_ChannelPlay(hs,False); end; //Pause procedure TForm1.btnPauseClick(Sender: TObject); begin BASS_ChannelPause(hs); end; procedure TForm1.btnDeleteClick(Sender: TObject); begin BASS_StreamFree(hs); //释放流 edt1.Text:='No Audio'; end; procedure TForm1.chkLoopClick(Sender: TObject); begin if chkLoop.Checked then BASS_ChannelFlags(hs, BASS_SAMPLE_LOOP, BASS_SAMPLE_LOOP) else BASS_ChannelFlags(hs, 0, BASS_SAMPLE_LOOP); end; //IS Loop procedure TForm1.FormCreate(Sender: TObject); var i:Integer; info: BASS_DEVICEINFO; begin edt1.Text:='No Audio'; if HiWord(BASS_GetVersion) <> BASSVERSION then ShowMessage('The Bass.dll version is not available'); if not BASS_Init(-1, 44100, 0, 0, nil) then ShowMessage('Initial Error!'); end; end.
相关文章推荐
- 用多媒体库 Bass.dll 播放 mp3 [2] - BASS_GetDeviceInfo: 获取当前音频输出设备列表
- VB中利用QUARTZ.DLL播放视音频的实现
- 利用ALSA插件将5.1通道音频通过2通道立体声卡播放的配置(.asoundrc配置文件)
- 利用mciSendString播放音频
- 【iOS-Cocos2d游戏开发之十四】音频/音效/视频播放(利用Cocos2D-iPhone-Extensions嵌入Cocos2d进行视频播放!)
- WinCE 下利用CoreDll.dll 播放声音(C#)
- Qt音频利用Phonon实现简单的音频播放
- 【Delphi】从内存(MemoryStream)使用WMP(WindowsMediaPlayer)控件播放视频音频(Play Video with WMP from MemoryStream)
- delphi数字签名验证及能够获取数字签名文件信息(利用wintrust.dll的导出函数,翻译一下)
- 用多媒体库 Bass.dll 播放 mp3 [14] - 频率均衡器
- Android编程中利用AudioTrack播放PCM数据在音频的最后出现重复回声现象的解决方案
- 利用高通Vuforia、Unity 实现AR识别图触发音频播放
- 【iOS-Cocos2d游戏开发之十四】音频/音效/视频播放(利用Cocos2D-iPhone-Extensions嵌入Cocos2d进行视频播放!)
- WinCE 下利用CoreDll.dll 播放声音
- java利用ffmpeg将amr格式转化成mp3后无法播放音频
- 【Cocos2d游戏开发之十四】音频/音效/视频播放(利用Cocos2D-iPhone-Extensions嵌入Cocos2d进行视频播放!)
- 用多媒体库 Bass.dll 播放 mp3 [12] - 绘制动态频谱 FFT
- 【iOS-Cocos2d游戏开发之十四】音频/音效/视频播放(利用Cocos2D-iPhone-Extensions嵌入Cocos2d进行视频播放!)
- 【iOS录音与播放】实现利用音频队列,通过缓存进行对声音的采集与播放