• Thứ Hai, 17/10/2005 14:58 (GMT+7)

    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 J2ME hỗ trợ các khả năng 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.

    Thư viện lập trình đa phương tiện J2ME (MMAPI - Mobile Media API) 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. Bài viết này sẽ trình bày kiến trúc kỹ thuật của MMAPI cũng như các ví dụ thực tế để bạn đọc có thể thử các khả năng của thư viện này.

    Tổng quan về MMAPI

    Thư viện MMAPI đượ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). Bộ công cụ lập trình JaUmi của Samsung hỗ trợ lập trình cũng như kiểm tra các tính năng của thư viện MMAPI.

    MMAPI được thiết kế với những đặc tính sau:

    – 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ư ĐTDĐ.

    – Không phân biệt nghi thức cũng như định dạng.

    – Khả năng chỉ sử dụng một số tính năng: các lập trình viên có thể giới hạn những tính năng trong chương trình, ví dụ như chỉ hỗ trợ tính năng âm thanh cơ bản hay chỉ hỗ trợ một vài định dạng nào đó.

    – Khả năng mở rộng: những khả năng mới có thể được thêm vào mà không được làm ảnh hưởng đến các tính năng trước đó. Một số ví dụ như khả năng mở rộng thêm các định dạng tập tin hay khả năng bổ sung các lớp điều khiển cho từng định dạng.

     

    BẢNG 1: CÁC LỚP TRONG MMAPI

     
     

    Gói

     

     

    Lớp

     

     

    Mô tả

     
     

    javax.microedition.media

     

     

    Manager

     

     

    Điểm bắt đầu để nhận các đối tương Player để xử lý các tập tin đa phương tiện.

     
     

    javax.microedition.media.protocol

     

     

    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, ví dụ như từ một tập tin hay từ máy chủ. Đối tượng Player sử dụng những phương thức của lớp này để nhận các dữ liệu nhập.

     

    – 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ợ.

    Việc xử lý tập tin đa phương tiện bao gồm 2 thành phần:

    – 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 nó ra một thiết bị xuất như loa hay màn hình video.

    Để dễ dàng lập trình 2 bộ phận xử lý trên, MMAPI cung cấp cho lập trình viên 2 kiểu đối tượng cấp cao:

    – DataSource: trừu tượng hoá phần xử lý giao thức bằng cách che đi cách đọc dữ liệu từ một nguồn nào đó.

    – Player: lớp này đọc dữ liệu từ DataSource, xử lý và xuất ra. Lớp 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 và hình ảnh.

    MMAPI còn cung cấp một đối tượng thứ ba là Manager hoạt động theo cơ chế “factory pattern” cho phép 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.

    Chu kỳ sống của đối tượng Player gồm có 5 trạng thái sau: 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. Khi gọi phương thức realize() thì đối tượng này sẽ chuyển sang trạng thái REALIZED và 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 trạng thái sang PREFETCHED, ở trạng thái này đối tượng 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. Khi chúng ta gọi start() thì đối tượng sẽ 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ẽ chuyển trạng thái thành CLOSED.

    Một đối tượng Player cung cấp những điều khiển cho kiểu dữ liệu nó đang xử lý. Các bạn có thể sử dụng phương thức getControl() để nhận về một đối tượng Control hoặc gọi getControls() để nhận về một mảng các Control. Ví dụ như bạn đang phát lại một tập tin theo định dạng MIDI và gọi phương thức getControl() thì bạn sẽ nhận về một đối tượng MIDIControl.

    MMAPI bao gồm 3 gói sau:

    javax.microedition.media cung cấp một số giao tiếp (interface), 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.microedition.media.control định nghĩa những điều khiển cụ thể có thể được sử dụng với đối tượng Player như VolumeControl, VideoControl, và các điều khiển khác.
    javax.microedition.media.protocol định nghĩa những giao thức cho việc xử lý các điều khiển tuỳ biến, ví dụ như lớp DataSource là một lớp trừu tượng để xử lý nội dung của các tài nguyên.

    Những lớp, giao tiếp và ngoại lệ trong các gói trên được mô tả trong bảng 1, 2 và 3.

    Sử dụng MMAPI

    Phần này sẽ trình bày những ví dụ thực tế sử dụng các API của MMAPI, ở đây tôi chỉ trình bày những đoạn mã quan trọng. Nếu muốn tìm hiểu sâu hơn hay cần các ví dụ hoàn chỉnh, các bạn có thể xem ví dụ mmademo có trong bộ công cụ phát triển của Sun và Samsung.

    Phát sinh tông nhạc


    Việc phát sinh tông nhạc bao gồm việc xác định tần số và khoảng thời gian. Kiểu âm thanh này rất quan trọng cho các game cũng như các ứng dụng âm thanh khác trên các thiết bị nhỏ. Với các thiết bị nhỏ, hỗ trợ âm thanh có thể chỉ giới hạn ở việc hỗ trợ phát lại các tông nhạc.

    Phương thức Manager.playTone() sẽ phát sinh các tông nhạc. Thường thì các nhà sản xuất sẽ hỗ trợ bằng cách sử dụng bộ phát sinh tông nhạc của phần cứng. Bạn chỉ việc xác định nốt nhạc, khoảng thời gian và âm lượng.

    ...

    try {

    // phát tông nhạc trong 4000 mili giây với âm lượng 100

    Manager.playTone()(ToneControl.C4, 4000, 100);

    }

    catch(MediaException me) {

    }

    ...

    Bạn cũng có thể tạo ra một đối tượng Player để tổng hợp các chuỗi tông nhạc.

    ...

    Player player =

    Manager.createPlayer(Manager.TONE_DEVICE_LOCATOR);

    ...

    Kiểu Player này cung cấp cho bạn một đối tượng ToneControl để lập trình chuỗi các tông nhạc. Tuy nhiên tính năng này có thể không có trên tất cả các thiết bị.

    Phát lại tập tin MP3

    Đoạn mã sau đây minh hoạ cách phát lại một tập tin mp3 một cách đơn giản nhất:

    ...

    try {

    Player p = Manager.createPlayer

    (“
    http://www.javavietnam.org/somemusic.mp3”);

    p.setLoopCount(5);

    p.start();

    }

    catch(IOException ioe) {

    }

    catch(MediaException e) {

    }

    ...

    Đoạn mã sau bổ sung thêm một số điều khiển âm thanh:

    ...

    Player p;

    VolumeControl vc;

    try {

    p = Manager.createPlayer(“
    http://www.javavietnam.org/somemusic.mp3”);

    p.realize();

    // Nhận điều khiển âm thanh và đặt âm lượng lên tối đa

    vc = (VolumeControl) p.getControl(“VolumeControl”);

    if(vc != null) {

    vc.setVolume(100);

    }

    // dùng để hạn chế độ trễ của Player

    p.prefetch();

    // hàm này thoát ra ngày mà không đợi đến khi kết thúc

    p.start();

    }

    catch(IOException ioe) {

    }

    catch(MediaException e) {

    }

    ...

     

    BẢNG 2: CÁC GIAO TIẾP (INTERFACE) CỦA MMAPI

     
     

    Gói

     

     

    Giao tiếp

     

     

    Mô tả

     

     

    javax.microedition.media

     

     

    Control

     

     

    Dùng để điều khiển một số chức năng liên quan đến xử lý đa phương tiện. Các đố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 chỉnh âm thanh.

     

     

    javax.microedition.media

     

     

    Controllable

     

     

    Cung cấp một giao tiếp để nhận về các đố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 để điều khiển việc 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ý chu kỳ sống của Player

     

     

    javax.microedition.media

     

     

    PlayerListener

     

     

    Dùng để nhận các sự kiện 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ộ hoá việc phát lại nhiều Player cùng lúc.

     

     

    javax.microedition.media.control

     

     

    FramePositionControl

     

     

    Điều khiển vị trí chính xác của các khung hình video.

     

     

    javax.microedition.media.control

     

     

    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.

     

     

    javax.microedition.media.control

     

     

    MIDIControl

     

     

    Dùng để đ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.media.control

     

     

    RecordControl

     

     

    Điều khiển việc ghi lại.

     
     

    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 độ phát lại.

     

     

    javax.microedition.media.control

     

     

    ToneControl

     

     

    Cho phép phát lại một chuỗi các 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ụ 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 của Player.

     

    Lớp Manager cũng hỗ trợ phương thức Manager.createPlayer() với tham số InputStream nên bạn có thể phát lại nhạc từ Record Management System (RMS), hoặc từ trong tập tin JAR. Đây là ví dụ cách lấy InputStream từ RMS và phát lại đoạn nhạc lưu trong đó:

    ...

    RecordStore store;

    int id;

    // phát lại từ record store RMS

    try {

    InputStream is = new ByteArrayInputStream

    (store.getRecord(id));

    Player player = Manager.createPlayer(is, “audio/X-wav”);

    p.start();

    }

    catch (IOException ioe) {

    }

    catch (MediaException me) {

    }

    ...

    Và đây là đoạn mã ví dụ cách phát lại nhạc từ tập tin lưu trữ trong tập tin nén JAR:

    ...

    try {

    InputStream is =

    getClass().getResourceAsStream(“audio.wav”);

    Player player = Manager.createPlayer(is, “audio/X-wav”);

    p.start();

    }

    catch(IOException ioe) {

    }

    catch(MediaException me) {

    }

    ...

     

    Bảng 3: NGOẠI LỆ (EXCEPTION) CỦA MMAPI

     
     

    Gói

     

     

    Ngoại lệ

     

     

    Mô tả

     

     

    javax.microedition.media

     

     

    MediaException

     

     

    Dùng để báo một lỗi không mong đợi trong các phương thức xử lý đa phương tiện.

     

     

     

    Bảng 4: Những kiểu nội dung (content type) được điện thoại Samsung E730 hỗ trợ

     
     

    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 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

     

     

    video/3gp

     

     

    Tập tin video theo định dạng 3GP

     

     

     

    Bảng 5: Những giao thức (protocol) được điện thoại Samsung E730 hỗ trợ

     
     

    Giao thức

     

     

    Giải thích

     

     

    device

     

     

    Giao thức lấy dữ liệu từ thiết bị

     

     

    http

     

     

    Giao thức mạng chuẩn HTTP

     

     

    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 6: Giá trị các thuộc tính của điện thoại Samsung E730

     
     

    Thuộc tính hệ thống

     

     

    Giá trị trong E730

     

     

    Giải thích

     

     

    microedition.media.version

     

     

    1.1

     

     

    Hỗ trợ MMAPI 1.1

     

     

    supports.mixing

     

     

    false

     

     

    Không hỗ trợ tổng hợp âm thanh, nghĩa là không cùng phát lại 2 âm thanh từ 2 Player cùng lúc

     

     

    supports.audio.capture

     

     

    false

     

     

    Không hỗ trợ thu âm thanh

     

     

    supports.video.capture

     

     

    false

     

     

    Không hỗ trợ chụp hình

     

     

    supports.recording

     

     

    false

     

     

    Không hỗ trợ thu lại video

     

     

    audio.encodings

     

     

    null

     

     

    Không hỗ trợ thu âm thanh

     

     

    video.encodings

     

     

    null

     

     

    Không hỗ trợ chụp hình

     

     

    video.snapshot.encodings

     

     

    null

     

     

    Không hỗ trợ chụp hình

     

     

    streamable.contents

     

     

    null

     

     

    Không hỗ trợ phát lại từ dữ liệu dòng (streaming)

     

    Phát lại tập tin video mpeg

    Đoạn mã sau minh hoạ cách phát lại một tập tin video theo định dạng mpeg:

    ...

    Player p;

    VideoControl vc;

    try {

    p = Manager.createPlayer(“
    http://www.javavietnam.org/somemovie.mpg”);

    p.realize();

    // nhận về điều khiển video

    vc = (VideoControl) p.getControl(“VideoControl”);

    ....

    p.start();

    }

    catch(IOException ioe) {

    }

    catch(MediaException me) {

    }

    ...

    Lấy thông số hỗ trợ kiểu nội dung và giao thức của điện thoại

    Đoạn mã sau minh hoạ cách lấy thông số về những hỗ trợ kiểu nội dung (content type) và giao thức (protocol) được điện thoại hỗ trợ:

    ...

    String[] contentTypesArray = Manager.getSupportedContentTypes(null);

    for (int i = 0; i < contentTypesArray.length; i++) {

    System.out.println(“Content Type “ + contentTypesArray[i]);

    }

    String[] protocolsArray = Manager.getSupportedProtocols(null);

    for (int i = 0; i < protocolsArray.length; i++) {

    System.out.println(“Protocol “ + protocolsArray[i]);

    }

    ...

    Lấy các thuộc tính hệ thống được định nghĩa trong MMAPI

    Đoạn mã sau minh hoạ cách lấy các thuộc tính hệ thống để kiểm tra khả năng hỗ trợ xử lý đa phương tiện của điện thoại:

    ...

    System.out.println(“microedition.media.version=” + System.getProperty(“microedition.media.version”));

    System.out.println(“supports.mixing=” + System.getProperty(“supports.mixing”));

    System.out.println(“supports.audio.capture=” + System.getProperty(“supports.audio.capture”));

    System.out.println(“supports.video.capture=” + System.getProperty(“supports.video.capture”));

    System.out.println(“supports.recording=” + System.getProperty(“supports.recording”));

    System.out.println(“audio.encodings=” + System.getProperty(“audio.encodings”));

    System.out.println(“video.encodings=” + System.getProperty(“video.encodings”));

    System.out.println(“video.snapshot.encodings=” + System.getProperty(“video.snapshot.encodings”));

    System.out.println(“streamable.contents=” + System.getProperty(“streamable.contents”));
    ...

    Kết luận

    Bài viết đã giới thiệu một cái nhìn tổng quan về thư viện xử lý đa phương tiện MMAPI và những ví dụ cụ thể cách phát lại các tập tin âm thanh và video. Để phát triển ứng dụng đa phương tiện cho model ĐTDĐ cụ thể, bạn cần nắm rõ những đặc tính kỹ thuật của điện thoại có liên quan đến khả năng này. (Bảng 4, 5 và 6 là các đặc tính kỹ thuật liên quan của điện thoại Samsung E730, model ĐTDĐ được sử dụng chính thức cho cuộc thi Mobile Games 2005).

     

    Bảng 7: So sánh MMAPI 1.0, MMAPI 1.1, MIDP 2.0 Media API và Thư viện bổ sung cho đa phương tiện

     
     

    Đặc tả

     

     

    Mô tả

     

     

    MMAPI 1.0
    (JSR 135)

     

     

    Mobile Media API (MMAPI) là một gói thư viện tuỳ 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à một 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.

     

     

    MMAPI 1.1

     

     

    MMAPI 1.1 là bản chỉnh sửa của MMAPI 1.0 với những thay đổi cho phù hợp với tính năng 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ư nếu như chương trình chạy không đủ 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 bảo đảm quyền riêng tư của người dùng. Điện thoại Samsung E730 hỗ trợ MMAPI 1.1.

     

     

    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 âm thanh phát ra,... Do những yêu cầu này 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ư: chỉ hỗ trợ phát lại nhạc mà không hỗ trợ video, không hỗ trợ đồng bộ hoá 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)

     

     

    Thư viện này 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 ngõ xuất chẳng hạn như ra loa hoặc ra tai nghe.

     


    Nguyễn Ngọc Minh
    minhnn – www.JavaVietnam.org
    -----------------------------------------------
    Tài liệu tham khảo:
    1. Comparing J2ME Multimedia Options (developers.sun.com)
    2. The J2ME Mobile Media API (developers.sun.com)
    3. JSR 135: Mobile Media API (jcp.org)
    4. Chương trình ví dụ mmademo trong Samsung JaUmi Wireless Tookit

    ID: A0509_128