• Thứ Ba, 22/07/2008 10:30 (GMT+7)

    Lập trình video player với VB

    Câu hỏi :
    Tôi viết chương trình video player bằng Visual Basic có chức năng nghe nhạc chế độ mono có thể chuyển kênh left hoặc right để ngắt lời khi chạy đĩa karaoke, giờ còn mỗi chức năng ngắt lời là chưa làm được, xin hướng dẫn.
     

    Trả lời :

    Bạn không nói rõ là đoạn code "video player" của bạn được viết thông qua dịch vụ nào nên chúng tôi chỉ trả lời một cách tổng quát. Về mặt lập trình điều khiển multimedia, bạn có thể dùng nhiều thư viện lập trình ở nhiều mức độ khác nhau để chơi các file multimedia và điều khiển sound card.

     Thí dụ cấp độ dễ dàng nhất để chơi các file multimedia là dùng linh kiện phần mềm dạng ActiveX Control của Microsoft tên là "Windows Media Player", bạn chỉ cần thiết lập giá trị của thuộc tính "filename" hay "URL" của linh kiện (tùy version của WMP) để miêu tả đường dẫn file multimedia là nó sẽ tự động chơi dùm bạn. Về mặt điều khiển 2 loa trái/phải, bạn có thể thiết lập thuộc tính "settings.balance" của WMP về giá trị thích hợp. Thí dụ sau là đoạn code VB để tắt/mở loa trái/phải :
     
     'tắt loa trái
     Private Sub btnLeft_Click()
     'biến WMP1 miêu tả điều khiển WMP
     WMP1.settings.balance = -10000
     'thử chơi 1 file multimedia
     WMP1.URL = "c:\YourData\sound.mpg"
     End Sub
     
     'tắt loa phải
     Private Sub btnRight_Click()
     'biến WMP1 miêu tả điều khiển WMP
     WMP1.settings.balance = 10000
     'thử chơi 1 file multimedia
     WMP1.URL = "c:\YourData\sound.mpg"
     End Sub
     
     Bạn cũng có thể dùng thư viện multimedia ở cấp độ thấp nhất của Windows là thư viện Winmm.lib, thư viện này cung cấp 1 số hàm API có tên dùng tiếp đầu ngữ waveIn và waveOut để truy xuất thiết bị thu và thiết bị phát âm thanh. Thường các CD karaoke dùng kênh trái (Left) để phát lời nhạc và kênh phải (Right) để phát nhạc karaoke, do đó để tắt tiếng, bạn có thể gọi hàm waveOutSetVolume() để thiết lập tham số cho thiết bị phát âm thanh của sound card. Đoạn chương trình VB 6.0 sau đây cho phép bạn tắt kênh trái và chỉnh kênh phải cực đại:
     
     'khai báo các hàm API cần dùng
     Private Declare Function waveOutGetDevCaps Lib "winmm.dll" Alias "waveOutGetDevCapsA" (ByVal uDeviceID As Long, lpCaps As WAVEOUTCAPS, ByVal uSize As Long) As Long
     Private Declare Function waveOutGetNumDevs Lib "winmm.dll" () As Long
     Private Declare Function waveOutSetVolume Lib "winmm.dll" (ByVal uDeviceID As Long, ByVal dwVolume As Long) As Long
     'khai báo hằng, kiểu cần dùng
     Const WAVECAPS_VOLUME = 4
     Private Type WAVEOUTCAPS
     wMid As Integer
     wPid As Integer
     vDriverVersion As Long
     szPname(32) As Byte
     dwFormats As Long
     wChannels As Integer
     wReserved1 As Integer
     dwSupport As Long
     End Type
     
     'thủ tục tắt loa trái
     Private Sub Command1_Click()
     Dim uRetVal As Integer
     Dim uNumDevs As Integer
     Dim waveCaps As WAVEOUTCAPS
     Dim volLev As Long
     Dim retVal As Long
     'Kiểm tra để đảm bảo ít nhất có 1 thiết bị xuất âm thanh.
     uNumDevs = waveOutGetNumDevs()
     If uNumDevs = 0 Then
     MsgBox "Máy không có thiết bị waveout"
     Exit Sub
     End If
     
     ' Thí dụ này dùng thiết bị số 0 (thường là vậy).
     ' nhưng nếu máy có nhiều thiết bị phát âm thanh, ứng dụng nên duyệt từng thiết bị từ 0 tới uNumDevs-1 để điều khiển nó.
     retVal = waveOutGetDevCaps(0, waveCaps, Len(waveCaps))
     If retVal = 0 Then
     'Kiểm tra xem thiết bị phát âm có hỗ trợ việc hiệu chỉnh âm lượng
     If (waveCaps.dwSupport And WAVECAPS_VOLUME) <> 0 Then
     ' tắt tiếng Left, cực đại Right
     ' word trọng số thấp là âm lượng kênh Left,
     ' word trọng số cao là âm lượng kênh Right
     volLev = &HFFFF0000
     uRetVal = waveOutSetVolume(0, volLev)
     End If
     End If
     End Sub
     

    Chuyên mục: Lập trình