1 Mục lục 1 2 Làm quen với visual basic 0 9


Dùng API khai thác khả năng Multimedia



tải về 1.69 Mb.
trang16/39
Chuyển đổi dữ liệu09.10.2016
Kích1.69 Mb.
#32631
1   ...   12   13   14   15   16   17   18   19   ...   39

8.4Dùng API khai thác khả năng Multimedia

8.4.1Lớp multimedia


Lớp này chứa một bộ các lệnh multimedia thông dụng. Khi một đối tượng được tạo từ lớp, nó mang những chức năng tương tự một điều khiển – có thể xem hay quy định thuộc tính, các phương thức. Nó che đi các lệnh gọi API.
Các phương thức mà lớp này hỗ trợ:


Phương thức

Mô tả

MmOpen

Mở tập tin (video, âm thanh, nhạc, v.v...) chuẩn bị Play

MmClose

Đóng tập tin đang mở, ngăn cấm hoạt động Play

MmPause

Dừng Play trên tập tin hiện hành

MmStop

Dừng hẳn Play

MmSeek

Tìm một vị trí trong tập tin

MmPlay

Play tập tin đang mở, phát ra âm thanh trong loa

Các phương thức này là những hàm riêng rẽ trong lớp MMedia.cls và cho phép sử dụng các API theo nhiều cách.

Sau đây là các thủ tục thuộc tính trong tập tin nguồn:


Thuộc tính

Mô tả

Filename

Tên của tập tin đang mở

Length

Chiều dài của tập tin đang mở

Position

Vị trí hiện hành trong tập tin – ta có thể kết hợp với thuộc tính Length để hiển thị trạng thái Play

Satus

Một từ cho biết trạng thái tập tin (Play, dừng tạm, dừng hẳn, v.v... )

Wait

Nếu là True, chương trình sẽ chờ đến khi Play xong mới làm tiếp. Nếu là False, nó thi hành theo kiểu đa nhiệm



  • Ví dụ mẫu - Sử dụng lớp Multimedia




  1. Mở tập tin TestMM.vbp

  2. Điều chỉnh kích cỡ biểu mẫu chính và vẽ một nút lệnh và một điều khiẻn hộp thoại thông dụng:





Hình 9.3 Thiết kế biểu mẫu

Nếu không thấy điều khiển hộp thoại thông dụng trên hộp công cụ, từ menu Project, chọn Components, và chọn vào hộp đánh dấu “Microsoft Common Dialog Control 6.0”.




  1. Để hộp thoại (thông dụng) bật ra khi nhấn vào nút lệnh, ta xử lý sự kiện Click trên nút lệnh bằng cách gõ vào:

Private Sub Command1_Click()

With CommonDialog1

.Filter = "WaveAudio (*.wav)|*.wav|Midi (*.mid)|*.mid|Video files (*.avi)|*.avi"

.FilterIndex = 0

.ShowOpen

End With


End Sub



  1. Chạy chương trình và nhấn nút lệnh, ta sẽ thấy hộp thoại mở tập tin quen thuộc xuất hiện cho ta chọn tập tin multimedia:



Hình 9.4 Chọn mở tập tin multimedia





  1. Kế tiếp ta chuyển lớp multimedia thành một đối tượng.

Private Sub Command1_Click()

Dim Multimedia As New MMedia

With CommonDialog1

.Filter = "WaveAudio (*.wav)|*.wav|Midi (*.mid)|*.mid|Video files (*.avi)|*.avi"

.FilterIndex = 0

.ShowOpen

End With


If CommonDialog1.Filename <> "" Then

Multimedia.mmOpen CommonDialog1.Filename

Multimedia.mmPlay

End If


End Sub
Thi hành chương trình. Tìm một tập tin multimedia trên đĩa cứng (thường chứa trong thư mục \Windows\Media) và play.

Lưu ý rằng để play các tập tin âm thanh như WAVMID, ta cần có card âm thanh trên máy .

Trong dòng đầu của sự kiện click, ta tạo một đối tượng multimedia dẫn xuất từ lớp MMedia. Đây là bước chuyển từ một lớp sang một đối tượng.
Private Sub Command1_Click()

Dim Multimedia As New MMedia

Bốn dòng kế sử dụng đối tượng multimedia để mở tập tin dùng phương thức mmOpenPlay bằng phương thức mmPlay.


If CommonDialog1.Filename <> "" Then

Multimedia.mmOpen CommonDialog1.Filename

Multimedia.mmPlay

End If


Tạo lớp bao bọc các API làm vấn đề đơn giản hơn. Nếu lớp này được đem thưưng mại hoá, người sử dụng nó sẽ không cần phải hiểu về API, họ chỉ cần biết cách thức hoạt động của lớp mà thôi.

8.4.1.1Tìm hiểu lớp Multimedia


Windows có nhiều phân hệ, mỗi phân hệ đảm nhiệm một chức năng nhất định. Một trong những phần này là MCI. MCI là tên gọi tắt của Multimedia Control Interface, cung cấp một giải pháp độc lập với thiết bị để sử dụng các tính năng của Windows thông qua chương trình.

Khi viết chương trình trò chơi trên DOS, ta phải xử lý với nhiều chuẩn card âm thanh và hình ảnh khác nhau. Tính năng độc lập với thiết bị, và các chương trình điều khiển thiết bị cung cấp bởi Windows cho phép ta làm việc với bất kỳ card âm thanh, hình ảnh nào với cùng chương trình, miễn là chúng được hỗ trợ bởi Windows.

MCI cung cấp lớp đệm giữa lập trình viên và các thiết bị dùng xử lý dữ liệu multimedia như các card âm thanh, hình ảnh.

MCI sẽ làm việc với các chương trình điều khiển thiết bị của Windows, và cuối cùng là phần cứng multimedia. Lập trình viên, yêu cầu MCI dùng hàm API mciSendString. Lệnh này sau đó được gọi xuống chương trình điều khiển thiết bị, ta không cần quan tâm.


MCI là một đối tượng độc lập. Nó có thể được lập trình và có ngôn ngữ lập trình riêng. Khi ta dùng mciSendString, ta đang lập trình MCI.

8.4.1.2Sử dụng mciSendString


Cú pháp của mciSendString:
= mciSendString(“<Command>”, _

<ReturnString>, , >)
là một số long integer, và thay đổi tuỳ theo dòng lệnh.

đặt trong đấu trích dẫn, phải là một từ dưới dạng chuỗi ký tự và là lệnh gửi đến MCI; như là Play để play một tập tin, Open để mơe tập tin, v.v...

Một số lệnh MCI trả về một chuỗi ký tự. Lệnh Status trả về một chuỗi cho biết tập tin dừng hẳn (Stopped), hay đang chơi (Playing), hay dừng tạm (Pause), v.v...

API cần biết bao nhiêu dữ liệu được chứa trong biến chuỗi, tham số kế tiếp là chiều dài chuỗi. Do đó, nếu ta phát lệnh đến MCI trả về một chuỗi, ta phải truyền một biến chuỗi có chiều dài nhất định và cho biết chiều dài của nó:
Dim sReturnString As String * 255

Dim nReturn As Long


nReturn = mciSendString("status waveaudio mode", _

sReturnString, 255, 0)


Thêm * 255 vào khai báo sReturnString cho biết chiều dài của nó là 255.

8.4.1.3Sử dụng hàm Callback trong Visual Basic


Hàm Callback thực ra chỉ áp dụng cho C/C++, Delphi, hay một số ngôn ngữ biên dịch cấp thấp, không dùng với Visual Basic. Tuy nhiên, VB6 cho phép ta sử dụng hàm Callback mà không cần thêm các chương trình phụ đặc biệt như trong các phiên bản trước.

Khi ta dùng API, chương trình của ta không thể nào biết được điều gì đang xảy ra khi hàm đang chạy. Ta phải chờ đến khi nó kết thúc, và kiểm tra giá trị trả về. Ý tưởng của hàm Callback là một API mà khi chạy, nó có thể gọi đến một hàm hoặc thủ tục của chương trình ta đang viết.

Ta phải tạo một hàm Public ở trong một module chương trình của Visual Basic, với các tham số truyền cần thiết của API. Sau đó, khi gọi API, ta gửi một con trỏ (pointer) - địa chỉ vùng nhớ của hàm Callback. Ta phải dùng toán tử mới AddressOf:
nResult = someAPIFunction(ParamOne, ParamTwo, _

AddressOf MyCallback)


Khi API chạy, nó gọi mmọt hàm trong chương trình của chúng ta và gửi các tham số cần thiết. Thường nó được được dùng để cập nhật thanh trạng thái, lấy danh sách font hệ thống, và các công việc khác.

Như đã nói, chúng ta sẽ không nói thêm về các hàm Callback. Các hàm này làm phức tạp hơn cho chương trình và nhiều khi làm treo hệ thống. Tuy nhiên, trợ giúp của Visual Basic sẽ cung cấp một số ví dụ nếu bạn uốn tìm hiểu kỹ hơn.



8.4.1.4Mở tập tin Media


Ta gửi tên tập tin cho lệnh Open để mở tập tin. Đây là tên chuẩn như: C:\Video.avi.
Open <filename> Type <typestring> Alias <aname>

...


...

‘Issue command to do something to the file

...

...


Close <aname>
Sau từ khoá Type là kiểu tập tin. Kiểu chuẩn của Windows là WaveAudio đối với tâp tin WAV, AVIVideo đối với AVI, và Sequencer đối với MID.
Alias dùng để thay thế tên tạp tin mở:
Open c:\video.avi Type AVIVideo Alias Peter
Nếu ta gửi dòng lệnh này đến MCI bằng MCISenString, nó yêu cầu MCI mở tập tin C:\video.avi như một tập tin video của Microsoft, và nó sẽ dùng tên Peter để chỉ ra tập tin này.

Mỗi lần mở tập tin, lệnh MCI có thể dùng bí danh để chơi tập tin, dừng hẳn hay tạm dừng, hoặc hiển thị trạng thái, v.v... Ví dụ:


Play Peter

Pause Peter

Stop Peter
Sau đó, ta cần đóng tập tin bằng cách gửi lệnh Close, theo sau là bí danh của tập tin.
nReturn = mciSendString(“Close Peter”, “”,0,0)


  • Ví dụ mẫu - Hiển thị trạng thái và vị trí của tập tin Multimedia




  1. Mở đề án TestMM.vbp

  2. Chúng ta sẽ thêm một số điều khiển để xem thuộc tính StatusPosition của lớp MMedia. Thêm một điều khiển thanh diễn tiến (ProgressBar), một nhãn, một điều khiển định giờ (timer):




Hình 9.5 Thiết kế biểu mẫu
Nếu không thấy điều khiển ProgressBar trên hộp công cụ, từ menu Project, chọn Components, chọn vào hộp đánh dấu “Microsoft Windows Common Controls 6.0 ”.






  1. Mở cửa sổ Properties của điều khiển Timer, đổi thuộc tính Enabled thành False, và Interval là 500. Xoá Caption của điều khiển nhãn.

  2. Nhấn đúp chuột lên nút lệnh để mở sự kiện Click:

Private Sub Command1_Click()

...

...


If CommonDialog1.Filename <> "" Then

Multimedia.Wait = False

Multimedia.mmOpen CommonDialog1.Filename

ProgressBar1.Value = 0

ProgressBar1.Max = Multimedia.Length

Timer1.Enabled = True

Multimedia.mmPlay

End If
End Sub



  1. Trở về biểu mẫu, nhấn đúp chuột lên điều khiển Timer1 để mở sự kiện Timer.

Private Sub Timer1_Timer()

ProgressBar1.Value = Multimedia.Position

Label1 = "Status: " & Multimedia.Status

If ProgressBar1.Value = ProgressBar1.Max Then

Multimedia.mmClose

Timer1.Enabled = False

End If

End Sub
Có một vấn đề nhỏ. Ta đã định nghĩa biến chỉ đến instance của lớp MMedia trong hàm sự kiện command1_Click(). Bây giờ chúng ta lại muốn chỉ đến nó từ trong Timer1_Timer().



GHI CHÚ Bạn sẽ được giải thích khái niêm instance trong chương 13 - Lập trình hướng đối tượng


  1. Trong sự kiện Click của nút lệnh, chọn dòng khao báo biến Mutilmedia, nhấn phím Ctrl-X để cắt nó vào Clipboard và xoá nó khỏi sự kiện Command1_Click. Sau đó, chọn vào danh sách (General) trong cửa sổ Code, nhấn phím Ctrl –V để dán nó vào vùng General Declarations. Biến khai báo đặt trong vùng này sẽ là biến toàn cục đối với biểu mẫu này.

  2. Thi hành chương trình. Nhấn nút “Load and Play a file”, và chọn một tậptin AVI, ví dụ tập tin video “Welcome to windows 95”.

  3. Ta sẽ thấy thanh diễn tiến cho thấy bao nhiêu phần trăm của tập tin đang chơi. Khi video kết thúc ta thấy kết quả hiển thị: Stopped.

Khi ta mới nhấn nút lệnh, chương trình thiết lập các khởi tạo cho thuộc tính trước khi chơi tập tin:

If CommonDialog1.Filename <> "" Then

Multimedia.Wait = False

Multimedia.mmOpen CommonDialog1.Filename

ProgressBar1.Value = 0

ProgressBar1.Max = Multimedia.Length

Timer1.Enabled = True

Multimedia.mmPlay

End If
Đối tượng multimedia có thuôc tính tên là Wait. Thuộc tính này quyết định chương trình có tiếp tục thi hành (đa nhiệm) trong khi chơi tập tin, hay phải dừng và chờ đến đến khi nó hoàn tất. Phương thức mmPlay theo dõi giá trị của biến bWait. Nếu biến này có giá trị True, nó thêm Wait vào lệnh gọi mciSendString:


Public Sub mmPlay()

Dim nReturn As Long

If sAlias = "" Then Exit Sub

If bWait Then

nReturn = mciSendString("Play " & _

sAlias & " wait", "", 0, 0)

Else

nReturn = mciSendString("Play " & sAlias, "", 0, 0)



End If

End Sub


Làm sao biết giá trị bWait ? Nhắc lại rằng ta có thể cung cấp các hàm thuộc tính cho phép đọc hoặc quy định giá trị của biến nội bộ:
Property Get Wait() As Boolean

' Routine to return the value of the object's wait property.

Wait = bWait

End Property


Property Let Wait(bWaitValue As Boolean)

' Routine to set the value of the object's wait property

bWait = bWaitValue

End Property


Bước kế là mở tập tin ta muốn chơi. Ta dùng phương thức mmOpen để mở tập tin.
8.4.1.4.1Mở tập tin

Trước hết, ta khai báo một cặp biến cục bộ để giữ giá trị tạm thời.
Public Sub mmOpen(ByVal sTheFile As String)

Dim nReturn As Long

Dim sType As String

If sAlias <> "" Then

mmClose

End If
Select Case UCase$(Right$(sTheFile, 3))



Case "WAV"

sType = "Waveaudio"

Case "AVI"

sType = "AviVideo"

Case "MID"

sType = "Sequencer"

Case Else

Exit Sub


End Select

sAlias = Right$(sTheFile, 3) & Minute(Now)

If InStr(sTheFile, " ") Then

sTheFile = Chr(34) & sTheFile & Chr(34)

End if

nReturn =mciSendString("Open " & sTheFile _



& " ALIAS " & sAlias & " TYPE " & sType _ & " wait", "", 0, 0)

End Sub
Trước hết, hàm mmOpen kiểm tra biến ở mức module gọi là sAlias.


If sAlias <> “” then

mmClose


End if
Làm việc với MCI, ta nên dùng bí danh cho từng tập tin mở. Ở đây lớp MMedia thiết lập một tên cho bí danh và chứa bí danh vào biến sAlias. Khi ta tiếp tục mở một tập tin kế tiếp bằng mmOpen, hoặc chỉ ra thuộc tính tên tập tin, chương trình kiểm tra điều này và gọi một thủ tục khác để đóng tập tin thứ nhất. Đóng tập tin khi ta cần giải phóng vùng nhớ và tăng tốc độ chơi tập tin.

Cấu trúc Select Case kiểm tra từng loại tập tin.

Lệnh wait cho phép chương trình tiếp tuch chạy cho đến khi nạp thành công. Nếu không có wait, trên một máy nhanh với đĩa cứng chậm, có thể có vấn đề. Ta có thể cố chơi tập tin trước khi nó được nạp xong, đơn giản bởi vì chương trình chạy nhanh hơn đĩa cứng. Lưu ý rằng nó không giống thuộc tính Wait trước đây để điều khiển chương trình tiếp tục chạy khi tập tin đang chơi chứ không phải đang nạp.

8.4.1.4.2Lấy chiều dài tập tin

Dùng mciSendString để lấy hoặc quy định chiều dài. Thuộc tính Length của lớp MMedia chỉ có tính chất được phép đọc mà thôi, và ta không cung cấp hàm Property Let.

Property Get Length() As Single

Dim nReturn As Long, nLength As Integer

Dim sLength As String * 255


If sAlias = "" Then

Length = 0

Exit Property

End If
nReturn = mciSendString("Status " & sAlias _

& length", Length, 255, 0)

nLength = InStr(sLength, Chr$(0))

Length = Val(Left$(sLength, nLength - 1))

End Property

Trước hết sAlias được kiểm tra xem tập tin có đang mở hay không ? Nếu chưa mở, giá trị trả về từ thủ tục thuộc tính là 0. Nếu tập tin mở rồi, lệnh Status Length của MCI được dùng.

Ta không lo về cách tính chiều dài tập tin, vì đơn vị đo phù hợp với thanh diễn tiến.

Lệnh Status là lệnh MCI đặc biệt, có thể kết nối với các từ khoá như Length, Position, Mode để xác định các thông tin về tập tin hiện hành. Nó trả về các thông tin này trong một chuỗi ký tự có chiều dài nhất định được truyền vào mciSendString. Trong ví dụ này chuỗi trả về là sLength và dài 255 ký tự.

Dĩ nhiên, nó không luôn chứa 255 ký tự trả về từ lệnh Status. Dùng hàm InStr để cắt bỏ các ký tự 0 lấp đầy khoảng trống.

Chiều dài chứa trong chuỗi được trích chuỗi và chuyển đổi sang kiểu số trước khi gán cho Length.

8.4.1.4.3Lấy vị trí hiện hành

Lệnh Status Position có thể được gọi nhiều lần để xác định vị trí hiện hành của tập tin đang chơi:

Property Get Position() As Single

Dim nReturn As Integer, nLength As Integer

Dim sPosition As String * 255


If sAlias = "" Then Exit Property

nReturn = mciSendString("Status " & sAlias _

& " position", sPosition, 255, 0)

nLength = InStr(sPosition, Chr$(0))

Position = Val(Left$(sPosition, nLength - 1))

End Property

Thay vì gửi Status Length, ta gửi Status Position.

8.4.1.4.4Lấy trạng thái hiện hành

Để lấy chuỗi ký tự trạng thái còn gọi là mode, ta truy vấn thuộc tính Status của lớp. Ta cũng sử dụng hàm thuộc tính Property Get hầu đồng nhất với thuộc tính Position trên đây.

Chỉ khác là ta gửi Status Mode thay vì Status Length hay Status Position cho mciSendString. Dĩ nhiên, không cần chuyển đổi sang kiểu số:

...

nReturn = mciSendString("Status " & sAlias & _



" mode", sStatus, 255, 0)

nLength = InStr(sStatus, Chr$(0))

Status = Left$(sStatus, nLength - 1)

...


Trở lại sự kiện Command1_Click. Cho tới giờ, ta đã định nghĩa thuộc tính Wait., mở tập tin, thiết lập thanh diễn tiến. Trước khi chơi tập tin, ta quy định Timer. Sau đó, ta chơi tập tin bằng cách gọi phương thức mmPlay của đối tượng Multimedia.

If CommonDialog1.Filename <> "" Then

Multimedia.Wait = False

Multimedia.mmOpen CommonDialog1.Filename

ProgressBar1.Value = 0

ProgressBar1.Max = Multimedia.Length

Timer1.Enabled = True

Multimedia.mmPlay

End If

8.4.1.4.5Chơi trên tập tin

Trước hết, kiểm tra tập tin mở thông qua biến sAlias; sau đó nếu thoả điều kiện, nó thi hành lệnh Play của MCI.
Public Sub mmPlay()

Dim nReturn As Long

If sAlias = "" Then Exit Sub
If bWait Then

nReturn = mciSendString("Play " & _ sAlias & " wait", "", 0, 0)

Else

nReturn = mciSendString("Play " & _



sAlias, "", 0, 0)

End If


End Sub
8.4.1.4.6Cập nhật thanh diễn tiến và điều khiển nhãn.

Công việc sau cùng là cập nhật thanh trạng thái và nhãn trên biểu mẫu, khi tập tin đang chơi. Trước khichơi tập tin, đặt điều khiển Timer với Interval là 500. Vậy nó sẽ kích hoạt đếm mỗi nửa giây. Khi đó, đoạn chương trình sau được thi hành:

Private Sub Timer1_Timer()

ProgressBar1.Value = Multimedia.Position

Label1 = "Status: " & Multimedia.Status

If ProgressBar1.Value = ProgressBar1.Max Then

Multimedia.mmClose

Timer1.Enabled = False

End If


End Sub

Cuối cùng cần phải ngưng lại khi đạt đến cuối tập tin. Có thể thực hiện điều này bằng cách so sánh giá trị hiện hành và giá trị Max của thanh diễn tiến. Khi chúng bằng nhau, tập tin được đóng bằng phương thức mmClose. Sau đó, cấm Timer để ngăn hàm này chạy cho đến khi mở tập tin khác.


8.4.1.4.7Tóm tắt các lệnh của MCI

Lệnh

Mô tả

Play

Chơi một tập tin

Pause

Tạm dừng chơi, sẵn sàng bắt đầu mọi lúc

Stop

Dừng hẳn - cần chuyển đến một vị trí nào đó để tiếp tục chơi

Seek

Theo sau là một con số, chuyển đến vị trí trong tập tin

Status Mode

Trả về một chuỗi ký tự thể hiện trạng thái tập tin(đang choi, đang mở, tạm dừng, dừng hẳn....)

Status Position

Trả về vị trí tập tin mà playback đã đạt đến

Status Length

Trả về chiều dài tập tin và hỗ trợ để dưa con số trả về từ Status Position vào một ngữ cảnh có ý nghĩa nào đó.

Close

Đóng tập tin và giải phóng vùng nhớ nó chiếm trước đó

Ngoài ra MCI còn hỗ trợ một số lệnh khác và một số lệnh đặc biệt cho mỗi định dạng tập tin.




tải về 1.69 Mb.

Chia sẻ với bạn bè của bạn:
1   ...   12   13   14   15   16   17   18   19   ...   39




Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2024
được sử dụng cho việc quản lý

    Quê hương