• 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

điều khiển tốc độ phát wav file

Nơi trao đổi về các vấn đề trong lập trình Windows Forms, Console dùng cú pháp ngôn ngữ Visual Basic .NET và C#

Điều hành viên: tungblt, vuathongtin

70hungpc
Thành viên chính thức
Thành viên chính thức
Bài viết: 44
Ngày tham gia: T.Bảy 20/10/2012 10:39 pm
Has thanked: 6 time

điều khiển tốc độ phát wav file

Gửi bàigửi bởi 70hungpc » T.Sáu 02/11/2012 10:45 am

Xin các Pro giúp em với.
Em đã xem các bài về phát .wav nhưng chưa có bài nào đề cập đến việc điều khiển tốc độ phát của file.wav, điều này có lúc rất cần trong xử lý âm thanh. Bác nào biết pos lên giúp em với.



Uzumaki Naruto
Thành viên danh dự
Thành viên danh dự
Bài viết: 839
Ngày tham gia: T.Hai 30/04/2007 9:55 pm
Đến từ: Sài Gòn
Has thanked: 7 time
Been thanked: 83 time

Re: điều khiển tốc độ phát wav file

Gửi bàigửi bởi Uzumaki Naruto » T.Bảy 03/11/2012 1:36 am

  1. Imports System.IO
  2. Public Class Form1
  3.  
  4.     Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  5.         Dim B() As Byte = File.ReadAllBytes("E:\Music\Audio Books\Listen Japanese\Track 04.wav")
  6.         Dim rate As Integer = BitConverter.ToInt32(B, 24) / -8 'Đây là cái bạn cần điều khiển, mẫu âm càng nhỏ tốc độ sẽ càng chậm, mẫu dương càng nhỏ tốc độ sẽ càng nhanh.
  7.         Dim SampleRate As Integer = BitConverter.ToInt32(B, 24) + rate
  8.         Array.Copy(BitConverter.GetBytes(SampleRate), 0, B, 24, 4)
  9.         Dim Sound As New System.Media.SoundPlayer(New MemoryStream(B))
  10.         'Sound.Load()
  11.  
  12.         Sound.Play()
  13.     End Sub
  14. End Class
  15.  
  16.  
Cause you're my special thing
I'm flying without wings

70hungpc
Thành viên chính thức
Thành viên chính thức
Bài viết: 44
Ngày tham gia: T.Bảy 20/10/2012 10:39 pm
Has thanked: 6 time

Re: điều khiển tốc độ phát wav file

Gửi bàigửi bởi 70hungpc » T.Bảy 03/11/2012 9:52 am

Uzumaki Naruto đã viết:
  1. Imports System.IO
  2. Public Class Form1
  3.  
  4.     Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  5.         Dim B() As Byte = File.ReadAllBytes("E:\Music\Audio Books\Listen Japanese\Track 04.wav")
  6.         Dim rate As Integer = BitConverter.ToInt32(B, 24) / -8 'Đây là cái bạn cần điều khiển, mẫu âm càng nhỏ tốc độ sẽ càng chậm, mẫu dương càng nhỏ tốc độ sẽ càng nhanh.
  7.         Dim SampleRate As Integer = BitConverter.ToInt32(B, 24) + rate
  8.         Array.Copy(BitConverter.GetBytes(SampleRate), 0, B, 24, 4)
  9.         Dim Sound As New System.Media.SoundPlayer(New MemoryStream(B))
  10.         'Sound.Load()
  11.  
  12.         Sound.Play()
  13.     End Sub
  14. End Class
  15.  
  16.  


Hay quá, đúng là cái mình đang cần, tải về thử xem sao
cảm ơn Uzumaki Naruto nhiều nhiều

70hungpc
Thành viên chính thức
Thành viên chính thức
Bài viết: 44
Ngày tham gia: T.Bảy 20/10/2012 10:39 pm
Has thanked: 6 time

Re: điều khiển tốc độ phát wav file

Gửi bàigửi bởi 70hungpc » T.Ba 06/11/2012 4:01 pm

Uzumaki Naruto cho mình hỏi thêm chút nhe.
Bạn chó thể giúp mình chỉnh âm lượng của file wav bằng mã vb.net?
về âm thanh mình mù tịt
thank Naruto nhiều.

Uzumaki Naruto
Thành viên danh dự
Thành viên danh dự
Bài viết: 839
Ngày tham gia: T.Hai 30/04/2007 9:55 pm
Đến từ: Sài Gòn
Has thanked: 7 time
Been thanked: 83 time

Re: điều khiển tốc độ phát wav file

Gửi bàigửi bởi Uzumaki Naruto » T.Ba 06/11/2012 6:46 pm

  1. Imports System.IO
  2. Public Class Form1
  3.  
  4.     Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  5.         Dim B() As Byte = File.ReadAllBytes("E:\Music\Audio Books\Listen Japanese\Track 04.wav")
  6.         Dim rate As Integer = BitConverter.ToInt32(B, 24) / -8 'Đây là cái bạn cần điều khiển, mẫu âm càng nhỏ tốc độ sẽ càng chậm, mẫu dương càng nhỏ tốc độ sẽ càng nhanh.
  7.         Dim SampleRate As Integer = BitConverter.ToInt32(B, 24) + rate
  8.         Array.Copy(BitConverter.GetBytes(SampleRate), 0, B, 24, 4)
  9.         Array.Copy(ChangeVolume(B, True, 100), 0, B, 44, 4)
  10.         Dim Sound As New System.Media.SoundPlayer(New MemoryStream(B))
  11.         'Sound.Load()
  12.         Sound.Play()
  13.     End Sub
  14.  
  15.     Private Function ComplementToSigned(ByRef bytArr As Byte(), intPos As Integer) As Short
  16.         Dim snd As Short = BitConverter.ToInt16(bytArr, intPos)
  17.         If snd <> 0 Then
  18.             snd = Convert.ToInt32((Not snd Or 1))
  19.         End If
  20.         Return snd
  21.     End Function
  22.  
  23.     Private Function SignedToComplement(shtVal As Short) As Byte()
  24.         Dim bt As Byte() = New Byte(1) {}
  25.         shtVal = Convert.ToInt32((Not shtVal Or 1))
  26.         bt = BitConverter.GetBytes(shtVal)
  27.         Return bt
  28.     End Function
  29.  
  30.     Private Function ChangeVolume(ByVal ar() As Byte, ByVal inc As Boolean, ByVal incVal As Integer) As Byte()
  31.         For j As Integer = 44 To ar.Length - 1 Step 2
  32.             Dim snd As Short = ComplementToSigned(ar, j)
  33.             Try
  34.                 Dim p As Short = Convert.ToInt32((snd * incVal) \ 100)
  35.                 If inc Then
  36.                     snd += p
  37.                 Else
  38.                     snd -= p
  39.                 End If
  40.             Catch
  41.                 snd = ComplementToSigned(ar, j)
  42.             End Try
  43.             Dim newval As Byte() = SignedToComplement(snd)
  44.             If (newval(0) <> Nothing) AndAlso (newval(1) <> Nothing) Then
  45.                 ar(j) = newval(0)
  46.                 ar(j + 1) = newval(1)
  47.             End If
  48.         Next
  49.         Return ar
  50.     End Function
  51. End Class

Lưu ý là mình thay đổi cái Stream của file Wave nên nó chỉ có thể lên ở một mức độ nào đó thôi, nếu lên quá nó sẽ vỡ tiếng (Do tuỳ thuộc vào âm lượng tối đa của file wave nữa). Cái này mình làm dựa trên yêu cầu của bạn, còn theo ý kiến riêng của mình là bạn nên cho nó thay đổi cái Volume của hệ thống.
Hướng dẫn:
Cái hàm ChangeVolume mình viết ở đây có 3 tham số, tham số đầu là cái mảng stream của file wave (đã chuyển ra bit) cái thứ hai là cái để xem là tăng hay giảm: True tăng, False giảm, tham số thứ 3 là giá trị tăng thêm.
Cause you're my special thing
I'm flying without wings

70hungpc
Thành viên chính thức
Thành viên chính thức
Bài viết: 44
Ngày tham gia: T.Bảy 20/10/2012 10:39 pm
Has thanked: 6 time

Re: điều khiển tốc độ phát wav file

Gửi bàigửi bởi 70hungpc » T.Tư 07/11/2012 10:59 am

Xin cảm ơn Uzumaki Naruto.
Nói rất có lý, nhưng nếu cần thay đổi âm lượng lại bảo người dùng chỉnh qua volum hệ thống thấy nó hơi thô (không Pro lắm)
Trong chương trình mà bảo mình can thiệp vào volum hệ thống thì ~X( , Naruto có cách nào giúp luôn đi.
thank trước nhé.

Uzumaki Naruto
Thành viên danh dự
Thành viên danh dự
Bài viết: 839
Ngày tham gia: T.Hai 30/04/2007 9:55 pm
Đến từ: Sài Gòn
Has thanked: 7 time
Been thanked: 83 time

Re: điều khiển tốc độ phát wav file

Gửi bàigửi bởi Uzumaki Naruto » T.Tư 07/11/2012 5:03 pm

  1. Imports System.Runtime.InteropServices
  2.  
  3. Public Class Form1
  4.     <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
  5.     End Function
  6.  
  7.     Const WM_APPCOMMAND As UInteger = &H319
  8.     Const APPCOMMAND_VOLUME_UP As UInteger = &HA
  9.     Const APPCOMMAND_VOLUME_DOWN As UInteger = &H9
  10.  
  11.  
  12.     Private Sub ChangeVolume(ByVal isUp As Boolean, value As Byte)
  13.         For i As Integer = 1 To value
  14.             If (isUp) Then
  15.                 SendMessage(Me.Handle, WM_APPCOMMAND, &H30292, APPCOMMAND_VOLUME_UP * &H10000)
  16.             Else
  17.                 SendMessage(Me.Handle, WM_APPCOMMAND, &H30292, APPCOMMAND_VOLUME_DOWN * &H10000)
  18.             End If
  19.         Next
  20.     End Sub
  21.  
  22.     Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  23.         ChangeVolume(True, 5) 'Lưu ý: nếu truyền giá trị là 5 thì sẽ tăng volume lên 10 bậc (do mỗi đơn vị tăng 2 bậc)
  24.     End Sub
  25.  
  26. End Class
Cause you're my special thing
I'm flying without wings

70hungpc
Thành viên chính thức
Thành viên chính thức
Bài viết: 44
Ngày tham gia: T.Bảy 20/10/2012 10:39 pm
Has thanked: 6 time

Re: điều khiển tốc độ phát wav file

Gửi bàigửi bởi 70hungpc » T.Tư 07/11/2012 10:35 pm

Nhìn mà toát mồ hôi hột, chắc còn lâu mới hiểu hết những lệnh này. #:-S
Mình đang cần để sử dụng cái đã, nghiền ngẫm sau vậy.
cảm ơn bạn rất nhiều. =D>

70hungpc
Thành viên chính thức
Thành viên chính thức
Bài viết: 44
Ngày tham gia: T.Bảy 20/10/2012 10:39 pm
Has thanked: 6 time

Re: điều khiển tốc độ phát wav file

Gửi bàigửi bởi 70hungpc » T.Sáu 16/11/2012 8:38 am

Uzumaki Naruto đã viết:
  1. Imports System.Runtime.InteropServices
  2.  
  3. Public Class Form1
  4.     <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
  5.     End Function
  6.  
  7.     Const WM_APPCOMMAND As UInteger = &H319
  8.     Const APPCOMMAND_VOLUME_UP As UInteger = &HA
  9.     Const APPCOMMAND_VOLUME_DOWN As UInteger = &H9
  10.  
  11.  
  12.     Private Sub ChangeVolume(ByVal isUp As Boolean, value As Byte)
  13.         For i As Integer = 1 To value
  14.             If (isUp) Then
  15.                 SendMessage(Me.Handle, WM_APPCOMMAND, &H30292, APPCOMMAND_VOLUME_UP * &H10000)
  16.             Else
  17.                 SendMessage(Me.Handle, WM_APPCOMMAND, &H30292, APPCOMMAND_VOLUME_DOWN * &H10000)
  18.             End If
  19.         Next
  20.     End Sub
  21.  
  22.     Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  23.         ChangeVolume(True, 5) 'Lưu ý: nếu truyền giá trị là 5 thì sẽ tăng volume lên 10 bậc (do mỗi đơn vị tăng 2 bậc)
  24.     End Sub
  25.  
  26. End Class

Cho mình hỏi chút:
Mình dùng trackbar, gán giá trị trackbar.value cho hàm ChangeVolume nhưng chỉ chỉnh được một chiều lớn dần thôi.

Uzumaki Naruto
Thành viên danh dự
Thành viên danh dự
Bài viết: 839
Ngày tham gia: T.Hai 30/04/2007 9:55 pm
Đến từ: Sài Gòn
Has thanked: 7 time
Been thanked: 83 time

Re: điều khiển tốc độ phát wav file

Gửi bàigửi bởi Uzumaki Naruto » T.Sáu 16/11/2012 11:29 pm

Cái hàm ChangeVolume ấy, bạn gọi ChangeVolume(False,giá trị) là nó giảm mà ChangeVolume(True, giá trị) là nó tăng.
Cause you're my special thing
I'm flying without wings

70hungpc
Thành viên chính thức
Thành viên chính thức
Bài viết: 44
Ngày tham gia: T.Bảy 20/10/2012 10:39 pm
Has thanked: 6 time

Re: điều khiển tốc độ phát wav file

Gửi bàigửi bởi 70hungpc » CN 18/11/2012 12:21 am

Cảm ơn bạn đã quan tâm. Bạn chưa hiểu ý của mình ở đây là mình chỉnh volume bằng tracbra, khi mình kéo trackbar thì thuộc tính nào của trackbar xác định là đang tăng hay giảm volume

70hungpc
Thành viên chính thức
Thành viên chính thức
Bài viết: 44
Ngày tham gia: T.Bảy 20/10/2012 10:39 pm
Has thanked: 6 time

Re: điều khiển tốc độ phát wav file

Gửi bàigửi bởi 70hungpc » CN 18/11/2012 12:54 am

70hungpc đã viết:
Uzumaki Naruto đã viết:
  1. Imports System.Runtime.InteropServices
  2.  
  3. Public Class Form1
  4. dim MauVL as integer 'lưu giá trị hiện tại trước khi chỉnh
  5.     <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
  6.     End Function
  7.  
  8.     Const WM_APPCOMMAND As UInteger = &H319
  9.     Const APPCOMMAND_VOLUME_UP As UInteger = &HA
  10.     Const APPCOMMAND_VOLUME_DOWN As UInteger = &H9
  11.  
  12.  
  13.     Private Sub ChangeVolume(ByVal isUp As Boolean, value As Byte)
  14.         For i As Integer = 1 To value
  15.             If (isUp) Then
  16.                 SendMessage(Me.Handle, WM_APPCOMMAND, &H30292, APPCOMMAND_VOLUME_UP * &H10000)
  17.             Else
  18.                 SendMessage(Me.Handle, WM_APPCOMMAND, &H30292, APPCOMMAND_VOLUME_DOWN * &H10000)
  19.             End If
  20.         Next
  21.     End Sub
  22.  
  23.     Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  24.         ChangeVolume(True, 3) 'Lưu ý: nếu truyền giá trị là 5 thì sẽ tăng volume lên 10 bậc (do mỗi đơn vị tăng 2 bậc)
  25. mauVL=trackbar_Volume.value
  26.     End Sub
  27. Private Sub TrackBar_Volume_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar_Volume.Scroll
  28.         Dim ssVL As Integer = TrackBar_Volume.Value
  29.         If ssVL > MauVL Then
  30.             ChangeVolume(True, TrackBar_Volume.Value)
  31.         ElseIf ssVL < MauVL Then
  32.             ChangeVolume(False, TrackBar_Volume.Value)
  33.         End If
  34.         MauVL = TrackBar_Volume.Value
  35.     End Sub
  36. End Class

Rất cảm ơn bạn, Mình làm được rồi,
nhưng nó hơi dài, bạn có cách nào gọn hơn không?

Uzumaki Naruto
Thành viên danh dự
Thành viên danh dự
Bài viết: 839
Ngày tham gia: T.Hai 30/04/2007 9:55 pm
Đến từ: Sài Gòn
Has thanked: 7 time
Been thanked: 83 time

Re: điều khiển tốc độ phát wav file

Gửi bàigửi bởi Uzumaki Naruto » CN 18/11/2012 3:17 pm

Vừa viết xong cái Tut, bạn qua đây xem:
http://caulacbovb.com/forum/viewtopic.php?f=17&t=25210&p=133557#p133557
Cause you're my special thing
I'm flying without wings


Quay về “Visual Basic .NET và C# (VB.NET & C#)”

Đ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.7 khách