1.1
Phát tiếng “beep” của hệ thống
V
VBạ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;
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ế
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
VBạ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.
// Đị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();