Trang 1 trên 1

NAudio - Thao tác với âm thanh

Đã gửi: CN 18/11/2012 3:16 pm
gửi bởi Uzumaki Naruto
Tên: NAudio
Loại: DLL
Ngôn ngữ lập trình: .NET
Tác giả: Sưu tầm
Chức năng: Play Wav, Play MP3, Lấy thông tin file âm thanh, set Volume chính,....


Có một bạn hỏi nhiều câu hỏi về thao tác với âm thanh, thì mình có post lên một vài cái code dùng API để thao tác. Mà có lẽ là dùng API để làm việc với âm thanh thì nó hơi dài dòng và cũng khó chịu cho các bạn mới làm quen nên mình lên Google tìm kiếm thì tìm được cái DLL này. Post lên diễn đàn để ai cần thao tác với âm thanh thì cũng dễ hơn.
Để tiện cho các bạn Demo thì mình cũng viết sẵn một cái code sử dụng NAudio để Play MP3, Lấy mức Volume hệ thống và điều chỉnh Volume hệ thống.

HƯỚNG DẪN ADD DLL VÀO PROJECT: (cần làm thì mới dùng được)
- Từ cửa số của Visual Studio, các bạn vào menu Projects, chọn Add Reference.
- Ở cửa sổ hiện ra bạn vào tab Browse, rồi nhấn nút Browse trỏ đến file NAudio.dll (sẽ có được khi bạn giải nén file mình đính kèm dưới đây), sau đó nhấn OK.

Đây là code demo như mình đã nói ở trên:
  1. Imports aud = NAudio.CoreAudioApi 'Bắt buộc
  2. Imports nwav = NAudio.Wave 'Bắt buộc
  3. Public Class Form1
  4.     Dim tb As New TrackBar
  5.     Dim lb As New Label
  6.     Dim device As aud.MMDevice
  7.     Dim waveOutDevice As nwav.IWavePlayer
  8.     Dim mainOutputStream As nwav.WaveStream
  9.     Dim volumeStream As nwav.WaveChannel32
  10.  
  11.     Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  12.         Dim DevEnum As New aud.MMDeviceEnumerator()
  13.         device = DevEnum.GetDefaultAudioEndpoint(NAudio.CoreAudioApi.DataFlow.Render, NAudio.CoreAudioApi.Role.Multimedia)
  14.         tb.Maximum = 100
  15.         tb.Minimum = 0
  16.         'Lấy giá trị của MasterVolume gán cho một trackbar
  17.         tb.Value = CInt(device.AudioEndpointVolume.MasterVolumeLevelScalar * 100)
  18.         '----------------------------------------------------
  19.         lb.Text = tb.Value
  20.         Me.Controls.Add(tb)
  21.         Me.Controls.Add(lb)
  22.         lb.Location = New Point(tb.Location.X, tb.Location.Y + tb.Size.Height)
  23.         AddHandler (tb.Scroll), AddressOf TrackBar_Scroll
  24.         'Tạo sự kiện để theo dõi việc Master Volume thay đổi -> giá trị Trackbar cũng thay đổi
  25.         AddHandler (device.AudioEndpointVolume.OnVolumeNotification), AddressOf OnVolumeNotification
  26.         '-------------------------------------------------------------------------------------
  27.         'Chuẩn bị để Play file mp3
  28.         waveOutDevice = New nwav.WaveOut()
  29.         mainOutputStream = CreateInputStream("E:\Music\Audio Music\safe.mp3")
  30.         waveOutDevice.Init(mainOutputStream)
  31.         waveOutDevice.Play()
  32.         '-------------------------------------------------------------------------------------
  33.     End Sub
  34.  
  35.     Private Function CreateInputStream(ByVal fileName As String) As nwav.WaveStream
  36.         Dim inputStream As nwav.WaveChannel32
  37.         If (fileName.EndsWith(".mp3")) Then
  38.             Dim mp3Reader As nwav.WaveStream = New nwav.Mp3FileReader(fileName)
  39.             inputStream = New nwav.WaveChannel32(mp3Reader)
  40.         Else
  41.             Throw New InvalidOperationException("Unsupported extension")
  42.         End If
  43.         volumeStream = inputStream
  44.         Return volumeStream
  45.     End Function
  46.  
  47.     Private Sub TrackBar_Scroll(sender As Object, e As EventArgs)
  48.         device.AudioEndpointVolume.MasterVolumeLevelScalar = tb.Value / 100
  49.     End Sub
  50.  
  51.     Private Sub OnVolumeNotification(data As aud.AudioVolumeNotificationData)
  52.         If Me.InvokeRequired Then
  53.             Me.Invoke(New aud.AudioEndpointVolumeNotificationDelegate(AddressOf OnVolumeNotification), data)
  54.         Else
  55.             tb.Value = CInt(data.MasterVolume * 100)
  56.             lb.Text = tb.Value
  57.         End If
  58.     End Sub
  59. End Class


Còn nhiều tính năng thú vị của bộ NAudio này, các bạn có thể tham khảo Document, hướng dẫn code của nó cũng như Source (C#) tại đây: http://naudio.codeplex.com/documentation
Nếu các bạn muốn có code Demo bên C# hoặc có gì thắc mắc thì yêu cầu tại đây, mình sẽ cố gắng giúp đỡ cho các bạn. Do là cũng mới nhìn thấy nó nên chưa thử vào sâu nên cũng chưa rành về nó lắm.

Re: NAudio - Thao tác với âm thanh

Đã gửi: T.Tư 21/11/2012 9:19 am
gửi bởi 01676167394
DLL này không dùng được trong vb6 :( , bạn có thể nói cụ thể về api không?

Re: NAudio - Thao tác với âm thanh

Đã gửi: T.Tư 21/11/2012 11:47 pm
gửi bởi Uzumaki Naruto
Việc thao tác với âm thanh dùng API là khá phức tạp, đây là ví dụ thao tác WAV thông qua API ở đây: http://caulacbovb.com/forum/viewtopic.php?f=8&t=25017
Tuy là mình code bằng .NET nhưng cũng không khác với VB6 là mấy.
Nếu là VB6 thì mình khuyến khích nên sử dụng Control Windows Media Player để thao tác cũng như lấy thông tin của file âm thanh.

Re: NAudio - Thao tác với âm thanh

Đã gửi: T.Năm 22/11/2012 8:15 am
gửi bởi 01676167394
Hàm API đó không sử dụng trên vb6 đc cậu àh :( , Mình Search google mà chỉ thấy bảo là không dùng đc nên chẳng biết thế nào cả :-/ .

Re: NAudio - Thao tác với âm thanh

Đã gửi: T.Năm 22/11/2012 2:04 pm
gửi bởi Uzumaki Naruto
hàm API nào vậy bạn?

Re: NAudio - Thao tác với âm thanh

Đã gửi: T.Năm 22/11/2012 2:46 pm
gửi bởi 01676167394
<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)

Mình chưa từng học vb.net nên cũng không chắc, tớ search: API DllImport thì có kết quả vb6 không dùng đc trên vb6 còn đâu tất cả là của c# và vb.net :( . Cậu có thể post api vb6 cho mình đc không?

Re: NAudio - Thao tác với âm thanh

Đã gửi: T.Năm 22/11/2012 5:29 pm
gửi bởi Uzumaki Naruto
Đây là 1 cách khai báo API mới của .NET thôi chứ DllImport nó không phải là cái Win32 API. Cái quan trọng là tên hàm API ấy. Bạn từ cái tên rồi tra ra các khai báo bên VB6, còn phần sử dụng thì y như nhau.

Re: NAudio - Thao tác với âm thanh

Đã gửi: T.Sáu 23/11/2012 8:47 am
gửi bởi 01676167394
Private Declare Sub SetLastError Lib "kernel32.dll" (ByVal dwErrCode As Long)

Đây là api cậu nói đúng không? Sao lại là của thư viện kernel chứ? không phải user32 như vb.net? :-/

Re: NAudio - Thao tác với âm thanh

Đã gửi: CN 25/11/2012 12:26 pm
gửi bởi 01676167394
Sao không trả lời mình vậy? :(

Re: NAudio - Thao tác với âm thanh

Đã gửi: T.Ba 18/12/2012 4:35 pm
gửi bởi PAPYRON