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
Trang 1TRẦ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
Trang 2Chương 4 Xử lý âm thanh
Việc xử lý âm thanh trên điện thoại di động trong J2ME được hỗ trợ bởi thư viện lập trình đa phương tiện trên nền tảng MIDP – Mobile Media API (MMAPI)
và các thư viện lập trình được cung cấp bởi các nhà sản xuất cho từng dòng điện thoại Các điện thoại sử dụng MIDP 2.0 đã được hỗ trợ thư viện lập trình đa phương tiện MMAPI như một chuẩn chung cho các dòng điện thoại Tuy nhiên các điện thoại sử dụng MIDP 1.0 muốn xử lý âm thanh phải dựa trên các thư viện lập trình
âm thanh do nhà sản xuất cung cấp Để tìm hiểu cách thức xử lý âm thanh trên điện thoại di động ta lần lượt tìm hiểu các thư viện lập trình hỗ trợ xử lý âm thanh
4.1 Thư viện lập trình đa phương tiện trong J2ME
Thư viện lập trình đa phương tiện – Mobile Media API (MMAPI) là một gói thư viện tùy chọn hỗ trợ các khả năng đa phương tiện như âm thanh hay video cho ứng dụng trên thiết bị di động dựa trên nền tảng MIDP
4.1.1 Tổng quan về MMAPI
Thư viện MMAPI là một phiên bản rút gọn của Java Media Framework (JMF), một gói trong J2SE, được thiết kế để có thể chạy trên bất kỳ máy ảo nào dựa trên J2ME, bao gồm các máy ảo hỗ trợ CLDC (thường trên các điện thoại di động) hay CDC (trên các máy trợ giúp số cá nhân PDA hay smartphone) MMAPI có các phiên bản và thư viện bổ sung sau:
• MMAPI 1.0 (JSR 135): một gói thư viện tùy chọn cho nền tảng J2ME, thư viện này cung cấp một giao diện lập trình ứng dụng (API) chuẩn để phát lại
và thu các định dạng đa phương tiện như nhạc hoặc video Đây là thư viện chuẩn với số đặc tả là JSR 135, được thiết kế với khả năng mềm dẻo để có thể mở rộng và không phụ thuộc vào thiết bị cũng như nền tảng MMAPI không phụ thuộc vào bất kỳ định dạng lưu trữ, giao thức truyền dữ liệu hoặc những khả năng của các thiết bị phần cứng
Trang 3• 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ỳ
• Sử dụng ít tài nguyên của hệ thống, chạy được với những cấu hình rất thấp của các thiết bị dựa trên CLDC như điện thoại di động
• Không phân biệt giao thức cũng như định dạng
Trang 4• Khả năng lựa chọn: chỉ sử dụng một số tính năng Chẳng hạn khi lập trình chỉ cần hỗ trợ các tính năng âm thanh cơ bản hay hỗ trợ một vài định dạng nào đó thì ta có thể giới hạn các tính năng khác vì không cần dùng đến
• Khả năng mở rộng: những tính năng mới có thể được thêm vào mà không làm ảnh hưởng đến các tính năng trước đó Hiện nay MMAPI chưa hỗ trợ khả năng định dạng tập tin và các lớp điều khiển cho từng định dạng, các tính năng này có thể được bổ sung trong tương lai
• Khả năng tùy chọn cho các nhà sản xuất thiết bị: mặc dù thư viện này cung cấp các tính năng cho nhiều mục đích khác nhau nhưng nó phải cho phép các nhà sản xuất bỏ qua một số tính năng nếu như thiết bị của họ không hỗ trợ
4.1.2 Xử lý tập tin đa phương tiện trong MIDP 2.0 với MMAPI
Tập hợp các hàm hỗ trợ âm thanh của MMAPI được tích hợp trong MIDP 2.0 được gọi là Audio Building Block (ABB), cung cấp khả năng phát các tông nhạc và các đoạn âm thanh ABB được thi hành trong các gói javax.microedition.media và javax.microedition.media.control
Có rất nhiều loại dữ liệu âm thanh Dữ liệu này được định dạng thành những tập tin khác nhau tùy thuộc vào cách các bit dữ liệu tham gia vào quá trình biểu diễn
âm thanh Các loại âm thanh thông thường là MP3, AIFF, và WAV Trong ABB của MIDP 2.0, các loại âm thanh được xác định dựa trên kiểu định danh đa phương tiện của MIME (Multipurpose Internet Mail Extension) bằng cách dùng một chuỗi
để xác định phần chính và phần mở rộng của loại âm thanh đó Ví dụ như kiểu định 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:
Trang 5• 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
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
khiển được kết hợp với một đối tượng Player để xác định tham số cho việc phát âm
javax.microedition.media.Control là một giao tiếp biểu diễn điều khiển còn gói javax.microedition.media.control chứa các thành phần của giao tiếp điều khiển Mối quan hệ giữa các đối tượng tham gia vào quá trình biểu diễn âm thanh được mô tả như sau:
Trang 6Hình 4-2 Mối quan hệ giữa các đối tượng 4.1.3 Các thành phần của MMAPI
• javax.mecroedition.media cung cấp một số giao tiếp, một lớp ngoại lệ MediaException và đặc biệt là lớp Manager, đây chính là nơi bắt đầu để nhận
về các đối tượng Player
• javax.mecroedition.media.control định nghĩa những điều khiển cụ thể được
sử dụng với đối tượng Player như VolumeControl, VideoControl,…
• javax.mecroedition.media.protocol cung cấp các giao thức cho việc định nghĩa các điều khiển tùy biến, ví dụ như lớp DataSource là một lớp trừu tượng để xử lý nội dung các tài nguyên
Các lớp trong MMAPI được mô tả trong bảng sau:
javax.microedition
media
Manager Điểm bắt đầu nhận đối tượng Player
để xử lý các tập tin đa phương tiện javax.microedition
để lấy dữ liệu
Bảng 4-1 Các lớp trong MMAPI
Trang 7Các giao tiếp trong MMAPI được mô tả chi tiết trong bảng sau:
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 javax.microedition
media
Player Dùng để phát lại các tập tin đa
phương tiện Đối tượng này cung cấp những phương thức để quản lý vòng đời của Player
javax.microedition
media
PlayerListener Dùng để nhận được các đối tượng
phát sinh từ đối tượng Player
javax.microedition
media
TimeBase Một nguồn liên tục các nhịp thời
gian, dùng để đo thời gian cho việc đồng bộ hóa việc phát lại nhiều Player cùng một lúc
GUIControl Nếu các điều khiển hỗ trợ giao tiếp
đồ họa thì cần cung cấp phần hiện thực cho giao tiếp này
javax.microedition
media.control
MetaDataControl Dùng để nhận các thông tin về tập tin
đa phương tiện
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
Trang 8VideoControl Điều khiển việc hiển thị video, ví dụ
như vị trí tương đối so với Canvas javax.microedition
media.control
VolumeControl Điều khiển âm lượng
javax.microedition
media.protocol
SourceStream Được dùng chung với đối tượng
DataSource để cung cấp giao tiếp cho việc nhận dữ liệu từ Player
Bảng 4-2 Các giao tiếp của MMAPI 4.1.4 Các giao thức và các kiểu âm thanh được hỗ trợ trong MIDP 2.0
MIDP 2.0 rất phức tạp trong việc xác định các giao thức và kiểu nội dung để
thực thi Vì vậy, đối tượng Manager cung cấp hai phương thức để xác định kiểu nội
dung âm thanh và giao thức chuyển dữ liệu âm thanh lên MIDP như sau:
public static String getSupportedContentTypes(String protocol) public static String getSupportedProtocols(String content_type)
Chúng ta có thể tìm ra kiểu nội dung âm thanh dựa trên một giao thức và ngược lại Nếu ta cung cấp giá trị null cho cả hai phương thức trên ta sẽ nhận được một danh sách kiểu nội dung âm thanh hay một danh sách các giao thức Các giao thức và kiểu nội dung âm thanh được mô tả trong bảng sau:
Giao thức Giải thích
device Giao thức lấy dữ liệu từ thiết bị
http Giao thức truyền tập tin Đây là giao thức mạng chuẩn, khi ta xác
định một tập tin đa phương tiện với giao thức HTTP thì toàn bộ tập tin này sẽ được download về trước khi phát ra âm thanh
resource Giao thức lấy dữ liệu từ tài nguyên hệ thống
file Giao thức lấy dữ liệu từ tập tin
Bảng 4-3 Các giao thức truyền dữ liệu
Trang 9Cá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ử
dụng bộ đệm Khi gọi start( ), thì Player bắt đầu xử lý dữ liệu và trạng thái được
chuyển thành STARTED Khi toàn bộ nội dung đã được phát lại xong thì đối tượng
Player sẽ được chuyển về trạng thái PREFETCHED Gọi phương thức close( ) sẽ
Trang 10chuyển sang trạng thái CLOSED, xác nhận Player đã giải phóng tất cả tài nguyên, ngắt kết nối và không được sử dụng lại
Các phương thức realize( ), prefetch( ) và start( ) được thực thi tuần tự, nếu
ta bỏ qua một phương thức nào thì các trạng thái sẽ ngầm định và các phương thức
bỏ qua vẫn được thực thi Nếu có lỗi xảy ra trong quá trình tìm dữ liệu nguồn hay truy cập tài nguyên hệ thống thì các phương thức trên sẽ thông báo ngoại lệ MediaException
Có nhiều phương thức cho phép quay về trạng thái trước đó Phương thức
stop( ) sẽ chuyển Player từ trạng thái STARTED về trạng thái PREFETCHED
Phương thức deallocate( ) chuyển Player từ trạng thái PREFETCHED hoặc trạng
thái STARTED về trạng thái REALIZED bằng cách giải phóng toàn bộ tài nguyên
Phương thức deallocate( ) cũng có thể chuyển Player từ trạng thái bị mắc kẹt giữa
UNREALIZED và REALIZED khi chưa nhận được dữ liệu về trạng thái UNREALIZED
Cuối cùng, phương thức close( ) chuyển Player từ bất kỳ trạng thái nào về
trạng thái CLOSED Tất cả tài nguyên được giải phóng, ngắt mọi kết nối và chấm dứt vòng đời của Player Sơ đồ sau đây mô tả vòng đời của đối tượng Player:
Hình 4-3 Vòng đời của Player
Trang 114.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:
// Player player = Manager.createPlayer( );
player.prefetch();
VolumeControl vc = (VolumeControl)player.getControl("VolumeControl");
vc.setLevel(50);