Java ME – MMAPI

API para Sons, músicas e vídeos em Java ME.

A Mobile Media API é uma API poderosa, que faz reprodução e captura de aúdio e vídeo. Permite acesso a serviços multimídia nativos em alguns aparelhos, permitindo reprodução de vídeo, áudio, captura de som e imagens.

A MMAPI depende da implementação da máquina virtual, logo depende do fabricante do celular ter habilitado o Java a executar determinado tipo de mídia. Alguns dos tipos mais usados são arquivos wav, mid e mpg.

Conceitos fundamentais da API:
– Player: controla arquivos de um determinado tipo de mídia.
– Control: muda o comportamento do player, como mudar o volume.
– DataSource: fonte da mídia – JAR, RMS, sistema de arquivos do celular.
– Manager: acessa recursos do sistemas e ponte entre interfaces citadas.

O relacionamento destas classes é ilustrado na figura abaixo:

Estes conceitos são necessários tanto para capturar fotos, como gravar vídeos e tocar músicas.

Manager.playTone(int note, int duration, int volume)

Nota Frequência Hz MIDI Tom
A4 440.00 69
A# 466.16 70
B 493.88 71
C 523.25 72
C# 554.36 73
D 587.33 74
D# 622.25 75
E 659.25 76
F 698.45 77
F# 739.98 78
G 783.99 79
G# 830.60 80

MIDlet para tocar arquivo multimídia

import javax.microedition.media.Manager;
import javax.microedition.media.Player;
public class SimplePlayer extends MIDlet {
  public void startApp() {
    try {
      Player tocador = Manager.createPlayer(
        getClass().getResourceAsStream("/audio/tiro.wav"),"audio/x-wav");
      tocador.start();
    } catch(Exception e) {}
  }
  public void pauseApp() {}
  public void destroyApp(boolean unconditional) {}
}

criando um InputStream de um arquivo .wav, incluido no JAR do MIDlet. O arquivo esta na pasta audio/ e chama tiro.wav

Você pode substituir o arquivo .wav por midi, tom, e qualquer outro formato de audio inclusive alguns de vídeo, dependente do celular. Para qualquer um, basta criar o Player através da classe Manager e chamar o método start().

Formas de uso da MMAPI

http://download.oracle.com/javame/config/cldc/opt-pkgs/api/mm/jsr135/index.html

Cenário 1: Geração de Tom Simples

    try {
      Manager.playTone(ToneControl.C4, 5000 /* millisec */, 100 /* max vol */);
    } catch (MediaException e) { }

Cenário 2: Simples Tocador de Mídia com repetição

    try {
       Player p = Manager.createPlayer("http://webserver/music.mp3");
       p.setLoopCount(5);
       p.start();
    } catch (IOException ioe) { 
    } catch (MediaException me) { }

Cenário 3: Tocador com controle fino

     static final long SECS_TO_MICROSECS = 1000000L;
     Player p;
     VolumeControl vc;
     try {
        p = Manager.createPlayer("http://webserver/music.mp3");
        p.realize(); // Set a listener.
        p.addPlayerListener(new Listener());
        // Grab volume control for the player.
        // Set Volume to max.
        vc = (VolumeControl)p.getControl("VolumeControl");
        if (vc != null) vc.setLevel(100); // Set a start time.
          p.setMediaTime(5 * SECS_TO_MICROSECS);
          // Guarantee that the player can start with the smallest latency.
        p.prefetch();
        // Non-blocking start
        p.start();
      } catch (IOException ioe) { } catch (MediaException me) { }
      class Listener implements PlayerListener {
        public void playerUpdate(Player p, String event, Object eventData) {
          if (event == END_OF_MEDIA || event == STOP_AT_TIME) {
            System.out.println("Done processing");
            try {
              p.setMediaTime(5 * SECS_TO_MICROSECS);
              p.start();
            } catch (MediaException me) { }
            break;
          }
        }
      }

Cenário 4: Tocador de MIDI com algum Controle fino

     Player p;
     TempoControl tc;
     try {
        p = Manager.createPlayer("http://webserver/tune.mid");
        p.realize(); // Grab the tempo control.
        tc = (TempoControl)p.getControl("TempoControl");
        tc.setTempo(120000); // 120 beats/min
        p.start();
     } catch (IOException ioe) { }
     catch (MediaException me) { }

Cenário 5: Tocador de Video

     Player p;
     VideoControl vc;
     try {
        p = Manager.createPlayer("http://webserver/movie.mpg");
        p.realize(); // Grab the video control and set it to the current display.
        vc = (VideoControl)p.getControl("VideoControl");
        if (vc != null) {
           Form form = new Form("video");
           form.append((Item)vc.initDisplayMode(vc.USE_GUI_PRIMITIVE, null));
           Display.getDisplay(midlet).setCurrent(form);
        }
        p.start();
     } catch (IOException ioe) { }
     catch (MediaException me) { }

Cenário 6: Tocador de mídia armazenada no RMS

     RecordStore rs;
     int recordID; : // code to set up the record store.
     try {
        InputStream is = new ByteArrayInputStream(rs.getRecord(recordID));
        Player p = Manager.createPlayer(is, "audio/X-wav");
        p.start();
     } catch (IOException ioe) { }
     catch (MediaException me) { }

Cenário 7: Tocador de mídia armazenada no JAR

     /** Notice that in MIDP 2.0, the wav format is mandatory only */
     /** in the case that the device supports sampled audio. */
     try {
        InputStream is = getClass().getResourceAsStream("audio.wav");
        Player p = Manager.createPlayer(is, "audio/X-wav");
        p.start();
     } catch (IOException ioe) { 
     } catch (MediaException me) { }

Cenário 8: Sincronização de diferentes tocadores

     Player p1, p2;
     try {
        p1 = Manager.createPlayer("http://webserver/tune.mid");
        p1.realize();
        p2 = Manager.createPlayer("http://webserver/movie.mpg");
        p2.realize();
        p2.setTimeBase(p1.getTimeBase());
        p1.prefetch();
        p2.prefetch();
        p1.start();
        p2.start();
     } catch (IOException ioe) { 
     } catch (MediaException me) { }

Cenário 9: Geração de sequencia de tons

     /** * "Mary Had A Little Lamb" has "ABAC" structure.
     * Use block to repeat "A" section. */
     byte tempo = 30; // set tempo to 120 bpm
     byte d = 8; // eighth-note
     byte C4 = ToneControl.C4;
     byte D4 = (byte)(C4 + 2); // a whole step
     byte E4 = (byte)(C4 + 4); // a major third
     byte G4 = (byte)(C4 + 7); // a fifth byte
     rest = ToneControl.SILENCE; // rest
     byte[] mySequence = {
        ToneControl.VERSION, 1, // version 1
        ToneControl.TEMPO, tempo, // set tempo
        ToneControl.BLOCK_START, 0, // start define "A" section
        E4,d, D4,d, C4,d, E4,d, // content of "A" section
        E4,d, E4,d, E4,d, rest,d,
        ToneControl.BLOCK_END, 0, // end define "A" section
        ToneControl.PLAY_BLOCK, 0, // play "A" section
        D4,d, D4,d, D4,d, rest,d, // play "B" section
        E4,d, G4,d, G4,d, rest,d,
        ToneControl.PLAY_BLOCK, 0, // repeat "A" section
        D4,d, D4,d, E4,d, D4,d, C4,d // play "C" section
     }
     try{
        Player p = Manager.createPlayer(Manager.TONE_DEVICE_LOCATOR);
        p.realize();
        ToneControl c = (ToneControl)p.getControl("ToneControl");
        c.setSequence(mySequence);
        p.start();
     } catch (IOException ioe) { 
     } catch (MediaException me) { }

Cenário 10: Captura e gravação

     try { // Create a DataSource that captures live audio.
        Player p = Manager.createPlayer("capture://audio");
        p.realize(); // Get the RecordControl, set the record location, and
        // start the Player and record for 5 seconds.
        RecordControl rc = (RecordControl)p.getControl("RecordControl");
        rc.setRecordLocation("file:/tmp/audio.wav");
        rc.startRecord();
        p.start();
        Thread.currentThread().sleep(5000);
        p.stop();
        rc.stopRecord();
        rc.commit();
     } catch (IOException ioe) { 
     } catch (MediaException me) { 
     } catch (InterruptedException e) { }

Cenário 11: Camera

     Player p;
     VideoControl vc; // initialize camera
     try {
        p = Manager.createPlayer("capture://video");
        p.realize(); // Grab the video control and set it to the current display.
        vc = (VideoControl)p.getControl("VideoControl");
        if (vc != null) {
           Form form = new Form("video");
           form.append((Item)vc.initDisplayMode(vc.USE_GUI_PRIMITIVE, null));
           Display.getDisplay(midlet).setCurrent(form);
        }
        p.start();
        byte[] image = vc.getSnapshot(null); // do something with the image ...
     } catch (IOException ioe) { 
     } catch (MediaException me) { }

Leave a Reply

Your email address will not be published. Required fields are marked *