• Thứ Năm, 12/06/2008 17:49 (GMT+7)

    Lập trình chạy file *.wma

    Câu hỏi :
    Tôi có đoạn mã chương trình VB 6.0 sau, chạy với file *.mp3 thì được nhưng với file *.wma thì không phát nhạc. Cho hỏi bị sai chỗ nào?
     

    Trả lời :
    Private Sub timer_Timer()
     dim tinseconden As Long
     Dim length, length1, min, sec As Long
     dim n, f as Long
     n = file1.listIndex
     length = mediaplay.Duration
     tinseconden = mediaplay.CurrentPosition
     length1 = length - tinseconden
     min = length1/60
     sec = lenght1-min*60
     On Error GoTo cuoi
     if min=0 and (sec=0 or sec=1) Then
     f=n+1
     file1.ListIndex = f
     mediaplay.FileName = Dir1.Path & "\" & File1.List(f)
     end if
     Exit Sub
     cuoi :
     'chọn lại file đầu tiên trong listbox
     File1.ListIndex = 0
     mediaplay.FileName = Dir1.Path & "\" & File1.List(0)
     End Sub
     Đoạn code VB 6.0 trên sẽ phát tự động tuần tự các file multimedia trong thư mục được qui định bởi điều khiển DirListBox có tên là Dir1, danh sách các file trong thư mục được hiển thị trong điều khiển FileListbox có tên là File1. Điều khiển Windows Media Player (WMP) tương thích với đoạn code trên là 6.x, chúng tôi không có điều kiện để cài đặt version quá cũ này nên phải kiểm tra đoạn code trên WMP version mới (v. 10). Sau khi hiệu chỉnh một vài chi tiết để tương thích với version WMP mới, đoạn code trên chạy tốt, cho phép phát tuần tự 1 cách tự động các file multimedia trong 1 thư mục được chọn. Tuy nhiên ý tưởng mà bạn dùng để phát tuần tự tự động các file là dùng 1 timer đếm thời gian (thí dụ 1 s); cứ mỗi chu kỳ đếm, hàm timer_Timer() sẽ được kích hoạt, hàm này sẽ kiểm tra WMP đã chơi hết file hiện hành chưa (so sánh tổng thời gian và thời gian đã chơi được hiện hành); nếu chưa hết thì không làm gì, còn nếu hết rồi thì chọn file kế tiếp trong listbox để chơi tiếp. Ý tưởng này có nhược điểm là không hiệu quả: phải dùng timer để đếm giờ liên tục, mỗi chu kỳ hàm timer_Timer() sẽ chạy, mà hầu hết các trường hợp thì không giải quyết được gì (vì WMP chưa chơi hết file hiện hành).
     Để khắc phục vấn đề trên, bạn không nên dùng timer nữa. Thay vào đó, bạn nên dùng hàm xử lý sự kiện PlayStateChange (trên WMP version mới). Khi WMP chơi hết file hiện hành, nó sẽ kích hoạt hàm xử lý sự kiện này chạy; bạn sẽ viết hàm này với nhiệm vụ là thiết lập file kế tiếp trong listbox để WMP chơi tiếp.
     Qui trình xây dựng ứng dụng VB 6.0 dùng WMP version từ 7.0 trở lên để phát tự động các file multimedia trong 1 thư mục xác định gồm các bước chính sau đây:
     1. Chạy VB 6.0, tạo 1 Project mới dạng "Standard EXE", thiết kế form giao diện gồm các điều khiển thiết yếu sau:
     - 1 điều khiển DriveListBox có tên mặc định là Drive1 để cho phép người dùng chọn ổ đĩa chứa file multimedia cần chơi.
     - 1 điều khiển DirListBox có tên mặc định là Dir1 để cho phép người dùng chọn thư mục chứa file multimedia cần chơi.
     - 1 điều khiển FileListBox có tên mặc định là File1 chứa và hiển thị danh sách các file trong thư mục cần chơi.
     - 1 điều khiển WMP có tên là mediaplay.
     - 1 button Command có tên mặc định là Command1 để khởi động quá trình phát các file multimedia (sau khi đã chọn ổ đĩa, thư mục chứa các file multimedia).
     2. Tạo một số hàm xử lý sự kiện cần thiết và viết code cho các hàm này như sau:
     Option Explicit
     Const vbStopped = 1
     Dim fchange As Boolean
     
     'hàm xử lý click chuột trên button Start
     Private Sub Command1_Click()
     'chọn file đầu tiên trong danh sách để phát
     File1.ListIndex = 0
     mediaplay.URL = Dir1.Path & "\" & File1.List(0)
     fchange = True
     End Sub
     
     'hàm xử lý click chuột trên DirListBox
     Private Sub Dir1_Change()
     File1.Path = Dir1.Path
     End Sub
     
     'hàm xử lý click chuột trên DriveListBox
     Private Sub Drive1_Change()
     Dir1.Path = Drive1.Drive
     End Sub
     
     'hàm xử lý sự kiện thay đổi trạng thái của WMP
     Private Sub mediaplay_PlayStateChange(ByVal NewState As Long)
     Dim idx As Integer
     If NewState = vbStopped Then
     'nếu WMP đã chơi xong file hiện hành
     If fchange Then
     'nếu cần thay đổi file, chọn file kế tiếp trong danh sách
     fstart = False
     idx = File1.ListIndex + 1
     If idx = File1.ListCount Then idx = 0
     File1.ListIndex = idx
     mediaplay.URL = Dir1.Path & "\" & File1.List(idx)
     Else
     'bắt đầu phát file hiện hành
     fstart = True
     mediaplay.Controls.play
     End If
     End If
     End Sub
     3. Chạy thử để kiểm tra chức năng của ứng dụng vừa viết.
     
    Chuyên mục: Lập trình