Grabar vídeo en un archivo de una aplicación del dispositivo BlackBerry

  1. Importe las clases necesarias.
    import net.rim.device.api.ui.*;
    import net.rim.device.api.ui.component.*;
    import net.rim.device.api.ui.container.*;
    import net.rim.device.api.system.*;
    import java.io.*;
    import java.lang.*;
    import javax.microedition.media.*;
    import javax.microedition.media.control.*;
  2. Cree el marco de la aplicación ampliando la clase UiApplication. En main(), cree una instancia de la clase nueva e invoque enterEventDispatcher() para activar la aplicación para recibir eventos. En el constructor de la aplicación, invoque pushScreen() para mostrar la pantalla personalizada para la aplicación. La clase VideoRecordingDemoScreen, que se describe en el paso 3, representa la pantalla personalizada.
    public class VideoRecordingDemo extends UiApplication
    {
         public static void main(String[] args)
         {
              VideoRecordingDemo app = new VideoRecordingDemo();
              app.enterEventDispatcher();
         }
         public VideoPlaybackDemo()
         {
              pushScreen(new VideoRecordingDemoScreen());
         }
    }
  3. Cree el marco para la pantalla personalizada ampliando la clase MainScreen. Declare una instancia de la clase VideoRecorderThread, como se describe en el paso 5.
    class VideoRecordingDemoScreen extends MainScreen
    {	
        private VideoRecorderThread _recorderThread;
        public VideoRecordingDemoScreen()
        {
        }
    }
  4. En el constructor de la VideoRecordingDemoScreen, invoque setTitle() para especificar el título de la pantalla. Invoque addMenuItem() dos veces para agregar los elementos de menú que inician y detienen la grabación, como se describe en el paso 5.
    public VideoRecordingDemoScreen()
    {
       setTitle("Video recording demo");
       addMenuItem(new StartRecording());
       addMenuItem(new StopRecording());
    }
  5. En la clase VideoRecordingDemoScreen, defina los elementos de menú para iniciar y detener la grabación. Los elementos de menú invocan los métodos VideoRecorederThread.start() y VideoRecorederThread.stop(), que se describen en el paso 6.
    private class StartRecording extends MenuItem 
    {
        public StartRecording() 
        {
            super("Start recording", 0, 100);
        }
        public void run() 
        {
            try 
            {
                VideoRecorderThread newRecorderThread = new VideoRecorderThread();
                newRecorderThread.start();
                _recorderThread = newRecorderThread;
            } 
            catch (Exception e) 
            {
                Dialog.alert(e.toString());
            }
        }
    }
    private class StopRecording extends MenuItem 
    {
        public StopRecording() 
        {
            super("Stop recording", 0, 100);
        }
        public void run() 
        {
             try 
             {
                 if (_recorderThread != null) 
                 { 
                     _recorderThread.stop();
                 }
             } 
             catch (Exception e) 
             {
                 Dialog.alert(e.toString());
             }
         }
    }
  6. En la clase Screen VideoRecordingDemo, defina una clase interna que amplíe Thread e implemente PlayerListener. En la clase, cree una variable del tipo Player y una variable del tipo RecordControl para grabar archivos multimedia de Player.
    Nota: Tenga en cuenta que no es necesario que grabe el vídeo en un subproceso distinto, ya que las operaciones de grabación están encadenadas por defecto.
    private class VideoRecorderThread extends Thread implements javax.microedition.media.PlayerListener
    {
        private Player _player;
        private RecordControl _recordControl;
        VideoRecorderThread()
        {
        }
    }
  7. En la clase VideoRecorderThread, implemente run(). En run(), cree un bloque try/catch e invoque Manager.createPlayer(String locator) para crear un objeto Player para capturar vídeo, utilizando como parámetro un valor que especifique qué codificación utilizar para grabar vídeo.
    public void run() 
    {
        try 
        {
            _player = javax.microedition.media.Manager.createPlayer(
                             "capture://video?encoding=video/3gpp");
        }
        catch( IOException e ) 
        {
            Dialog.alert(e.toString());
        }
        catch( MediaException e ) 
        {
            Dialog.alert(e.toString());
        }
    }
  8. Invoque Player.addPlayerListener(). Especifique this como un parámetro porque VideoRecorderThread implementa PlayerListener.
    public void run() 
    {
        try 
        {
            _player = javax.microedition.media.Manager.createPlayer(
                             "capture://video?encoding=video/3gpp");
            _player.addPlayerListener(this);
        }
        catch( IOException e ) 
        {
            Dialog.alert(e.toString());
        }
        catch( MediaException e ) 
        {
            Dialog.alert(e.toString());
        }
    }
  9. Invoque Player.realize() para inicializar el objeto VideoControl.
    public void run() 
    {
        try 
        {
            _player = javax.microedition.media.Manager.createPlayer(
                             "capture://video?encoding=video/3gpp");
            _player.addPlayerListener(this);
            _player.realize();
            VideoControl videoControl = (VideoControl) 
                                         _player.getControl("VideoControl");
        }
        catch( IOException e ) 
        {
            Dialog.alert(e.toString());
        }
        catch( MediaException e ) 
        {
            Dialog.alert(e.toString());
        }
    }
  10. A continuación, invoque Player.getControl("VideoControl") para recuperar el objeto VideoControl.
    public void run() 
    {
        try 
        {
            _player = javax.microedition.media.Manager.createPlayer(
                             "capture://video?encoding=video/3gpp");
            _player.addPlayerListener(this);
            _player.realize();
            VideoControl videoControl = (VideoControl) _player.getControl("VideoControl");
            _recordControl = (RecordControl) _player.getControl( "RecordControl" );
        }
        catch( IOException e ) 
        {
            Dialog.alert(e.toString());
        }
        catch( MediaException e ) 
        {
            Dialog.alert(e.toString());
        }
    }
  11. Invoque VideoControl.initDisplayMode(int mode, Object arg). Para inicializar el modo que utiliza un campo de vídeo, pase un parámetro arg para especificar la primitiva de IU que muestra el vídeo. Asigne el objeto devuelto como objeto Field.
    Nota: Puede invocar initDisplayMode() de diferentes formas para devolver Field o Item para mostrar un vídeo en una clase Canvas de un MIDlets.
    public void run() 
    {
        try 
        {
            _player = javax.microedition.media.Manager.createPlayer(
                             "capture://video?encoding=video/3gpp");
            _player.addPlayerListener(this);
            _player.realize();
            VideoControl videoControl = (VideoControl) _player.getControl("VideoControl");
            _recordControl = (RecordControl) _player.getControl( "RecordControl" );
            Field videoField = (Field) videoControl.initDisplayMode(VideoControl.USE_GUI_PRIMITIVE, "net.rim.device.api.ui.Field");
        }
        catch( IOException e ) 
        {
            Dialog.alert(e.toString());
        }
        catch( MediaException e ) 
        {
            Dialog.alert(e.toString());
        }
    }
  12. En un bloque try/catch, invoque VideoControl.setDisplaySize() para establecer el tamaño del visor para supervisar su grabación. En el siguiente código de ejemplo, el tamaño está establecido en la pantalla completa del dispositivo. Invoque add() para agregar el visor a la pantalla.
    public void run() 
    {
        try 
        {
            _player = javax.microedition.media.Manager.createPlayer(
                             "capture://video?encoding=video/3gpp");
            _player.addPlayerListener(this);
            _player.realize();
            VideoControl videoControl = (VideoControl) _player.getControl("VideoControl");
            _recordControl = (RecordControl) _player.getControl( "RecordControl" );
            Field videoField = (Field) videoControl.initDisplayMode(
                                          VideoControl.USE_GUI_PRIMITIVE,
                                          "net.rim.device.api.ui.Field");
            try
            {
                videoControl.setDisplaySize( Display.getWidth(), Display.getHeight() );
            }
            catch( MediaException me )
            {
                // setDisplaySize is not supported
            }
            add(videoField);
        }
        catch( IOException e ) 
        {
            Dialog.alert(e.toString());
        }
        catch( MediaException e ) 
        {
            Dialog.alert(e.toString());
        }
    }
  13. Invoque RecordControl.setRecordLocation() para especificar la ubicación del dispositivo donde se guardará la grabación de vídeo.
    public void run() 
    {
        try 
        {
            _player = javax.microedition.media.Manager.createPlayer(
                             "capture://video?encoding=video/3gpp");
            _player.addPlayerListener(this);
            _player.realize();
            VideoControl videoControl = (VideoControl) _player.getControl("VideoControl");
            _recordControl = (RecordControl) _player.getControl( "RecordControl" );
            Field videoField = (Field) videoControl.initDisplayMode(
                                          VideoControl.USE_GUI_PRIMITIVE,
                                          "net.rim.device.api.ui.Field");
            try
            {
                videoControl.setDisplaySize( Display.getWidth(), Display.getHeight() );
            }
            catch( MediaException me )
            {
                // setDisplaySize is not supported
            }
            add(videoField);
            _recordControl.setRecordLocation("file:///store/home/user/VideoRecordingTest.3gpp" );      
        }
        catch( IOException e ) 
        {
            Dialog.alert(e.toString());
        }
        catch( MediaException e ) 
        {
            Dialog.alert(e.toString());
        }
    }
  14. Invoque RecordControl.startRecord() para empezar a grabar el vídeo y para empezar a reproducir el contenido multimedia de Player. Invoque Player.start() para iniciar Player.
    public void run() 
    {
        try 
        {
            _player = javax.microedition.media.Manager.createPlayer(
                             "capture://video?encoding=video/3gpp");
            _player.addPlayerListener(this);
            _player.realize();
            VideoControl videoControl = (VideoControl) _player.getControl("VideoControl");
            _recordControl = (RecordControl) _player.getControl( "RecordControl" );
            Field videoField = (Field) videoControl.initDisplayMode(
                                          VideoControl.USE_GUI_PRIMITIVE,
                                          "net.rim.device.api.ui.Field");
            try
            {
                videoControl.setDisplaySize( Display.getWidth(), Display.getHeight() );
            }
            catch( MediaException me )
            {
                // setDisplaySize is not supported
            }
            add(videoField);        
            _recordControl.setRecordLocation("file:///store/home/user/VideoRecordingTest.3gpp" );
            _recordControl.startRecord(); 
            _player.start();
        }
        catch( IOException e ) 
        {
            Dialog.alert(e.toString());
        }
        catch( MediaException e ) 
        {
            Dialog.alert(e.toString());
        }
    }
  15. En VideoRecorderThread, implemente el método Thread de la interfaz stop(). Compruebe que Player no sea null e invoque Player.close() para iniciar los recursos del objeto Player. A continuación, configure Player en null.
    public void stop() 
    {
        if (_player != null) 
        {
            _player.close();
            _player = null;
        }
    }
  16. Compruebe que RecordControl no sea null e invoque RecordControl.stopRecord() para detener la grabación. En un bloque try/catch, invoque RecordControl.commit() para guardar la grabación en un archivo específico. A continuación, configure RecordControl en null.
    public void stop() 
    {
        if (_player != null) 
        {
            _player.close();
            _player = null;
        }
        if (_recordControl != null) 
        {
            _recordControl.stopRecord();
            try 
            {
                _recordControl.commit();
            } 
            catch (Exception e) 
            {
                Dialog.alert(e.toString());
            }
            _recordControl = null;
        }
    }
  17. En VideoRecorderThread, implemente el método PlayerListener de la interfaz playerUpdate() que se invoca cuando el objeto Player genera un evento. En el siguiente código de ejemplo, se muestra información sobre el evento.
    public void playerUpdate(Player player, String event, Object eventData) 
    {
        Dialog.alert("Player " + player.hashCode() + " got event " + event + ": " + eventData);
    }

¿Le ha resultado útil esta información? Envíenos sus comentarios.