ĐẠI HỌC QUỐC GIA TP. HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN
KHOA CÔNG NGHỆ THÔNG TIN
TRẦN ANH DŨNG - 02HC022
PHAN TRUNG HIẾU – 02HC055 NGHIÊN CỨU CÔNG NGHỆ J2ME
XÂY DỰNG THƯ VIỆN VÀ CÔNG CỤ PHẦN MỀM
HỖ TRỢ PHÁT TRIỂN GAME
TRÊN ĐIỆN THOẠI DI ĐỘNG LUẬN VĂN CỬ NHÂN TIN HỌC
GIÁO VIÊN HƯỚNG DẪN
GV. Th.S TRẦN MINH TRIẾT – GV. VĂN CHÍ NAM NIÊN KHÓA 2002 – 2005
Chương 4Xử lý âm thanh
Trần Anh Dũng – 02HC022 43 Phan Trung Hiếu – 02HC055
Trần Anh Dũng – 02HC022 44 Phan Trung Hiếu – 02HC055
• MMAPI 1.1: phiên bản chỉnh sửa của MMAPI 1.0 với những thay đổi cho
tính năng phù hợp với tính bảo mật có trong MIDP 2.0. Bản đặc tả này
không thay đổi bất kỳ lớp hoặc phương thức nào so với MMAPI 1.0. Một số
phương thức trong MMAPI có thể phát sinh ngoại lệ SecurityException nếu
như chương trình chạy không theo quyền thích hợp. Một trong số các yêu
cầu về bảo mật bao gồm tính năng ghi lại (recording) và truy cập mạ
ng.
Những yêu cầu này nhằm đảm bảo quyền riêng tư của người dùng.
• MIDP 2.0 Media API (JSR 118): thư viện này là một tập con của MMAPI để
có thể chạy được trên các thiết bị cấp thấp có hỗ trợ MIDP 2.0. Vì vậy, nó có
một số yêu cầu như khả năng phát lại nhạc sử dụng rất ít tài nguyên hệ thống,
hỗ trợ việc phát lại các tông nhạc đơn giản, điề
u chỉnh âm lượng… Do
những yêu cầu trên nên thư viện đa phương tiện trong MIDP 2.0 thiếu một số
tính năng của MMAPI như: không hỗ trợ video, không hỗ trợ đồng bộ hóa
việc phát lại nhiều tập tin âm thanh cùng lúc.
• Thư viện bổ sung đa phương tiện (JSR 234): hỗ trợ bổ sung những khả năng
mới nhất của phần cứng như khả năng chụp ả
nh số và nghe đài radio. Một số
tính năng mới của nó bao gồm khả năng điều khiển độ sáng, độ tương phản,
đèn flash, chế độ sáng, phóng to hoặc thu nhỏ lại của máy chụp hình trong
điện thoại. Ngoài ra còn có những tính năng xử lý âm thanh nâng cao như tạo
các hiệu ứng âm thanh hay khả năng thay đổi cổng xuất chẳng hạn như ra loa
hoặc ra tai nghe.
Các đặc tính của MMAPI:
• Hỗ
trợ phát lại (playback) và ghi lại (recording) các tập tin đa phương tiện,
hỗ trợ định dạng âm thanh hay hình ảnh bất kỳ.
danh của MIME cho loại âm thanh WAV là “audio/x-wav”.
Kiểu định dạng của từng loại âm thanh chỉ xác định được cách chuyển các
bit dữ liệu thành âm thanh. Để có thể biểu diễn âm thanh trên điệ
n thoại di động
chúng ta còn phải xác định giao thức chuyển dữ liệu âm thanh từ máy chủ lên thiết
bị MIDP để dữ liệu âm thanh được chuyển đổi sang âm thanh.
Như vậy, việc xử lý tập tin đa phương tiện bao gồm hai thành phần:
Chương 4Xử lý âm thanh
Trần Anh Dũng – 02HC022 46 Phan Trung Hiếu – 02HC055
• Xử lý giao thức truyền: đọc dữ liệu từ một nguồn như tập tin hay máy chủ để
chuyển đến bộ phận xử lý nội dung.
• Xử lý nội dung: giải mã dữ liệu và xuất ra một thiết bị như loa hay màn hình
video.
Để dễ dàng lập trình hai bộ phận xử lý trên, MMAPI cung cấp hai đối tượng
cấp cao sau:
• DataSource: trừu tượng hóa phần xử lý giao thức bằ
ng cách ẩn đi cách đọc
dữ liệu từ nguồn.
• Player: đọc dữ liệu từ DataSource, xử lý và xuất ra thiết bị xuất. Lớp đối
tượng này cung cấp các phương thức để điều khiển việc phát lại các tập tin
âm thanh.
Ngoài ra, MMAPI còn cung cấp một đối tượng thứ ba là Manager cho phép
các lập trình viên tạo ra các đối tượng Player từ các đối tượng DataSource hoặc
InputStream. Qui trình của việc biểu diễ
n âm thanh được mô tả trong hình sau:
Hình 4-1 Qui trình biểu diễn âm thanh
Đối tượng Manager cung cấp kiểu nội dung âm thanh và giao thức cho đối
tượng Player thông qua phương thức createPlayer( ). Có thể có một hoặc vài điều
ContentDescriptor Mô tả kiểu nội dung của dữ liệu.
javax.microedition.
media.protocol
DataSource Biểu diễn một cách trừu tượng khả
năng xử lý các giao thức bằng cách
che đi chi tiết cách nhận dữ liệu từ tập
tin hay máy chủ. Đối tượng Player sử
dụng những phương thức của lớp này
để lấy dữ liệu.
Bảng 4-1 Các lớp trong MMAPI
Chương 4Xử lý âm thanh
Trần Anh Dũng – 02HC022 48 Phan Trung Hiếu – 02HC055
Các giao tiếp trong MMAPI được mô tả chi tiết trong bảng sau:
Gói Giao tiếp Mô tả
javax.microedition.
media
Control Điều khiển một số chức năng liên
quan đến xử lý đa phương tiện. Đối
tượng Control nhận được từ giao tiếp
Controllable, đối tượng Player mở
rộng Controllable nên có thể cung
cấp các điều khiển, ví dụ như
VolumeControl để điều khiển tăng
giảm âm thanh.
javax.microedition.
media
Controllable Cung cấp một giao tiếp để nhận về
đối tượng Control từ một đối tượng
Player hoặc từ các đối tượng khác.
đa phương tiện.
javax.microedition.
media.control
MIDIControl Điều khiển các thiết bị MIDI.
javax.microedition.
media.control
PitchControl Điều khiển độ cao thấp tương đối của
âm thanh mà không ảnh hưởng đến
tốc độ phát lại.
javax.microedition.
media.control
RateControl Điều khiển tốc độ phát lại của Player.
javax.microedition. RecordControl Điều khiển việc ghi âm thanh.
Chương 4Xử lý âm thanh
Trần Anh Dũng – 02HC022 49 Phan Trung Hiếu – 02HC055
media.control
javax.microedition.
media.control
StopTimeControl Xác định điểm dừng khi phát lại.
javax.microedition.
media.control
TempoControl Điều khiển nhịp độ khi phát lại.
javax.microedition.
media.control
ToneControl Cho phép phát lại một chuỗi tông
nhạc do người dùng định nghĩa.
javax.microedition.
media.control
VideoControl Điều khiển việc hiển thị video, ví dụ
Trần Anh Dũng – 02HC022 50 Phan Trung Hiếu – 02HC055
Các kiểu nội dung âm thanh:
Kiểu nội dung Giải thích
audio/midi Tập tin nhạc theo định dạng MIDI
audio/x-smaf Tập tin nhạc theo định dạng SMAF, là tập tin có phần mở
rộng .mmf của dòng điện thoại Samsung.
audio/x-wav Tập tin nhạc theo định dạng WAVE.
audio/x-tone-seq Chuỗi tông nhạc.
audio/mpeg Tập tin nhạc theo định dạng MP3.
audio/3gp Tập tin video theo định dạng 3GP
Bảng 4-4 Các kiểu nội dung âm thanh
Để xác định kiểu nội dung âm thanh của một đối tượng Player đang tồn tại ta
dùng phương thức getContentType( ).
4.1.5 Vòng đời của Player
Do việc biểu diễn âm thanh sử dụng ít tài nguyên trên thiết bị MIDP và các
tập tin âm thanh có dung lượng tương đối lớn nên đối tượng Player phải có một
vòng đời cho phép các hành vi của nó được điều khiển chính xác. Vòng đời này
được mô tả bằng các trạng thái là các giá trị
hằng xác định trong đối tượng Player.
Có năm trạng thái là: UNREALIZED, REALIZED, PREFETCHED, STARTED, và
CLOSED. Sáu phương thức sau được dùng để thay đổi trạng thái của đối tượng
Player: realize( ), prefetch( ), start( ), stop( ), deallocate( ), close( ).
Khi một đối tượng Player được tạo ra thì đầ u tiên nó sẽ ở trạng thái
UNREALIZED. Ở trạng thái này Player chưa dò tìm dữ liệu âm thanh và chưa yêu
cầu về tài nguyên phần cứng. Khi gọi phương thức realize( ) thì đối tượng Player sẽ
định vị dữ liệu âm thanh và chuyển sang trạng thái REALIZED, khởi động những
thông tin cần thiết để có thể nhận về nội dung tập tin. Gọi prefetch( ) sẽ chuyển sang
trạng thái PREFETCHED, ở trạng thái này Player sẽ tạo kết nối đến dữ liệu và thực
thi những tác vụ khởi động khác như điề u khiển thiết bị phần cứng, chuẩn bị và sử
Trần Anh Dũng – 02HC022 52 Phan Trung Hiếu – 02HC055
4.1.6 Điều khiển Player
Định thời của một Player là vị trí của đoạn âm thanh đang được phát. Ví dụ,
khi Player đang phát một đoạn âm thanh có thời lượng 4s được một nửa thì định
thời mang giá trị 2s. Nếu ta muốn chuyển đến vị trí bất kỳ trong đoạn âm thanh
đang phát ta có thể dùng hàm setMediaTime( ). Ta có thể xác định vị trí hiện hành
của đoạn âm thanh đang phát bằng hàm getMediaTime( ). Tổ
ng thời gian của đoạn
âm thanh ta có thể lấy được bằng hàm getDuration(). Tuy nhiên có một số định
dạng âm thanh ta không thể xác định được tổng thời gian biểu diễn nó, khi đó hàm
getDuration( ) trả về giá trị TIME_UNKNOWN.
Player cũng có thể được lặ p lại, nghĩa là một đoạn âm thanh có thể được
Player phát lại nhiều lầ n. Chúng ta có thể điều khiển đặc tính này bằng hàm
setLoopCount( ) trước khi Player bắt
đầu. Nếu đặt giá trị cho hàm này là -1 thì sẽ
lặp vô hạn định. Một đối tượng Player cung cấp những điều khiển (controls) cho
kiểu dữ liệu nó đang xử lý. Chúng ta có thể liệt kê một danh sách các controls cho
một Player bằng hàm getControls( ), đây là một phương thức mà Player kế thừa từ
giao diện Controllable. Phương thức này trả về một mảng các controls thích hợp với
Player. ABB chỉ định nghĩa một VolumeControl và một ToneControl nh
ưng khi
thực thi thì không cần cung cấp thêm control nào khác phù hợp với kiểu nội dung
âm thanh và các giao thức được hỗ trợ. Để nhận được chỉ một control, ta sử dụng
phương thức getControl( ) (cũng kế thừa từ Controllable). Tên của control là tên
của một giao tiếp trong gói javax.microedition.media.control. Để có thể trả về
control thì Player ít nhất phải ở trạng thái REALIZED. Ví dụ khi ta đang phát lại
một tập tin theo định dạng MIDI và gọi phương th
ức getControl( ) thì ta sẽ nhận về
một đối tượng điều khiển là MIDIControl. Để sử dụng VolumeControl định volume
ở giá trị trung bình ta có thể làm như sau:
“device” và kiểu nội dung âm thanh là “audio/x-tone-seq”.
Khi đã tạo Player để phát chuỗi tông nhạc, ta truyền cho Player này một
chuỗi các nốt sử dụng đối tượng ToneControl tương ứng của nó. Để xác định
control này ta dùng hàm getControl(“ToneControl”) và đảm bảo Player phải ít nhất
ở
trạng thái REALIZED.
Chương 4Xử lý âm thanh
Trần Anh Dũng – 02HC022 54 Phan Trung Hiếu – 02HC055
Tất cả các nốt đều được định nghĩa với chỉ số nốt và thời lượng. Chỉ số nốt
cũng giống như trong phương thức playTone( ) của Manager với giá trị 60 là nốt đô
trung và 69 là nốt la âm lượng 440Mhz trên nốt đo trung. Duration được xác định
bằng bội số của resolution, theo mặc định thì resolution của một chuỗi tông nhạc là
1/64 của nhịp 4/4. Vì vậy
duration là 64 tương ứng với một nốt nhạc nhịp 4/4.
Toàn bộ chuỗi tông nhạc phải bắt đầu với một phiên bản. Đây không phải là
phiên bản của dữ liệu âm thanh mà là phiên bản của dạng chuỗi tông nhạc mà ta
đang sử dụng. Hiện tại chỉ có một phiên bản được chấp nhận là phiên bản 1. Một
chuỗi tông nhạc đơn giản được mô tả như sau:
byte[] sequence = new byte[] {
ToneControl.VERSION, 1,
67, 16, // The
69, 16, // hills
67, 8, // are
65, 8, // a -
64, 48, // live
62, 8, // with
60, 8, // the
59, 16, // sound
57, 16, // of
ố lượng điện thoại có hỗ trợ thư viện
chuẩn này chưa nhiều, giá thành của điện thoại dử dụng MIDP 2.0 và có hỗ trợ
MMAPI còn khá cao và chưa được sử dụng rộng rãi. Vì vậy các thư viện hỗ trợ xử
lý âm thanh do các hãng sản xuất điện thoại cung cấp vẫn còn được sử dụng rộng
rãi. Tuy nhiên để có thể ứng dụng các thư viện lậ
p trình này vào việc xử lý âm
thanh thì cần thêm một số bước kỹ thuật để sản phẩm có thể chạy trên các dòng điện
thoại khác nhau. Bảng sau mô tả một số API của các nhà sản xuất điện thoại di động
cung cấp cho việc xử lý âm thanh.
STT Nhà cung cấp Tên gói
1 NoKia Com.nokia.mid.sound.*
2 SamSung Com.samsung.util.*
3 Sony Ericssion Javax.microedition.media.*
Javax.microedition.media.control.*
Bảng 4-5 API của một số nhà sản xuất
Chương 4Xử lý âm thanh
Trần Anh Dũng – 02HC022 56 Phan Trung Hiếu – 02HC055
4.2.1 Nokia API
Các API mà nhà sản xuất Nokia cung cấp chỉ hỗ trợ cho việc phát các âm
thanh dạng TONE, dạng WAV. TONE được lưu trữ theo dạng mảng các byte biểu
diễn cho tần số nốt nhạc như ví dụ sau:
byte[] dataIntro = {
(byte)0x02, (byte)0x4a, (byte)0x3a, (byte)0x40,
(byte)0x04, (byte)0x00, (byte)0x19, (byte)0x2a,
(byte)0xa2, (byte)0x34, (byte)0x49, (byte)0xaa,
(byte)0x17, (byte)0xa1, (byte)0x6a, (byte)0x12,
(byte)0xa1, (byte)0x1a, (byte)0x20, (byte)0xd5,
(byte)0x0b, (byte)0x50, (byte)0x00
};
}
return player;
}
Lớp chơi âm thanh trên Nokia.
Package example.tones;
import com.nokia.mid.sound.*; // import gói chơi âm thanh
class NokiaTonePlayer extends TonePlayer {
private final Sound sound; NokiaTonePlayer() {
sound = new Sound(0, 1L);
}
void play(int frequency) {
sound.init(frequency, 2000L);
sound.play(1);
}
void stop() {
sound.stop();
}
}
Vì không thể phát cùng lúc nhiều kênh âm thanh nên trong ứng dụng chỉ
chọn một trong hai cách sau: một là sử dụng âm thanh cho các hiệu ứng, hai là sử
dụng âm thanh làm nhạc nền mà không có âm thanh cho phần hiệu ứng.
Chương 4Xử lý âm thanh
Trần Anh Dũng – 02HC022 58 Phan Trung Hiếu – 02HC055
4.2.2 Samsung API hỗ trợ âm thanh và rung
Thư viện API cho điện thoại di động (ĐTDĐ) Samsung bao gồm AudioClip
để chơi nhạc, Vibration để tạ o rung, LCDLight để bật tắt đèn màn hình và cuối cùng
là SMS cho phép ta lập trình gửi tin nhắn SMS. Chúng ta chỉ tìm hiểu phần âm
thanh và rung.
4.2.2.1 Chơi nhạc với AudioClip
4.2.2.3 Sony Ericssion API
Với điện thoại Ericssion thì việc lập trình âm thanh tương đối dễ dàng hơn
các loại Nokia hay SAMSUNG. Do các loại điện thoại Ericssion hỗ trợ Java đều sử
dụng gói API về âm thanh được hỗ trợ trong MIDP 2.0.
4.3 Những khó khăn và hướng giải quyết khi xử lý âm thanh
Khi xử lý âm thanh sử dụng thư viện lập trình đa phương tiện MMAPI thì sẽ
có rất nhiều thuận lợi cho việc ứng dụng trên nhiều dòng điện thoại khác nhau vì
việc xử lý dựa trên một thư viện chuẩn. Tuy nhiên, hiện nay các dòng sản phẩm có
hỗ trợ MMAPI chưa nhiều và giá thành của điện thoại hỗ trợ MMAPI còn khá cao
và chưa được sử dụng rộng rãi. Vì vậy xây dựng
ứng dụng sử dụng thư viện này
chưa thể áp dụng phổ biến. Trong tương lai, với sự phát triển của công nghệ di
động, thì đây sẽ không còn là vấn đề nan giải.
Khi xử lý âm thanh sử dụng các thư viện lập trình âm thanh của các nhà sản
xuất điện thoại cung cấp, cụ thể là ba loại điện thoại khác nhau là Nokia, Samsung
và Ericssion, ta thấy cách lập trình xử lý âm thanh là khác nhau vì mỗi nhà sản xuất
đề
u cung cấp các API riêng và âm thanh mà mỗi nhà sản xuất dùng cho điệ n thoại
của họ cũng khác nhau.
Vậy làm sao khi viết một ứng dụng có thể chạy được trên các dòng sản phẩm
khác mà không cần phải viết nhiều lần cho nhiều dòng sản phẩm khác nhau? Cách
giải quyết như sau:
• Tạo lớp trừu tượng cho việc xử lý âm thanh chung, gồm các phương thức
chính có thể chơi nhạc.
• Tạo các lớ
p chơi âm thanh ứng với các dòng sản phẩm tương ứng kế thừa từ
lớp trừu tượng.
Chương 4Xử lý âm thanh
Trần Anh Dũng – 02HC022 60 Phan Trung Hiếu – 02HC055
}
}
Chương 4Xử lý âm thanh
Trần Anh Dũng – 02HC022 61 Phan Trung Hiếu – 02HC055
Lớp âm thanh cho SAMSUNG:
import com.samsung.util.*;
public class SoundSS extends AbSound {
// Khai báo các bin âm thanh
// Cài đặt tất cả các phương thức trừu tượng
public void PlaySound(int j, int k, int l){
// Code play nhc ca Samsung
}
public void StopSound(){
// Code Stop nhc ca Samsung
}
public synchronized void sound(byte type){
//Code của Samsung
}
public void Vibration(){
// Code của Samsung
}
public void Light(){
// Code của Samsung
}
}
Tương tự cho các dòng điện thoại khác ta cũng cài đặt như vậy. Sau đó để sử
dụng ta cần có lớp Detect Sound như sau:
public class DetectSound{
public DetectSound(String s, String s1){}
những ưu khuyết
điểm riêng của nó và việc sử dụng thư viện nào cho ứng dụng của
mình còn tùy thuộc vào các điều kiện cụ thể. Tóm lại, với sự có mặt của âm thanh
các ứng dụng trên điện thoại di động sẽ hấp dẫn hơn rất nhiề u.