- Mobile Media API
-
Mobile Media API (MMAPI, JSR-135) — набор классов для J2ME, который позволяет проигрывать звук и видео; часть MIDP 2.0.
Содержание
Назначение
- Единообразный способ проигрывания всех видов звука и видео, независимо от того, находятся ли они в файле или загружаются через интернет.
- Задержки, возникающие в результате загрузки файлов и приведения телефона в нужное состояние, находятся под контролем программиста.
Поддерживаемые форматы
MIDP 2.0 требует, чтобы телефон играл тоновые звуки и звуки в формате WAV. Проигрывание остальных форматов (MIDI, MP3, AMR, 3GP, MPEG-4, MMF, iMelody) необязательно. Тем не менее, на всех телефонах де-факто проигрывается MIDI.
Важнейшие классы
Классы MMAPI находятся в пакете
javax.microedition.media
.Класс Manager служит для создания плееров. Все плееры имеют интерфейс Player. В составе MMAPI есть и другие классы и интерфейсы, которые служат для управления громкостью, реакции на события и т. д.
Пять состояний плеера
Плеер имеет пять состояний:
UNREALIZED
(только что созданный);REALIZED
(загруженный);PREFETCHED
(готовый к проигрыванию);STARTED
(в состоянии проигрывания);CLOSED
(плеер больше не нужен).
Только что созданный функцией
Manager.createPlayer()
плеер находится в состоянииUNREALIZED
.Функция
realize()
загружает все ресурсы, нужные для проигрывания, за исключением «ценных и дефицитных» (в частности, читает файл или связывается с сервером). Плеер переводится из состоянияUNREALIZED
в состояниеREALIZED
. Вызов функцииrealize()
может занимать некоторое время.Функция
prefetch()
загружает «ценные и дефицитные ресурсы»; плеер переходит из состоянияUNREALIZED
илиREALIZED
в состояниеPREFETCHED
. Вызов функцииprefetch()
также может занимать некоторое время. В большинстве реализаций MMAPI в состоянииPREFETCHED
может находиться только один плеер.Функция
start()
запускает проигрывание, переводя плеер из состоянийUNREALIZED
,REALIZED
илиPREFETCHED
в состояниеSTARTED
. Если плеер был в состоянииPREFETCHED
, функцияstart()
гарантированно вызывается мгновенно. Если плеер перемотан на конец, функцияstart()
начинает проигрывание сначала.Функция
close()
вызывается, когда плеер больше не нужен. Плеер переходит в состояниеCLOSED
, и в этом состоянии его может уничтожить сборщик мусора.Чтобы остановить плеер, вызывается функция
stop()
. При этом он переходит из состоянияSTARTED
в состояниеPREFETCHED
(и никуда не перематывается).Чтобы освободить дефицитные ресурсы, вызывается функция
deallocate()
. При этом он переходит из состоянияSTARTED
илиPREFETCHED
в состояниеREALIZED
.Функция
deallocate()
имеет ещё одну важную роль. Если перевод плеера в состояниеREALIZED
не завершился (то есть, файл не загружен до конца), загрузка файла прерывается, и плеер остаётся в состоянииUNREALIZED
.В состояние
UNREALIZED
пути нет.Интерфейс Control
Пустой интерфейс
Control
служит базой для конструирования различных интерфейсов управления проигрыванием. Несколько наследниковControl
определено в пакетеjavax.microedition.media.control
:ToneControl
,VolumeControl
,MIDIControl
и т. д.Простейший пример кода
import javax.microedition.media.*; Player p = Manager.createPlayer("http://www.fishy.com/my.mp3", "audio/mp3"); p.start();
Телефоны, поддерживающие MMAPI
MMAPI является частью MIDP 2.0. То есть, любой телефон, поддерживающий MIDP 2.0, обязан поддерживать MMAPI. Вот (не исчерпывающий) список телефонов с MIDP 1.0, которые поддерживают MMAPI.
- Все телефоны Series 60, кроме 7650 и Siemens SX1.
- Все модели с поддержкой J2ME.
- Все модели с экраном 101×80 (M55, S55 и др.) имеют собственный набор классов для проигрывания мультимедиа, похожий на MMAPI.
Проблемы
MMAPI предназначен для проигрывания звука, видео и т. д. в мультимедийных приложениях. Например, на телефоне Motorola E398 встроенный аудиоплеер написан на Java, с использованием MMAPI. Однако MMAPI плохо подходит для реализации звуковых эффектов в мобильных играх, так как у каждого телефона свои тонкости. Одни позволяют держать все звуки одновременно в состоянии
PREFETCHED
и проигрывать их в любой момент; в других приходится прибегать к различным ухищрениям. Бывают и менее очевидные тонкости. Бывает, что между остановкой и повторным проигрыванием плеера должно пройти некоторое время, на некоторых отнюдь не устаревших моделях это время составляет 1—2 с!Некоторые «тонкости» в действительности являются прямыми нарушениями стандарта.
Наиболее распространённые нарушения стандарта
По стандарту, если плеер находится в состоянии
UNREALIZED
, командаstart()
сначала переведёт его вREALIZED
, затем вPREFETCHED
, затем вSTARTED
. Некоторые телефоны не допускают таких «перепрыгиваний»; требуется явно задаватьrealize()
,prefetch()
,start()
.Некоторые телефоны загружают файлы отложенно, что также противоречит стандарту. Предположим, плеер создан и переведён в состояние
PREFETCHED
. По стандарту, командаstart()
должна вызываться мгновенно. Но некоторые реализации MMAPI проводят загрузку только по командеstart()
(и лишь повторныеstart()
действительно вызываются мгновенно).По стандарту, если проигрывание закончилось, то после повторной команды
start()
плеер должен начать проигрывание сначала. На некоторых телефонах такой плеер ничего не играет, пока не будет явно перемотан назад функциейsetMediaTime(0)
.В ожидании MIDP 3.0
Предполагается, что ещё не вышедший MIDP 3.0 решит этот разнобой, ужесточив требования к реализации MMAPI.
Ссылки
Категории:- Java
- Java ME
Wikimedia Foundation. 2010.