Tải bản đầy đủ (.pdf) (11 trang)

Tài liệu Đồ hoạ, đa phương tiện ( Mutilmedia) và In ấn Đồ họa phần 4 doc

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (189.87 KB, 11 trang )

1.1
Phát tiếng “beep” của hệ thống
V
V


Bạn cần phát một âm thanh đơn giản, chẳng hạn tiếng “beep” của hệ thống.
#
#


Sử dụng một hàm không-được-quản-lý Win32 API như Beep hay
sndPlaySound, hoặc gọi hàm Beep của Microsoft Visual Basic .NET.
.NET Framework không chứa bất kỳ lớp được-quản-lý nào thực hiện việc chơi các file
âm thanh, ngay cả tiếng “beep” của hệ thống cũng không. Tuy nhiên, bạn có thể dễ dàng
vượt qua trở ngại này bằng Win32 API hoặc Visual Basic .NET (cấp hàm Beep thông qua
lớp Microsoft.VisualBasic.Interaction). Trong trường hợp thứ hai, bạn phải thêm một
tham chiếu đế
n Microsoft.VisualBasic.dll (có trong tất cả các phiên bản của .NET
Framework).
Ví dụ sau đây sử dụng cả hàm API Beep và hàm Visual Basic Beep. Chú ý là hàm API sử
dụng loa gắn trong của máy tính và phát âm thanh với tần số (tính bằng Hertz, nằm trong
khoảng từ 37 đến 32,767) và thời gian (tính bằng mili-giây) cho trước. Cách này sẽ
không phát bất kỳ âm thanh nào nếu máy tính không có loa gắn trong. Mặt khác, hàm
Visual Basic Beep phát tiếng “beep” chuẩn của hệ thống (là một file WAV). Cách này sẽ
không phát bất kỳ âm thanh nào nếu máy tính không có card âm thanh, n
ếu card âm
thanh không được kết nối với loa gắn ngoài, hoặc nếu Windows được cấu hình là không
phát âm thanh (thông qua phần Sounds and Audio Devices trong Control Panel).
using System;
using System.Runtime.InteropServices;


using Microsoft.VisualBasic;

public class BeepTest {

[DllImport("kernel32.dll")]
private static extern bool Beep(int freq, int dur);

[STAThread]
private static void Main(string[] args) {

// Phát tiếng "beep" tần số 440 Hz trong 100 mili-giây
// trên internal speaker.
Console.WriteLine("Win32 API beep test.");
Beep(440, 100);
Console.ReadLine();

// Phát tiếng "beep" mặc định của hệ thống (file WAV).
Console.WriteLine("VB beep test.");
Interaction.Beep();
Console.ReadLine();
}
}
Bạn cũng có thể sử dụng các hàm Win32 API để chơi một file âm thanh do bạn chọn. Kỹ
thuật này được mô tả trong mục 8.10.
1.2
Chơi file audio
V
V



Bạn cần chơi một file WAV hoặc MP3.
#
#


Sử dụng hàm API sndPlaySound (hỗ trợ file WAV), hoặc sử dụng thành phần
ActiveMovie có trong Windows Media Player (hỗ trợ file WAV và MP3)
Để chơi bất kỳ âm thanh nào trong một ứng dụng .NET, bạn cần nhận sự giúp đỡ của một
thư viện bên ngoài hoặc lời gọi hệ thống. May mắn thay, cả hai tùy chọn này đều dễ dàng
thực hiện được.
• Thư việ
n winmm.dll (có trong Windows) chứa hàm sndPlaySound nhận vào tên của
một file WAV và một thông số chỉ định cách chơi. Bạn có thể chọn chơi âm thanh
một cách đồng bộ (gián đoạn việc thực thi của chương trình cho đến khi âm thanh
đã hoàn tất), bất đồng bộ, hoặc trong một vòng lặp chạy phía nền.
• Thư viện Quartz cung cấp một thành phần COM có thể chơi nhiều kiểu file audio,
g
ồm các định dạng WAV và MP3. Thư viện Quartz được cấp thông qua quartz.dll và
nó là một phần của Microsoft DirectX cho Windows Media Player và hệ điều hành
Windows.
Trong ví dụ này, chúng ta sẽ sử dụng cách tiếp cận thứ hai. Bước đầu tiên là tạo một lớp
Interop có thể quản lý sự tương tác giữa ứng dụng .NET và thư viện Quartz. Bạn có thể
tạo một lớp
C# cùng với đoạn mã Interop này bằng tiện ích Type Library Importer
(tlbimp.exe) và dòng lệnh sau đây ([WindowsDir] là đường dẫn của thư mục cài đặt
Windows):
tlbimp [WindowsDir]\system32\quartz.dll /out:QuartzTypeLib.dll
Bạn có thể sử dụng Visual Studio .NET để tạo lớp Interop bằng cách thêm vào một tham
chiếu. Chỉ cần nhắp phải vào dự án của bạn trong Solution Explorer, và chọn Add
Reference từ menu ngữ cảnh. Kế tiế

p, chọn thẻ COM, và cuộn xuống để chọn
ActiveMovie control type library (xem hình 8.7).
Một khi lớp Interop đã được tạo, bạn có thể làm việc với giao diện IMediaControl. Bạn
có thể chỉ định file mà bạn muốn chơi bằng RenderFile, và có thể điều khiển playback
bằng các phương thức như Run, Stop, và Pause. Playback diễn ra trên một tiểu trình độc
lập, như thế nó sẽ không block đoạn mã của bạn.


Hình 8.7 Chọn ActiveMovie control type library trong hộp thoại Add Reference

Ví dụ, tiện ích Console dưới đây sẽ chơi file audio được chỉ định trong đối số dòng lệnh
đầu tiên:
using System;

class PlayAudio {

public static void Main(string[] args) {

// Lấy tên file được chỉ định trong đối số đầu tiên.
string filename = args[0];

// Truy xuất giao diện IMediaControl.
QuartzTypeLib.FilgraphManager graphManager =
new QuartzTypeLib.FilgraphManager();
QuartzTypeLib.IMediaControl mc =
(QuartzTypeLib.IMediaControl)graphManager;

// Chỉ định tên file.
mc.RenderFile(filename);


The image part with relationship ID rId5 was not fo und in the file.
// Bắt đầu chơi file audio bất đồng bộ.
mc.Run();

Console.WriteLine("Press Enter to continue.");
Console.ReadLine();
mc.Stop();
}
}
Bạn cũng có thể sử dụng thư viện Quartz để hiển thị file video (sẽ được trình bày trong
mục 8.11).
1.3
Chơi file video
V
V


Bạn cần chơi một file video (như MPEG, AVI, hoặc WMV) ngay trên form.
#
#


Sử dụng thành phần ActiveMovie có trong Media Player. Gắn kết xuất video
vào một PictureBox trên form bằng cách thiết lập thuộc tính
IVideoWindow.Owner là thuộc tính PictureBox.Handle.
.NET Framework không chứa bất kỳ lớp được-quản-lý nào để tương tác với các file
video, nhưng bạn có thể sử dụng chức năng DirectShow của thư viện Quartz dựa-trên-
COM (có trong Windows Media Player và hệ điều hành Windows). Để biết cách tạo một
Interop Assembly cho th
ư viện Quartz, bạn hãy tham khảo mục 8.10.

Một khi đã tạo Interop Assembly, bạn có thể sử dụng giao diện IMediaControl để nạp và
chơi một file video. Về cơ bản, kỹ thuật này giống như kỹ thuật đã trình bày trong mục
8.10 với file audio. Tuy nhiên, nếu muốn hiển thị cửa sổ video ngay bên trong giao diện
ứng dụng của bạn (hơn là trong một cửa sổ độc lập), bạn ph
ải sử dụng giao diện
IVideoWindow. Đối tượng FilgraphManager có thể được ép kiểu thành giao diện
IMediaControl và IVideoWindow—và nhiều giao diện khác cũng được hỗ trợ như
IBasicAudio (cho phép bạn cấu hình các thiết lập balance và volume). Với giao diện
IVideoWindow, bạn có thể gắn kết xuất video vào một đối tượng trên form như Panel
hoặc PictureBox. Để làm được như vậy, bạn cần thiết lập thuộc tính
IVideoWindow.Owner là handle của điều kiểm đó (bạ
n có thể lấy được handle này bằng
thuộc tính Control.Handle). Kế tiếp, gọi IVideoWindow.SetWindowPosition để thiết lập
kích thước và vị trí của cửa sổ. Phương thức này cũng có thể được gọi để thay đổi kích
thước video trong quá trình playback (chẳng hạn, khi form bị thay đổi kích thước).
Ví dụ dưới đây cho phép người dùng mở bất kỳ file video nào và chơi nó trong một
PictureBox. PictureBox bị neo đến tất cả các cạnh của form, như thế nó c
ũng thay đổi
kích thước khi form bị thay đổi kích thước. Đoạn mã đáp ứng cho sự kiện
PictureBox.SizeChanged sẽ thay đổi kích thước của cửa sổ video tương ứng.
using System;
using QuartzTypeLib;
using System.Windows.Forms;

public class ShowMovie : System.Windows.Forms.Form {

private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.Button cmdOpen;

// (Bỏ qua phần mã designer.)


// Định nghĩa các hằng dùng để chỉ định window style.
private const int WM_APP = 0x8000;
private const int WM_GRAPHNOTIFY = WM_APP + 1;
private const int EC_COMPLETE = 0x01;
private const int WS_CHILD = 0x40000000;
private const int WS_CLIPCHILDREN = 0x2000000;

// Giữ tham chiếu mức-form đến giao diện Media Control,
// để đoạn mã có thể điều khiển playback cho
// movie được nạp hiện tại.
private IMediaControl mc = null;

// Giữ tham chiếu mức-form đến cửa sổ video trong
// trường hợp nó cần được thay đổi kích thước.
private IVideoWindow videoWindow = null;

private void cmdOpen_Click(object sender, System.EventArgs e) {

// Cho phép người dùng chọn file.
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter =
"Media Files|*.mpg;*.avi;*.wma;*.mov;" +
"*.wav;*.mp2;*.mp3|All Files|*.*";

if (DialogResult.OK == openFileDialog.ShowDialog()) {

// Dừng playback đối với movie hiện t
ại, nếu nó tồn tại.
if (mc != null) mc.Stop();


×