• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Sử dụng thư viện BASS để viết phần mềm Play Media!

Các bài viết hướng dẫn và tham khảo chung, không thuộc ngôn ngữ nào

Moderator: vietluyen

User avatar
Kasper
Guru
Guru
Posts: 1063
Joined: Fri 16/05/2008 10:54 am
Has thanked: 2 times
Been thanked: 76 times
Contact:

Sử dụng thư viện BASS để viết phần mềm Play Media!

Postby Kasper » Mon 14/12/2009 4:10 pm

Lâu rồi mới trở lại 4rum. Loạt bài viết sau đây sẽ hướng dẫn những bạn yêu thích âm nhạc muốn code riêng cho mình một soft play media mà phân vân không biết dùng công cụ nào.
Chắc các bạn cũng đã biết đến thư viện âm thanh nổi tiếng BASS? Có nhiều cách để viết một phần mềm nghe nhạc, nhưng mình thích sử dụng thư viện BASS. Tại sao mình lại thích? Các bạn thử làm một lần đi sẽ biết :D

Thôi ta vào phần chính đây.

I. PHẦN 1: TẠO CLASS AUDIO SỬ DỤNG THƯ VIỆN BASS ĐỂ PLAY, PAUSE VÀ STOP.

1. Yêu cầu: tối thiểu phải có các dll sau: bass.dll, Bass.Net.dll, basswma.dll. Các bạn yên tâm, 3 dll này tổng dung lượng chỉ có tầm 590 KB thôi.
2. Ngôn ngữ lập trình trong phần hướng dẫn này tôi sẽ dùng C# (vì đang học thêm C# nên lấy làm luôn :D )
3. Phân tích: Một class audio thì bao gồm nhưng gì? Tạm thời tôi phân tích như thế này:
- Type: dùng để phân biệt các dạng audio như: mp3, windows media (wma), ...
- Stream: là handle của một file audio, ta sẽ quản lý nó trên cái này.
- Length: chiều dài file audio, ta sẽ chuyển về đơn vị tính là giây, cách chuyển sẽ giới thiệu sau.
- Position: vị trí hiện tại đang play.
- Volume: cái này sẽ đề cập sau.
- IsPause: đang play hay đang pause
- Name: tên và phần mở rộng của file audio, không bao gồm đường dẫn thư mục chứa nó.
- Filename: full path của một file audio
- Play
- Pause
- Stop

Sau khi phân tích như thế ta xây dựng class. Tạo một class, references thư viện BassNet.dll vào class.

Các thư viện cần dùng
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using Un4seen.Bass;
  5. using Bass = Un4seen.Bass.Bass;
  6.  


Loại audio:
[csharp]
public enum AudioType
{
Windows = 1,
MP3 = 2,
Other = 3,
}
private AudioType _Type;
public AudioType Type
{
get
{
return _Type;
}
set
{
_Type = value;
}
}
[/csharp]

- Thuộc tính Stream
[csharp]
private int _Stream;
public int Stream
{
get
{
return _Stream;
}
set
{
_Stream = value;
}
}
[/csharp]

- Thuộc tính IsPause
[csharp]
private bool _Pause;
public bool IsPause
{
get
{
return _Pause;
}
set
{
_Pause = value;
}
}
[/csharp]

- Length và Position
[csharp]
private int _Length;
public int Length
{
get
{
if (this.Stream != 0)
{
long len = Bass.BASS_ChannelGetLength (this.Stream ); // Lấy chiều dài
_Length =(int)Bass.BASS_ChannelBytes2Seconds (this.Stream,len); // Đổi chiều dài sang giây.
}
return _Length;
}
}

private int _Position;
public int Position
{
get
{
if (this.Stream != 0)
{
long pos = Bass.BASS_ChannelGetPosition(this.Stream); // Lấy vị trí
_Position = (int)Bass.BASS_ChannelBytes2Seconds(this.Stream, pos);
}
return _Position;
}
set
{
if (this.Stream != 0)
{
Bass.BASS_ChannelSetPosition(this.Stream, Bass.BASS_ChannelSeconds2Bytes(this.Stream, value));
_Position = value;
}
}
}
[/csharp]

- Name và Filename
[csharp]
private string _File;
public string File
{
get
{
return _File;
}
set
{
_File = value;
}
}

private string _Name;
public string Name
{
get
{
return _Name;
}
set
{
_Name = value;
}
}
[/csharp]

Các method:
1. Constructor
[csharp]
public Audio()
{
}

public Audio(string sFileName)
{
this.File = sFileName;
this.Name = System.IO.Path.GetFileName(sFileName);
string sType = System.IO.Path.GetExtension(sFileName); // Lấy phần mở rộng để xếp loại audio
switch (sType) // Khởi tạo file audio theo từng loại.
{
case ".wma":
this.Type = AudioType.Windows ;
this.Stream = Un4seen.Bass.AddOn.Wma.BassWma.BASS_WMA_StreamCreateFile(this.File , 0, 0, Un4seen.Bass.BASSFlag.BASS_SAMPLE_FLOAT);
break;
case ".mp3":
this.Type = AudioType.MP3;
this.Stream = Bass.BASS_StreamCreateFile(this.File, 0, 0, Un4seen.Bass.BASSFlag.BASS_DEFAULT);
break;
default :
this.Type = AudioType.Other;
this.Stream = Bass.BASS_StreamCreateFile(this.File, 0, 0, Un4seen.Bass.BASSFlag.BASS_SAMPLE_FLOAT);
break;
}
}
[/csharp]

2. Các method: Play, Pause và Stop.
[csharp]
public void Pause()
{
this.IsPause = !this.IsPause;
if (this.IsPause)
{
if (this.Stream != 0) Bass.BASS_ChannelPause(this.Stream);
}
else
{
if (this.Stream != 0) Bass.BASS_ChannelPlay(this.Stream, false);
}
}
public void Play()
{
if (this.Stream != 0)
{
Bass.BASS_ChannelPlay(this.Stream, false);
this.IsPause = false;
}
}
public void Stop()
{
if (this.Stream != 0)
{
Bass.BASS_ChannelStop(this.Stream);
Bass.BASS_SampleFree(this.Stream);
this.IsPause = false;
}
}
[/csharp]

Xây dựng xong lớp audio thì cơ bản là ta đã có thể chơi nhạc được rồi. Tiếp theo ta làm một cái demo nho nhỏ để xem sao nhé:
Tạo một form, add 4 button và 1 textbox, 1 openFileDialog.

1. Khởi tạo thư viện BASS để có thể play: trong form load
[csharp]
private void Form1_Load(object sender, EventArgs e)
{
if (false == Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_DEFAULT, this.Handle, null))
{
MessageBox.Show ("Lỗi xảy ra khi khởi tạo BASS!");
System.Environment.Exit(0); // Nếu khởi tạo không được thì thoát luôn.
}

}
[/csharp]
2. Code cho button Browser file:
[csharp]
private void button1_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = "MP3 Files (*.mp3)|*.mp3|All Files (*.*)|*.*";
openFileDialog1.ShowDialog() ;
textBox1.Text = openFileDialog1.FileName;
}
[/csharp]

3. Code nút Play:
[csharp]
private void button2_Click(object sender, EventArgs e)
{
if (textBox1.Text != "")
{
m_Audio = new Audio(textBox1.Text);
m_Audio.Play();
button3.Enabled = true;
button4.Enabled = true;
}
}
[/csharp]

4. Code nút Pause:
[csharp]
private void button3_Click(object sender, EventArgs e)
{
m_Audio.Pause();
}
[/csharp]

5. Code nút Stop:
[csharp]
private void button4_Click(object sender, EventArgs e)
{
m_Audio.Stop();
button3.Enabled = false ;
button4.Enabled = false ;
}
[/csharp]

Vậy là ta đã có một audio player rồi, cực kỳ dễ với thư viện BASS phải không nè. Những bài viết tiếp theo tôi sẽ giới thiệu tiếp những việc như: Seek đến 1 vị trí, tăng giảm volume và đặc biệt là chôm Visualization của WMP để xài cho soft mình :D


Lưu ý: thư viện BASS free nhưng sẽ hiện Splash Screen. Cũng chả sao phải không nào :D
Và đây là thư viện BASS, class audio và demo nhỏ.
Attachments
AudioPlayer.zip
(328.52 KiB) Downloaded 1233 times


Lành tợ tòng, ác tợ hoa,
Nhà hòa muôn việc đều nên.

User avatar
Kasper
Guru
Guru
Posts: 1063
Joined: Fri 16/05/2008 10:54 am
Has thanked: 2 times
Been thanked: 76 times
Contact:

Re: Sử dụng thư viện BASS để viết phần mềm Play Media!

Postby Kasper » Wed 16/12/2009 12:05 pm

II. SEEK, VOLUME VÀ VISUALIZATION
1. Tăng giảm Volume và Seek đến một vị trí bất kỳ
Để tiện cho việc này, tôi xin giới thiệu bộ control KMPControl bao gồm các control sau:
- KasButton: thiết kế nút có 3 trạng thái: Unclick, Click và Mouse move over.
- KasLabel: dùng cho việc chạy chữ, cần thiết khi code 1 soft AudioPlayer.
- KasTrackBar: dùng cho cả việc thể hiện vị trí hiện tại và volume: Sử dụng các thuộc tính bắt đầu = Image.... để thiết kế cho mình 1 trackbar như ý muốn.
- KasSpectrum: thể hiện Spectrum
Bộ control này sẽ được đính kèm theo.

a. Tăng giảm volume: thêm thuộc tính volume vào class Audio. Tôi đề xuất đưa độ âm thanh về đoạn [0,100] để ta dễ dàng quản lý.
  1.         private long  _Volume;
  2.         public long  Volume
  3.         {
  4.             set
  5.             {
  6.                 if (this.Stream != 0)
  7.                 {
  8.                     Bass.BASS_ChannelSetAttribute(this.Stream, Un4seen.Bass.BASSAttribute.BASS_ATTRIB_VOL, value  / 100.0F);
  9.                     _Volume = value;
  10.                 }
  11.             }
  12.         }
  13.  


Trong form kéo thả một KasTrackbar, name: kasVolume, Value: 50, Maimie: 100
Để set volume ta chỉ cần code :
[csharp]
m_Audio.Volume = kasVolume.Value;
[/csharp]

Code trong event Seek:
[csharp]
private void kasVolume_Seek(object sender, KMPControl.KasTrackBar.SeekEventArgs e)
{
if (m_Audio.Stream != 0) m_Audio.Volume = kasVolume.Value;
}
[/csharp]

b. Seek vị trí: thêm thuộc tính Position cho class Audio
[csharp]
private long _Position;
public long Position
{
get
{
if (this.Stream != 0)
{
long pos = Bass.BASS_ChannelGetPosition(this.Stream);
_Position = (long)Bass.BASS_ChannelBytes2Seconds(this.Stream, pos);
}
return _Position;
}
set
{
if (this.Stream != 0)
{
Bass.BASS_ChannelSetPosition(this.Stream, Bass.BASS_ChannelSeconds2Bytes(this.Stream, value));
_Position = value;
}
}
}
[/csharp]

Trong form kéo thả một KasTrackBar, name: kasSeek, Value: 0, Maximize: 1. 1 Timer, name: tmrSeek, Enable: False, Interval: 100

Code trong event của timer:
[csharp]
private void tmrSeek_Tick(object sender, EventArgs e)
{
long len = m_Audio.Length ; // lấy chiều dài bài hát
long pos = m_Audio.Position ; // lấy vị trí hiện tại

if (len <= 0) return;
kasSeek.Value = pos; // set vị trí thanh seek = vị trí hiện tại của bài hát.
if (pos >= len)
{
// Next bài kế nếu có
pos = 0;
}
}
[/csharp]

Code trong event Seek của kasSeek để cho phép người dùng seek đến 1 vị trí bất kỳ:
[csharp]
private void kasSeek_Seek(object sender, KMPControl.KasTrackBar.SeekEventArgs e)
{
m_Audio.Position = kasSeek.Value;
}
[/csharp]

Trong event của các button Play, Pause, Stop thì set thuộc tính Enable của timer cho phù hợp là xong.

Phần thể hiện thời gian của bài hát, các bạn xem trong soft, cũng không có gì khó. Thôi đói bụng quá đi ăn cơm cái đã, chiều nay làm tiếp phần Visualization và gởi source lên luôn :D
Lành tợ tòng, ác tợ hoa,
Nhà hòa muôn việc đều nên.

User avatar
Kasper
Guru
Guru
Posts: 1063
Joined: Fri 16/05/2008 10:54 am
Has thanked: 2 times
Been thanked: 76 times
Contact:

Re: Sử dụng thư viện BASS để viết phần mềm Play Media!

Postby Kasper » Wed 16/12/2009 1:50 pm

Hồi nãy còn quên một việc, đó là chạy chữ tên bài hát: cái này thì đơn giản, chỉ cần kéo thả 1 kasLabel vào, set thuộc tính Text là tên bài hát, rồi set thuộc tính Setnable = True là xong.

2. Visualization: phần mềm nghe nhạc mà thiếu cái này sẽ rất buồn chán :D
- Thư viện: Bass_vis.dll
- Control: 1 picture và 1 menustrip. Picture để play visualization còn menustrip để chọn loại (nếu có nhiều), trong phần này tôi cho random, các bạn có thể code theo ý của mình.
- Code:

+ Thuộc tính Visualization để biết có sử dụng hay không?
  1.         private bool _Visualization;
  2.         public bool Visualization
  3.         {
  4.             get
  5.             {
  6.                 return _Visualization;
  7.             }
  8.             set
  9.             {
  10.                 _Visualization = value;
  11.             }
  12.         }
  13.  


+ VisIndex: mục visuallization nào được chọn
[csharp]
private int _VisIndex;
public int VisIndex
{
get
{
return _VisIndex;
}
set
{
_VisIndex = value;
}
}
[/csharp]

+ Tham số VisParam
[csharp]
private Un4seen.Bass.AddOn.Vis.BASS_VIS_PARAM _VisParam;
public Un4seen.Bass.AddOn.Vis.BASS_VIS_PARAM VisParam
{
get
{
return _VisParam;
}
set
{
_VisParam = value;
}
}
[/csharp]

+ Method: lấy visuallization của Windows Media Player. BASS hỗ trợ nhiều dạng vis như của WMP, Winamp, ... ở đây tôi chỉ sử dụng của WMP. Sau khi lấy xong sẽ add vào menustrip.
[csharp]
public void GetVisualization(MenuStrip mnuVis)
{
int i = 0;
string[] VisList = null;
// Clear Visualization list
mnuVis.Items.Clear();
// Find out Visualization
VisList = BASSVIS.BASS_VIS_FindPlugins(Un4seen.Bass.AddOn.Vis.BASSVISPlugin.BASSVISKIND_WMP, string.Empty, false );
if ((VisList != null) & !string.IsNullOrEmpty(VisList[0]))
{
for (i = VisList.GetLowerBound(0); i <= VisList.GetUpperBound(0); i++)
{
mnuVis.Items.Add(VisList[i]);
}
// Lấy ngẫu nhiên 1 vis
Random ran =new Random() ;
this.VisIndex = ran.Next(mnuVis.Items.Count);
}
}
[/csharp]

+ Method: PlayVisuallization
[csharp]
private Un4seen.Bass.AddOn.Vis.BASS_VIS_INFO mInfos;
private Un4seen.Bass.AddOn.Vis.BASS_VIS_EXEC mExec;
private IntPtr VisWindowHandle ;
public void PlayVisualization( MenuStrip mnuVis, PictureBox picPlgSource)
{
int Counter = 0;
bool IsFree = false;

// Check if we have something selected on the list
if (this.VisParam == null)
{
//Me.VisParam = Nothing
this.VisParam = new Vis.BASS_VIS_PARAM(Vis.BASSVISPlugin.BASSVISKIND_WMP);
}

if (mnuVis.Items.Count > 0)
{
if (this.VisParam.VisHandle != 0)
{
if (this.VisParam.VisHandle != 0)
{
BASSVIS.BASS_VIS_Free(this.VisParam);
while (!((IsFree == true) | (Counter == 250)))
{
IsFree = BASSVIS.BASS_VIS_IsFree(this.VisParam);
Application.DoEvents();
Counter += 1;
}
IsFree = false;
this.VisParam.VisHandle = 0;
}
//Clear the image
picPlgSource.Image = null;
}
// Create our new plugin
if (this.Stream != 0)
{
if (mInfos == null)
{
mInfos = new Vis.BASS_VIS_INFO(this.Name, this.File);
}
{
mInfos.Channels = 2;
mInfos.BitRate = 44100;
mInfos.SongTitle = this.Name;
}
BASSVIS.BASS_VIS_SetInfo(this.VisParam, mInfos);
if (mExec == null)
{
//mExec = new Vis.BASS_VIS_EXEC( Vis.BASSVISPlugin.BASSVISKIND_WMP);
mExec = new Vis.BASS_VIS_EXEC(mnuVis.Items [this.VisIndex].Text );
}

mExec.WMP_PluginIndex = this.VisIndex;
//1 'IndexNum ' Thay doi Vis o day
mExec.WMP_PresetIndex = 0;
//VisModules.SelectedIndex
mExec.WMP_SrcVisHandle = picPlgSource.Handle;
mExec.Left = 0;
mExec.Top = 0;
mExec.Width = picPlgSource.Width;
mExec.Height = picPlgSource.Height;
BASSVIS.BASS_VIS_ExecutePlugin(mExec, this.VisParam);
VisWindowHandle = this.VisParam.VisWinHandle;

if (this.VisParam.VisHandle != 0)
{
BASSVIS.BASSVIS_SetModulePreset(this.VisParam, 0);
BASSVIS.BASS_VIS_SetPlayState(this.VisParam, Vis.BASSVISPlayState.Play);
if (this.Stream != 0)
{
BASSVIS.BASS_VIS_RenderChannel(this.VisParam, this.Stream);
}
}
}
}
}
[/csharp]

+ Method: stop vis.
[csharp]
public void StopVisualization(PictureBox pic)
{
if (this.VisParam.VisHandle != 0 | this.VisParam.Kind != 0)
{
BASSVIS.BASS_VIS_Quit(this.VisParam);
pic.Image = null;
}
}
[/csharp]

Trong form tạo một picture name: picPlgSource, code trong event của button Play:
[csharp]
// Khoi tao va play Visualization
BASSVIS.BASS_VIS_Init(Vis.BASSVISPlugin.BASSVISKIND_WMP, System.Runtime.InteropServices.Marshal.GetHINSTANCE(typeof(Application).Module), this.Handle);
m_Audio.Visualization = true;
m_Audio.GetVisualization(mnuVis); // lấy vis
m_Audio.PlayVisualization(mnuVis, picPlgSource); // play vis
[/csharp]

Để stop vis, ta mở lại class audio và code lại hàm Stop: thêm đoạn code stop vis này vô.
[csharp]
if (this.Visualization)
{
BASSVIS.BASS_VIS_SetPlayState(this.VisParam, Vis.BASSVISPlayState.Stop);
BASSVIS.BASS_VIS_Free(this.VisParam);
BASSVIS.BASS_VIS_Quit(this.VisParam);
this.Visualization = false;
}
[/csharp]

Tương tự cho hàm Pause trong class audio
[csharp]
public void Pause()
{
this.IsPause = !this.IsPause;
if (this.IsPause)
{
if (this.Stream != 0) Bass.BASS_ChannelPause(this.Stream);
if (this.Visualization)
{
BASSVIS.BASS_VIS_SetPlayState(this.VisParam, Vis.BASSVISPlayState.Pause);
}
}
else
{
if (this.Stream != 0) Bass.BASS_ChannelPlay(this.Stream, false);
if (this.Visualization)
{
BASSVIS.BASS_VIS_SetPlayState(this.VisParam, Vis.BASSVISPlayState.Play );
}
}
}
[/csharp]

Như vậy là ta đã xây dựng xong một phần mềm nghe nhạc rồi :D , việc còn lại là xử lý thêm cho chương trình chơi nhiều bài hát -> các bạn tự code nhé.

Xem hình demo và code tôi gởi kèm theo bao gồm cả các dll cần thiết. Gởi tặng thêm các bạn vài cái visualization sưu tầm được :D

Chúc các bạn có những phút giây thư giãn thích thú với phần mềm nghe nhạc của chính mình. :D

Hẹn gặp lại bài sau sẽ viết về play video file.
Attachments
KasperAudioPlayer.gif
AudioPlayer.zip
(646.68 KiB) Downloaded 1044 times
Visualizations.zip
(764.32 KiB) Downloaded 1060 times
Lành tợ tòng, ác tợ hoa,
Nhà hòa muôn việc đều nên.

wazeemhaj22
Posts: 6
Joined: Wed 06/01/2010 9:11 pm

Re: Sử dụng thư viện BASS để viết phần mềm Play Media!

Postby wazeemhaj22 » Wed 06/01/2010 9:52 pm

cái này có thể chuyển qua visual studio 2005 được không vậy pro
vb.net ấy
mình mới bắt đầu học vb nên muôn nghiên cứu :(

User avatar
Kasper
Guru
Guru
Posts: 1063
Joined: Fri 16/05/2008 10:54 am
Has thanked: 2 times
Been thanked: 76 times
Contact:

Re: Sử dụng thư viện BASS để viết phần mềm Play Media!

Postby Kasper » Thu 07/01/2010 8:31 am

wazeemhaj22 wrote:cái này có thể chuyển qua visual studio 2005 được không vậy pro
vb.net ấy
mình mới bắt đầu học vb nên muôn nghiên cứu :(


Chuyển được hết. Bạn thử chuyển đi, cái nào khó khăn post lên mình hướng dẫn thêm. :D
Lành tợ tòng, ác tợ hoa,
Nhà hòa muôn việc đều nên.

vinhquangict
Posts: 5
Joined: Thu 02/12/2010 9:25 am

Re: Sử dụng thư viện BASS để viết phần mềm Play Media!

Postby vinhquangict » Mon 29/08/2011 1:28 pm

ai biết code Bass trong linux không chỉ mình với

vinhquangict
Posts: 5
Joined: Thu 02/12/2010 9:25 am

Re: Sử dụng thư viện BASS để viết phần mềm Play Media!

Postby vinhquangict » Wed 07/09/2011 4:27 pm

bạn ơi cái này trên c# mà, mình hỏi trên linux ấy một ứng dụng mp3 command line trên linux bạn biết không chỉ mình với?


Return to “Bài viết hướng dẫn”

Who is online

Users browsing this forum: No registered users and 1 guest