Enregistrer une vidéo dans un fichier à l'aide d'une application de terminal BlackBerry

  1. Importez les classes requises.
    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. Créez le cadre d'application en développant la classe UiApplication. Dans main(), créez une instance de la nouvelle classe et appelez enterEventDispatcher() pour activer l'application et recevoir des événements. Dans le constructeur d'application, appelez pushScreen() pour afficher l'écran personnalisé de l'application. La classe VideoRecordingDemoScreen, décrite à l'étape 3, représente l'écran personnalisé.
    public class VideoRecordingDemo extends UiApplication
    {
         public static void main(String[] args)
         {
              VideoRecordingDemo app = new VideoRecordingDemo();
              app.enterEventDispatcher();
         }
         public VideoPlaybackDemo()
         {
              pushScreen(new VideoRecordingDemoScreen());
         }
    }
  3. Créez le cadre de l'écran personnalisé en développant la classe MainScreen. Déclarez une instance de la classe VideoRecorderThread, décrite à l'étape 5.
    class VideoRecordingDemoScreen extends MainScreen
    {	
        private VideoRecorderThread _recorderThread;
        public VideoRecordingDemoScreen()
        {
        }
    }
  4. Dans le constructeur VideoRecordingDemoScreen, appelez setTitle() pour indiquer le titre de l'écran. Appelez addMenuItem() à deux reprises pour ajouter les options de menu démarrant et arrêtant l'enregistrement, comme décrit à l'étape 5.
    public VideoRecordingDemoScreen()
    {
       setTitle("Video recording demo");
       addMenuItem(new StartRecording());
       addMenuItem(new StopRecording());
    }
  5. Dans la classe VideoRecordingDemoScreen, définissez les éléments de menu de démarrage et d'arrêt de l'enregistrement. Les éléments de menu appellent les méthodes VideoRecorederThread.start() et VideoRecorederThread.stop(), décrites à l'étape 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. Dans la classe screen VideoRecordingDemo, définissez une classe interne développant Thread et déployant PlayerListener. Dans la classe, créez une variable de type Player et une variable de type RecordControl pour enregistrer du contenu multimédia depuis l'objet Player.
    Remarque : Il n'est pas obligatoire d'enregistrer la vidéo dans un fil séparé, car les opérations d'enregistrement sont conçues de manière à contenir plusieurs fils.
    private class VideoRecorderThread extends Thread implements javax.microedition.media.PlayerListener
    {
        private Player _player;
        private RecordControl _recordControl;
        VideoRecorderThread()
        {
        }
    }
  7. Dans la classe VideoRecorderThread, implémentez run(). Dans run(), créez un bloc try/catch et appelez Manager.createPlayer(String locator) pour créer un objet Player afin de capturer la vidéo, utilisant comme paramètre une valeur indiquant le codage à utiliser pour enregistrer la vidéo.
    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. Appelez Player.addPlayerListener(). Indiquez this en tant que paramètre car VideoRecorderThread déploie 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. Appelez Player.realize() pour initialiser l'objet 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. Ensuite, appelez Player.getControl("VideoControl") pour récupérer l'objet 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. Appelez VideoControl.initDisplayMode(int mode, Object arg). Pour initialiser le mode qu'un champ vidéo utilise, transmettez un paramètre arg pour indiquer l'interface utilisateur primitive lisant la vidéo. Convertissez l'objet renvoyé en objet Field.
    Remarque : Vous pouvez appeler initDisplayMode() de différentes façons pour renvoyer un objet Field ou pour qu'un objet Item lise une vidéo dans une classe Canvas dans un MIDlet.
    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. Dans un bloc try/catch, appelez VideoControl.setDisplaySize() pour définir la taille du viseur permettant de contrôler votre enregistrement. Dans l'échantillon de code suivant, la taille est définie sur le plein écran du terminal. Appelez add() pour ajouter le viseur à l'écran.
    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. Appelez RecordControl.setRecordLocation() pour indiquer l'emplacement de l'enregistrement vidéo sur le terminal.
    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. Appelez RecordControl.startRecord() pour lancer l'enregistrement vidéo et commencer à lire le contenu multimédia depuis l'objet Player. Appelez Player.start() pour démarrer 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. Dans VideoRecorderThread, implémentez la méthode Thread de l'interface stop(). Vérifiez que Player n'est pas null et appelez Player.close() pour libérer les ressources de l'objet Player. Définissez Player sur null.
    public void stop() 
    {
        if (_player != null) 
        {
            _player.close();
            _player = null;
        }
    }
  16. Vérifiez que RecordControl n'est pas null et appelez RecordControl.stopRecord() pour arrêter l'enregistrement. Dans un bloc try/catch, appelez RecordControl.commit() pour enregistrer la capture dans un fichier précis. Définissez RecordControl sur 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. Dans VideoRecorderThread, implémentez la méthode PlayerListener de l'interface playerUpdate() appelée lorsque l'objet Player génère un événement. Dans l'échantillon de code suivant, les informations relatives à l'événement sont affichées.
    public void playerUpdate(Player player, String event, Object eventData) 
    {
        Dialog.alert("Player " + player.hashCode() + " got event " + event + ": " + eventData);
    }

Ces informations vous ont-elles été utiles ? Envoyez-nous vos commentaires.