Technologie mobilne
Laboratorium
Zadanie 3 podstawy multimediów w JME
Pakiet opcjonalny Mobile Media API
Nie wszystkie urządzenia pozwalają na zaawansowaną pracę z zasobami multimedialnymi. Dlatego
obsługa multimediów odbywa się poprzez opcjonalny pakiet MMAPI. Początkowo profil MIDP (w
wersji 1.0) nie zawierał żadnego pakietu wspierającego programistę w obsłudze multimediów. W
wersji 2.0 do profilu MIDP został dołączony podzbiór MMAPI, odpowiedzialny za pracę z plikami
dzwiękowymi. Tak więc dopóki ograniczamy się do prostych operacji na plikach dzwiękowych, nie
trzeba używać pakietu opcjonalnego MMAPI. Dzięki temu aplikacja ma szansę działać na licznych
urządzeniach mobilnych.
Zaawansowana praca z multimediami wymaga jednak MMAPI, oczywiście ograniczając zbiór
docelowych platform do tych urządzeń mobilnych, które opcjonalny pakiet MMAPI implementują.
Klasa Manager
Klasa Manager jest punktem startowym dla każdej aplikacji multimedialnej w JME. Spełnia ona
trzy zasadnicze zadania :
" umożliwia stworzenie obiektu klasy Player, służącego do odtwarzania multimediów,
" pozwala sprawdzić, jakie typy zawartości i jakie protokoły są obsługiwane,
" pozwala generować pojedyncze dzwięki.
Wszystkie metody tej klasy są statyczne.
Sprawdzanie obsługiwanych typów zawartości (content-types) oraz protokołów
Zadanie to realizują następujące metody klasy Manager:
" public static java.lang.String[] getSupportedContentTypes(java.lang.String
protocol)
" public static java.lang.String[] getSupportedProtocols(java.lang.String
content_type)
Przykładowe protokoły: http, rtp (protokół do strumieniowania mediów), capture (protokół dostępu
do urządzeń takich jak aparat cyfrowy/kamera).
Przykładowe typy zawartości : audio/x-wav, video/mpeg, audio/midi, video/quicktime, audio/x-
tone-seq.
Generowanie dzwięków
Klasa Manager zawiera statyczną metodę :
public static void playTone(int note, int duration, int volume)
Pozwala on odegrać pojedynczy dzwięk (nutę). Dwa ostatnie parametry określają czas trwania
dzwięku (w ms) oraz jego głośność (w skali 0 100). Pierwszy parametr to nuta do odegrania (z
zakresu 0 127 ). Dzwięk A przyjmuje wartość 69.
Tak więc efekt podobny do gammy powinno dać wykonanie następującego kodu :
Tworzenie obiektu klasy Player
Klasa Manager zawiera statyczną metodę :
public static Player createPlayer(java.lang.String locator)
Pozwala ona stworzyć obiekt klasy Player odpowiedzialny za odtwarzanie zasobu
multimedialnego. Lokator to parametr określający lokalizację zasobu. Ma postać :
[protokół] :// [adres i parametry wskazujące zasób]
Przykładowe wartości parametru locator:
" "http://www.quicktimeflix.net/qtlogo3.mov" (plik .mov dostępny przez http),
" capture://video (domyślna kamera urządzenia mobilnego).
Dalsze przykłady można znalezć w dokumentacji.
W przypadku niepowodzenia przy tworzenie obiektu klasy Player, zostanie rzucony wyjątek
MediaException. Metoda createPlayer() występuje również w innych wariantach, przyjmuje wtedy
nieco inny zestaw parametrów. Zainteresowanych odsyłam do dokumentacji.
Korzystanie z klasy Player
Obiekt klasy Player może się znajdować w jednym z pięciu stanów :
" UNREALIZED stan początkowy, Player nie posiada wystarczających informacji, aby
pobrać dany zasób,
" REALIZED Player posiada wszystkie niezbędne dane potrzebne do pobrania
multimedialnego zasobu,
" PREFETCHED zasób multimedialny jest gotowy do odtwarzania, niezbędne operacje
niskopoziomowe zostały wykonane,
" STARTED odtwarzanie zasobu,
" CLOSED zamknięty, nie może być już używany.
Metody, odpowiadające za przechodzenie pomiędzy kolejnymi stanami zostały pokazane na
diagramie.
Inne przydatne metody klasy Player :
" setLoopCount() definiuje, ile razy należy odtworzyć zasób (-1 odtwarzanie ciągłe),
" [get/set]MediaTime() ustawia/pobiera aktualny {czas} odtwarzanego zasobu,
" [add/remove]PlayerListener dodaje/usuwa obiekt nasłuchujący zdarzeń związanych z
Player'em.
PlayerListener
Za nasłuchiwanie i reagowanie na zdarzenia związane z Player'em odpowiedzialne są obiekty
implementujące interfejs PlayerListener. Interfejs ten zawiera jedną metodę :
void playerUpdate(Player player, java.lang.String event,
java.lang.Object eventData)
Pierwszy parametr określa obiekt klasy Player, którego dotyczy zdarzenie, drugi zawiera nazwę
zdarzenia, a trzeci dane związane ze zdarzeniem. Jak widać, ostatni parametr jest typu Object.
Rzeczywisty typ tego parametru zależy od rodzaju zdarzenia. Zadaniem programisty jest
rozpoznanie typu zdarzenia oraz rzutowanie parametru z danymi na odpowiedni typ, co pozwoli na
wydobycie odpowiednich danych.
Tak więc, jeśli chcemy nasłuchiwać na zmiany głośności odtwarzanego zasobu (i przy wykryciu tej
zmiany nie robić nic sensownego, tylko wypisać poziom głośności), implementacja metody
playerUpdate() będzie wyglądała tak :
Control
Multimedia można kontrolować. Każdy aspekt, który może podlegać kontroli i na który
programista może wpływać, jest reprezentowany przez osobny interfejs dziedziczący z interfejsu
Control.
Każdy obiekt, który może podlegać kontroli, implementuje interfejs Controllable, definiując
metody :
" public Control[] getControls() zwraca wszystkie obiekty typu Control dostępne dla
obiektu podlegającego kontroli,
" public Control getControl(String controlType) zwraca obiekt kontrolujący podanego
typu dla obiektu podlegającego kontroli.
Klasa Player podlega kontroli, implementuje interfejs Controllable, możemy zatem korzystać z
wyżej wymienionych metod. To, jakie obiekty kontrolujące będą dostępne, zależy od typu zasobu,
który jest przetwarzany przez Player.
Jeśli przy pomocy Player'a otwieramy plik dzwiękowy, będzie na pewno dostępny obiekt
kontrolujący implementujący interfejs VolumeControl, pozwalający na zmianę głośności dzwięku.
VolumeControl jest też dostępny dla filmów, towarzyszą mu wtedy jednak dodatkowe kontrolery,
np. odpowiedzialny za wyświetlanie filmu VideoControl.
VideoControl posiada metodę :
java.lang.Object initDisplayMode(int mode, java.lang.Object arg)
pozwalającą stworzyć graficzną reprezentację filmu. W przypadku CLDC i MIDP metoda ta zwraca
Item, który może być np. dodany do formularza (gdy mode ==
VideoControl.USE_GUI_PRIMITIVE) lub rysuje film w obiekcie klasy Canvas (gdy mode ==
VideoControl.USE_DIRECT_VIDEO i arg określa Canvas, w którym film ma być rysowany).
Drugim z ww. przypadków nie będziemy się zajmować.
Czas najwyższy na przykładowy kod.
Pozwala on odtwarzać w nieskończoność film dostępny przez HTTP.
Efekt wygląda mniej więcej tak :
Przypomnienie
Pamiętajmy, że metoda commandAction() musi się wykonać natychmiast, a tworzenie nowego
Playera, zwłaszcza w oparciu o zasób dostępny przez internet, jest czasochłonne. Dlatego takie
czasochłonne zadania wykonywane w metodzie commandAction() należy uruchomić w osobnym
wątku, w jakiś sposób informując klienta, że musi poczekać (np. poprzez wyświetlenie Alertu przed
odpaleniem wątku).
Zadania
1. Przygotuj formularz. Do formularza dodaj element odpowiedzialny za wyświetlanie filmu
video. Odtwórz film o adresie podanym przez prowadzącego.
2. Dodaj komendy odpowiedzialne za pauzę oraz wznawianie odtwarzania filmu. Gdy film jest
w trakcie odtwarzania, dostępna ma być tylko komenda pauzy, natomiast gdy jest
wstrzymany, dostępna ma być tylko komenda odpowiedzialna za wznowienie odtwarzania.
3. Do formularza dodaj pasek Gauge, reprezentujący głośność odtwarzania dzwięku. Dodaj
komendy do zwiększania oraz zmniejszania poziomu głośności o 10. Zmiany poziomu
dzwięku, wykrywane przez PlayerListener, mają być widoczne na pasku Gauge.
Wyszukiwarka
Podobne podstrony:
Sekrety skutecznych prezentacji multimedialnych24#5901 dydaktyk aplikacji multimedialnychmicros multimetry www przeklej plKOMLOGO Multimedialny Pakiet Logopedyczny część I i II(1)hash multimapMultimediaService LabInstructionMultimedia W112008 02 Multimedia dla początkujących użytkowników [Poczatkujacy]strony sprawdzain multimediaZastosowanie nowoczesnego e learningu i multimediów w edukacjiSekrety skutecznych prezentacji multimedialnychwięcej podobnych podstron