• 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

Điều hành viên: vietluyen

Hình đại diện của người dùng
Kasper
Guru
Guru
Bài viết: 1062
Ngày tham gia: T.Sáu 16/05/2008 10:54 am
Has thanked: 2 time
Been thanked: 76 time
Liên hệ:

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

Gửi bàigửi bởi Kasper » T.Hai 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:
  1.         public enum AudioType
  2.         {
  3.             Windows = 1,
  4.             MP3 = 2,
  5.             Other = 3,
  6.         }
  7.         private AudioType _Type;
  8.         public AudioType Type
  9.         {
  10.             get
  11.             {
  12.                 return _Type;
  13.             }
  14.             set
  15.             {
  16.                 _Type = value;
  17.             }
  18.         }
  19.  


- Thuộc tính Stream
  1.         private int  _Stream;
  2.         public int Stream
  3.         {
  4.             get
  5.             {
  6.                 return _Stream;
  7.             }
  8.             set
  9.             {
  10.                 _Stream = value;
  11.             }
  12.         }
  13.  


- Thuộc tính IsPause
  1.         private bool  _Pause;
  2.         public bool  IsPause
  3.         {
  4.             get
  5.             {
  6.                 return _Pause;
  7.             }
  8.             set
  9.             {
  10.                 _Pause = value;
  11.             }
  12.         }
  13.  


- Length và Position
  1. private int  _Length;
  2.         public  int Length
  3.         {
  4.             get
  5.             {
  6.                 if (this.Stream != 0)
  7.                 {
  8.                     long len = Bass.BASS_ChannelGetLength (this.Stream ); // Lấy chiều dài
  9.                     _Length =(int)Bass.BASS_ChannelBytes2Seconds (this.Stream,len); // Đổi chiều dài sang giây.
  10.                 }
  11.                 return _Length;
  12.             }
  13.         }
  14.  
  15.         private int _Position;
  16.         public int Position
  17.         {
  18.             get
  19.             {
  20.                 if (this.Stream != 0)
  21.                 {
  22.                     long pos = Bass.BASS_ChannelGetPosition(this.Stream); // Lấy vị trí
  23.                     _Position = (int)Bass.BASS_ChannelBytes2Seconds(this.Stream, pos);
  24.                 }
  25.                 return _Position;
  26.             }
  27.             set
  28.             {
  29.                 if (this.Stream != 0)
  30.                 {
  31.                     Bass.BASS_ChannelSetPosition(this.Stream, Bass.BASS_ChannelSeconds2Bytes(this.Stream, value));
  32.                     _Position = value;
  33.                 }
  34.             }
  35.         }
  36.  


- Name và Filename
  1.         private string _File;
  2.         public string File
  3.         {
  4.             get
  5.             {
  6.                 return _File;
  7.             }
  8.             set
  9.             {
  10.                 _File = value;
  11.             }
  12.         }
  13.  
  14.         private string _Name;
  15.         public string Name
  16.         {
  17.             get
  18.             {
  19.                 return _Name;
  20.             }
  21.             set
  22.             {
  23.                 _Name = value;
  24.             }
  25.         }
  26.  


Các method:
1. Constructor
  1.         public Audio()
  2.         {
  3.         }
  4.  
  5.         public Audio(string sFileName)
  6.         {
  7.             this.File = sFileName;
  8.             this.Name = System.IO.Path.GetFileName(sFileName);
  9.             string sType = System.IO.Path.GetExtension(sFileName); // Lấy phần mở rộng để xếp loại audio
  10.             switch (sType) // Khởi tạo file audio theo từng loại.
  11.             {
  12.                 case ".wma":
  13.                     this.Type = AudioType.Windows ;
  14.                     this.Stream = Un4seen.Bass.AddOn.Wma.BassWma.BASS_WMA_StreamCreateFile(this.File , 0, 0, Un4seen.Bass.BASSFlag.BASS_SAMPLE_FLOAT);
  15.                     break;
  16.                 case ".mp3":
  17.                     this.Type = AudioType.MP3;
  18.                     this.Stream = Bass.BASS_StreamCreateFile(this.File, 0, 0, Un4seen.Bass.BASSFlag.BASS_DEFAULT);
  19.                     break;
  20.                 default :
  21.                     this.Type = AudioType.Other;
  22.                     this.Stream = Bass.BASS_StreamCreateFile(this.File, 0, 0, Un4seen.Bass.BASSFlag.BASS_SAMPLE_FLOAT);
  23.                     break;
  24.             }
  25.         }
  26.  


2. Các method: Play, Pause và Stop.
  1. public void Pause()
  2.         {
  3.             this.IsPause = !this.IsPause;
  4.             if (this.IsPause)
  5.             {
  6.                 if (this.Stream != 0) Bass.BASS_ChannelPause(this.Stream);
  7.             }
  8.             else
  9.             {
  10.                 if (this.Stream != 0) Bass.BASS_ChannelPlay(this.Stream, false);                
  11.             }
  12.         }
  13.         public void Play()
  14.         {
  15.             if (this.Stream != 0)
  16.             {
  17.                 Bass.BASS_ChannelPlay(this.Stream, false);
  18.                 this.IsPause = false;
  19.             }
  20.         }
  21.         public void Stop()
  22.         {
  23.             if (this.Stream != 0)
  24.             {
  25.                 Bass.BASS_ChannelStop(this.Stream);
  26.                 Bass.BASS_SampleFree(this.Stream);
  27.                 this.IsPause = false;
  28.             }
  29.         }
  30.  


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
  1.         private void Form1_Load(object sender, EventArgs e)
  2.         {
  3.             if (false == Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_DEFAULT, this.Handle, null))
  4.             {
  5.                 MessageBox.Show ("Lỗi xảy ra khi khởi tạo BASS!");
  6.                 System.Environment.Exit(0); // Nếu khởi tạo không được thì thoát luôn.
  7.             }
  8.  
  9.         }
  10.  

2. Code cho button Browser file:
  1.         private void button1_Click(object sender, EventArgs e)
  2.         {
  3.             openFileDialog1.Filter = "MP3 Files (*.mp3)|*.mp3|All Files (*.*)|*.*";
  4.             openFileDialog1.ShowDialog() ;
  5.             textBox1.Text = openFileDialog1.FileName;
  6.         }
  7.  


3. Code nút Play:
  1.         private void button2_Click(object sender, EventArgs e)
  2.         {
  3.             if (textBox1.Text != "")
  4.             {
  5.                 m_Audio  = new  Audio(textBox1.Text);
  6.                 m_Audio.Play();
  7.                 button3.Enabled = true;
  8.                 button4.Enabled = true;
  9.             }
  10.         }
  11.  


4. Code nút Pause:
  1.         private void button3_Click(object sender, EventArgs e)
  2.         {
  3.             m_Audio.Pause();
  4.         }
  5.  


5. Code nút Stop:
  1.         private void button4_Click(object sender, EventArgs e)
  2.         {
  3.             m_Audio.Stop();
  4.             button3.Enabled = false ;
  5.             button4.Enabled = false ;
  6.         }
  7.  


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ỏ.
Tập tin đính kèm
AudioPlayer.zip
(328.52 KiB) Đã tải 1168 lần


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

Hình đại diện của người dùng
Kasper
Guru
Guru
Bài viết: 1062
Ngày tham gia: T.Sáu 16/05/2008 10:54 am
Has thanked: 2 time
Been thanked: 76 time
Liên hệ:

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

Gửi bàigửi bởi Kasper » T.Tư 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 :
  1. m_Audio.Volume = kasVolume.Value;
  2.  


Code trong event Seek:
  1.         private void kasVolume_Seek(object sender, KMPControl.KasTrackBar.SeekEventArgs e)
  2.         {
  3.             if (m_Audio.Stream != 0) m_Audio.Volume = kasVolume.Value;
  4.         }
  5.  


b. Seek vị trí: thêm thuộc tính Position cho class Audio
  1.         private long  _Position;
  2.         public long  Position
  3.         {
  4.             get
  5.             {
  6.                 if (this.Stream != 0)
  7.                 {
  8.                     long pos = Bass.BASS_ChannelGetPosition(this.Stream);
  9.                     _Position = (long)Bass.BASS_ChannelBytes2Seconds(this.Stream, pos);
  10.                 }
  11.                 return _Position;
  12.             }
  13.             set
  14.             {
  15.                 if (this.Stream != 0)
  16.                 {
  17.                     Bass.BASS_ChannelSetPosition(this.Stream, Bass.BASS_ChannelSeconds2Bytes(this.Stream, value));
  18.                     _Position = value;
  19.                 }
  20.             }
  21.         }
  22.  


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:
  1.         private void tmrSeek_Tick(object sender, EventArgs e)
  2.         {
  3.             long len = m_Audio.Length ; // lấy chiều dài bài hát
  4.             long pos = m_Audio.Position ; // lấy vị trí hiện tại
  5.                                
  6.             if (len <= 0) return;
  7.             kasSeek.Value = pos; // set vị trí thanh seek = vị trí hiện tại của bài hát.
  8.             if (pos >= len)
  9.             {
  10.                 // Next bài kế nếu có
  11.                 pos = 0;
  12.             }
  13.         }
  14.  


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


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.

Hình đại diện của người dùng
Kasper
Guru
Guru
Bài viết: 1062
Ngày tham gia: T.Sáu 16/05/2008 10:54 am
Has thanked: 2 time
Been thanked: 76 time
Liên hệ:

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

Gửi bàigửi bởi Kasper » T.Tư 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
  1.         private int _VisIndex;
  2.         public int VisIndex
  3.         {
  4.             get
  5.             {
  6.                 return _VisIndex;
  7.             }
  8.             set
  9.             {
  10.                 _VisIndex = value;
  11.             }
  12.         }
  13.  


+ Tham số VisParam
  1.         private Un4seen.Bass.AddOn.Vis.BASS_VIS_PARAM _VisParam;
  2.         public Un4seen.Bass.AddOn.Vis.BASS_VIS_PARAM VisParam
  3.         {
  4.             get
  5.             {
  6.                 return _VisParam;
  7.             }
  8.             set
  9.             {
  10.                 _VisParam = value;
  11.             }
  12.         }
  13.  


+ 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.
  1.         public void GetVisualization(MenuStrip mnuVis)
  2.         {
  3.             int i = 0;
  4.             string[] VisList = null;
  5.             // Clear Visualization list
  6.             mnuVis.Items.Clear();
  7.             // Find out Visualization
  8.             VisList = BASSVIS.BASS_VIS_FindPlugins(Un4seen.Bass.AddOn.Vis.BASSVISPlugin.BASSVISKIND_WMP, string.Empty, false );
  9.             if ((VisList != null) & !string.IsNullOrEmpty(VisList[0]))
  10.             {
  11.                 for (i = VisList.GetLowerBound(0); i <= VisList.GetUpperBound(0); i++)
  12.                 {
  13.                     mnuVis.Items.Add(VisList[i]);
  14.                 }
  15.                 // Lấy ngẫu nhiên 1 vis
  16.                 Random ran =new Random() ;
  17.                 this.VisIndex = ran.Next(mnuVis.Items.Count);
  18.             }
  19.         }
  20.  


+ Method: PlayVisuallization
  1.         private Un4seen.Bass.AddOn.Vis.BASS_VIS_INFO mInfos;
  2.         private Un4seen.Bass.AddOn.Vis.BASS_VIS_EXEC mExec;
  3.         private IntPtr  VisWindowHandle ;
  4.         public void PlayVisualization( MenuStrip mnuVis,  PictureBox picPlgSource)
  5.         {
  6.             int Counter = 0;
  7.             bool IsFree = false;
  8.  
  9.             // Check if we have something selected on the list
  10.             if (this.VisParam == null)
  11.             {
  12.                 //Me.VisParam = Nothing
  13.                 this.VisParam = new Vis.BASS_VIS_PARAM(Vis.BASSVISPlugin.BASSVISKIND_WMP);
  14.             }
  15.  
  16.             if (mnuVis.Items.Count > 0)
  17.             {
  18.                 if (this.VisParam.VisHandle != 0)
  19.                 {
  20.                     if (this.VisParam.VisHandle != 0)
  21.                     {
  22.                         BASSVIS.BASS_VIS_Free(this.VisParam);
  23.                         while (!((IsFree == true) | (Counter == 250)))
  24.                         {
  25.                             IsFree = BASSVIS.BASS_VIS_IsFree(this.VisParam);
  26.                             Application.DoEvents();
  27.                             Counter += 1;
  28.                         }
  29.                         IsFree = false;
  30.                         this.VisParam.VisHandle = 0;
  31.                     }
  32.                     //Clear the image
  33.                     picPlgSource.Image = null;
  34.                 }
  35.                 // Create our new plugin
  36.                 if (this.Stream != 0)
  37.                 {
  38.                     if (mInfos == null)
  39.                     {
  40.                         mInfos = new Vis.BASS_VIS_INFO(this.Name, this.File);
  41.                     }
  42.                     {
  43.                         mInfos.Channels = 2;
  44.                         mInfos.BitRate = 44100;
  45.                         mInfos.SongTitle = this.Name;
  46.                     }
  47.                     BASSVIS.BASS_VIS_SetInfo(this.VisParam, mInfos);
  48.                     if (mExec == null)
  49.                     {
  50.                         //mExec = new Vis.BASS_VIS_EXEC( Vis.BASSVISPlugin.BASSVISKIND_WMP);
  51.                         mExec = new Vis.BASS_VIS_EXEC(mnuVis.Items [this.VisIndex].Text );
  52.                     }
  53.  
  54.                     mExec.WMP_PluginIndex = this.VisIndex;
  55.                     //1 'IndexNum ' Thay doi Vis o day
  56.                     mExec.WMP_PresetIndex = 0;
  57.                     //VisModules.SelectedIndex
  58.                     mExec.WMP_SrcVisHandle = picPlgSource.Handle;
  59.                     mExec.Left = 0;
  60.                     mExec.Top = 0;
  61.                     mExec.Width = picPlgSource.Width;
  62.                     mExec.Height = picPlgSource.Height;
  63.                     BASSVIS.BASS_VIS_ExecutePlugin(mExec, this.VisParam);
  64.                     VisWindowHandle = this.VisParam.VisWinHandle;
  65.                    
  66.                     if (this.VisParam.VisHandle != 0)
  67.                     {
  68.                         BASSVIS.BASSVIS_SetModulePreset(this.VisParam, 0);
  69.                         BASSVIS.BASS_VIS_SetPlayState(this.VisParam, Vis.BASSVISPlayState.Play);
  70.                           if (this.Stream != 0)
  71.                         {
  72.                             BASSVIS.BASS_VIS_RenderChannel(this.VisParam, this.Stream);
  73.                         }
  74.                     }
  75.                 }
  76.             }
  77.         }
  78.  


+ Method: stop vis.
  1.         public void StopVisualization(PictureBox pic)
  2.         {
  3.             if (this.VisParam.VisHandle != 0 | this.VisParam.Kind != 0)
  4.             {
  5.                 BASSVIS.BASS_VIS_Quit(this.VisParam);
  6.                 pic.Image = null;
  7.             }
  8.         }
  9.  


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


Để 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ô.
  1.                     if (this.Visualization)
  2.                     {
  3.                         BASSVIS.BASS_VIS_SetPlayState(this.VisParam, Vis.BASSVISPlayState.Stop);
  4.                         BASSVIS.BASS_VIS_Free(this.VisParam);
  5.                         BASSVIS.BASS_VIS_Quit(this.VisParam);
  6.                         this.Visualization = false;
  7.                     }
  8.  


Tương tự cho hàm Pause trong class audio
  1.         public void Pause()
  2.         {
  3.             this.IsPause = !this.IsPause;
  4.             if (this.IsPause)
  5.             {
  6.                 if (this.Stream != 0) Bass.BASS_ChannelPause(this.Stream);
  7.                 if (this.Visualization)
  8.                 {
  9.                     BASSVIS.BASS_VIS_SetPlayState(this.VisParam, Vis.BASSVISPlayState.Pause);
  10.                 }
  11.             }
  12.             else
  13.             {
  14.                 if (this.Stream != 0) Bass.BASS_ChannelPlay(this.Stream, false);
  15.                 if (this.Visualization)
  16.                 {
  17.                     BASSVIS.BASS_VIS_SetPlayState(this.VisParam, Vis.BASSVISPlayState.Play );
  18.                 }
  19.             }
  20.         }
  21.  


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.
Tập tin đính kèm
KasperAudioPlayer.gif
AudioPlayer.zip
(646.68 KiB) Đã tải 989 lần
Visualizations.zip
(764.32 KiB) Đã tải 1004 lần
Lành tợ tòng, ác tợ hoa,
Nhà hòa muôn việc đều nên.

wazeemhaj22
Bài viết: 6
Ngày tham gia: T.Tư 06/01/2010 9:11 pm

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

Gửi bàigửi bởi wazeemhaj22 » T.Tư 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 :(

Hình đại diện của người dùng
Kasper
Guru
Guru
Bài viết: 1062
Ngày tham gia: T.Sáu 16/05/2008 10:54 am
Has thanked: 2 time
Been thanked: 76 time
Liên hệ:

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

Gửi bàigửi bởi Kasper » T.Năm 07/01/2010 8:31 am

wazeemhaj22 đã viết: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
Bài viết: 5
Ngày tham gia: T.Năm 02/12/2010 9:25 am

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

Gửi bàigửi bởi vinhquangict » T.Hai 29/08/2011 1:28 pm

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

vinhquangict
Bài viết: 5
Ngày tham gia: T.Năm 02/12/2010 9:25 am

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

Gửi bàigửi bởi vinhquangict » T.Tư 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?


Quay về “Bài viết hướng dẫn”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.1 khách