Projet

Général

Profil

AbulEduMultiMediaV1

Cette classe (ensemble de classes) est sensée répondre à un besoin fréquemment rencontré dans les logiciels du Terrier d'AbulEdu, à savoir afficher une série d'images associées chacune à un texte et à un fichier sonore. Ces trois éléments sont regroupés dans une instance AbulEduMediaMedias.

Un objet AbulEduMultimediaV1 est un QWidget et à ce titre peut être inséré dans l'interface graphique par promotion. Un certain nombre de paramètres vont permettre d'adapter cet objet à des besoins particuliers : type du média visuel (image, gif animé, vidéo...), possibilité de s'enregistrer, possibilité d'utiliser la synthèse vocale.

Une série de "boutons", façon télécommande, permet de piloter l'affichage des images et la lecture (ou l'enregistrement) du son
h2. Installation

L'installation de la classe AbulEduMultiMediaV1 se fait dans le dossier lib de votre logiciel, par exemple

git submodule add http://redmine.abuledu.org/ryxeo/leterrier-developpeurs/abuledumultimediav1.git src/lib/abuledumultimediav1

Mainteneur de la lib:

git clone ssh://gitolite3@redmine.abuledu.org/repositories-redmine/ryxeo/leterrier-developpeurs/abuledumultimediav1.git

Utilisation

Une fois le widget AbulEduMultiMediaV1 inséré dans une interface graphique par la méthode de votre choix (promotion dans le .ui, insertion dans le code), il faut lui passer un certain nombre de paramètres (ce qui peut être fait dans le constructeur) :

  • Le type de mediaplayer souhaité :
    • Full : ce type permet d'afficher des images et du texte, l'enregistrement au micro est activé. C'est le type le plus complet :)
    • Diapos ce type ressemble au précédent mais ne permet pas l'enregistrement.
    • AnimatedGif : dans ce type, l'image affichée est de type gif animé.
    • Vidéo : l'image set remplacée par une vidéo, il est toujours possible d'y associer un texte et un son (style doublage et sous-titrage)
    • Sound : dans ce type, il n'y a pas d'image à afficher.
    • Recorder : le même que précédemment avec en plus la possibilité de s'enregistrer.
  • Le mode d'enchainement des images passées dans la liste de AbulEduMediaMedias
    • Automatic : démarrage manuel + enchainement automatique
    • Manuel : enchainement manuel
    • AutoStart : démarrage automatique + enchainement automatique
  • La liste des AbulEduMediaMedias à jouer dans ce widget (la liste peut être réduite à un seul objet).

Le constructeur complet est donc celui-ci :

AbulEduMultiMediaV1(QList<AbulEduMediaMedias> medias, enumMediaViewerType type = Full, enumTTSLanguage language = None, bool textIsVisible = true, enumPlayMode mode = Automatic,  QWidget *parent = 0);

On notera la possibilité de préciser la langue choisie pour la synthèse vocale : None par défaut -> pas de synthèse vocale. Il est aussi possible de décider si le texte associé doit être visible ou pas.

Il existe aussi deux autres constructeurs simplifiés :

  • AbulEduMultiMediaV1(QWidget *parent = 0) // Ce constructeur permet d'utiliser la promotion dans le designer.
  • AbulEduMultiMediaV1(enumMediaViewerType type = Full, QWidget *parent = 0) // Ce constructeur instancie un AbulEduMultiMediaV1 "vide"
Tous ces paramètres peuvent être passés à postériori grâce aux fonctions suivantes :
  • abeMultiMediaSetMediaViewerType(enumMediaViewerType mediaType);
  • abeMultiMediaSetPlayMode(enumPlayMode mode);
  • abeMultimediaSetTTS(enumTTSLanguage language);
  • abeMultiMediaSetTextVisible(bool visible);

(!) Bien que cela soit possible, il vaut mieux éviter d'utiliser directement les classes suffixées en player, viewer, recorder. Elles sont faites pour être utilisées depuis un AbulEduMultiMedia.

Les AbulEduMediaMedias

Derrière ce nom un peu barbare, se cache une classe matérialisant le fait que une image + un son + un texte constituent une unité que l'on retrouve dans des logiciels comme Raconte-Moi, Images-séquentielles ou Imageo.
Ce sont ces AbulEduMediaMedias que l'on passe à l'AbulEduMultiMedia chargé de les afficher-jouer. En fait, on passe une liste d'AbulEduMediaMedias qui seront présentés successivement dans le player.

Un AbulEduMediaMedias est constitué d'une QString représentant le chemin complet vers l'image, d'une QString représentant le chemin vers le son à jouer, du texte à afficher sous forme de QString

/** Constructeur d'un AbulEduMediaMedias, association d'une image avec un son et un commentaire
     * @param fileNameMedia le nom d'un fichier media (image, gif, video)
     * @param fileNameMedia le nom d'un fichier son au format .ogg
     * @param text le sous-titre de l'image */
    AbulEduMediaMedias(const QString &fileNameMedia="", const QString &fileNameSound="", const QString &text="")

(!) L'AbuEduMultiMediaV1 n'est là que pour afficher/jouer le contenu d'un (ou plusieurs) AbulEduMediaMedias. Ce ou ces AbulEduMediaMedias ne sont pas modifiables une fois passés en paramètres. Dans le cas des types Full et Recorder, où l'on peut enregistrer un son, ce n'est pas le chemin du son qui est modifié, mais le contenu du fichier passé dans l'AbulEduMediaMedias. Si un des trois paramètres devait être modifié, (en particulier le texte), il faut repasser un AbulEduMediaMedias avec les nouveaux paramètres. Cette façon de faire évitera des incohérences potentielles.

La synthèse vocale

La classe AbulEduMultiMediaV1 permet d'utiliser la synthèse vocale.

Appel

Il faut pour cela le spécifier en passant la valeur par défaut AbulEduLang::None à une des valeurs langues possibles (AbulEduLang::us, AbulEduLang::en, AbulEduLang::de, AbulEduLang::es, AbulEduLang::fr, AbulEduLang::it) soit dans le constructeur, soit par l'appel de la méthode :

void AbulEduMultiMediaV1::abeMultimediaSetTTS(AbulEduPicottsV1::AbulEduLang language)

On peut aussi obtenir une synthèse vocale si le fichier audio, deuxième paramètre de l'AbulEduMediaMedia en cours est vide.

Vitesse de lecture

La vitesse de lecture étant réglable dans AbulEduPicottsV1, un slot d'AbulEduMultiMediaV1 permet de la fixer

void AbulEduMultiMediaV1::abeMultiMediaSetPicoSpeed(int picoSpeed)

Cependant il est possible aussi d'afficher un bouton plus et un bouton moins dans l'AbulEduControlAudioV1, lesquels émettent un signal relié au slot précédent.
Ces boutons sont cachés par défaut. Pour les faire apparaître, il faut appeler la méthode

void abeControlAudioSetSpeedControlVisible(bool visible);

de l'AbulEduControlAudioV1

Deux types de boutons pour lancer des lecteurs de media

Il est parfois commode d'avoir des boutons permettant de lancer un AbulEduMultiMedia ainsi qu'il est fait dans Images séquentielles et dans Imageo. En fonction du contexte (QWidget ou QGraphicsItem) on utilisera l'un ou l'autre de ces boutons.

QWidget

L'objet généré est un AbulEduFlatBouton qui instanciera un AbulEduMultimédia lors du clic.
voici son constructeur :

    /** Constructeur du médiaBouton
     * @param parentForButton le widget sur lequel sera greffé le bouton
     * @param parentForMultiMedia le widget dans lequel sera inséré l'AbulEduMultiMediaV1
     * @param listMedias une liste de AbulEduMediaMedias (chemin vers les composants du média)
     */
    explicit AbulEduMediaButtonV1(QWidget *parentForButton, QWidget *parentForMultiMedia,
                                  QList<AbulEduMediaMedias> listMedias,
                                  AbulEduMultiMediaV1::enumTTSLanguage language = AbulEduMultiMediaV1::None,
                                   bool isTextVisible = true);

QGraphicsItem

Plus adapté aux QGraphicsItem, ce bouton se construit quasiment de la même façon que le précédent :

explicit AbulEduMediaGraphicsButtonV1(QGraphicsItem *parentForButton, QWidget *parentForMultiMedia,
                                          QList<AbulEduMediaMedias> listMedias,
                                          AbulEduMultiMediaV1::enumTTSLanguage language = AbulEduMultiMediaV1::None,
                                          bool isTextVisible = true);

Fonctions avancées

Pilotage du player

Il est possible de commander le déroulement de la présentation avec les fonctions doublant les boutons de la télécommande :

  
    /** Permet de démarrer le lecteur depuis "l'extérieur" */
    void abeMultiMediaPlay();

    /** Permet de lancer un media precis depuis l'extérieur */
    void abeMultiMediaPlay(int mediaToPlay );

    /** Permet d'arreter le lecteur depuis "l'extérieur" */
    void abeMultiMediaStop();

    /** Permet de mettre le lecteur en pause depuis "l'extérieur" */
    void abeMultiMediaPause();

    /** Permet de passer au média suivant depuis "l'extérieur" */
    void abeMultiMediaNext();

    /** Permet de passer au média précédent depuis "l'extérieur" */
    void abeMultiMediaPrevious();

Accéder aux éléments du player

Il est possible de récupérer un pointeur sur les trois éléments constitutifs d'un AbulEduMultiMedia :
  • Le widget graphique lui-même (partie visible de l'AbulEduMultiMedia) : abeMultiMediaGetViewerWidget(). Ses possibilités dépendront du type passé lors de sa création/personnalisation.
  • La télécommande : abeMultiMediaGetAudioControlWidget(); Ceci permettra par exemple de la masquer avec setVisible(false); ou de l'afficher ailleurs dans l'interface graphique du logiciel en lui fixant un autre parent.
  • Le champ de texte : abeMultiMediaGetTextEdit(); Ceci permettra par exemple de le rendre éditable et de se connecter sur ses signaux. Il est aussi possible de récupérer le texte de ce champ avec abeMultiMediaGetText();

Manipuler la télécommande

On peut avoir besoin de modifier l'affichage des boutons de la télécommande, afin d'en modifier le comportement par défaut.

Les boutons sont répertoriés dans une enumération :

    enum enumControlButton{BtnPlay = 1, BtnPause = 2, BtnStop = 4, BtnRecord = 8, BtnPrevious = 16, BtnNext = 32, BtnMagnifyingGlass = 64, BtnHide = 128};

Les boutons peuvent être affichés/masqués par :

    m_recorder->abeMultiMediaSetButtonVisible(AbulEduMultiMediaV1::BtnNext |
                                              AbulEduMultiMediaV1::BtnPrevious, true);

Les boutons peuvent être combiner par un | le dernier paramètre décide de l'affichage des boutons.

De la même façon, les boutons peuvent être activés/désactivés :

    m_recorder->abeMultiMediaSetButtonEnabled(AbulEduMultiMediaV1::BtnHide |
                                              AbulEduMultiMediaV1::BtnMagnifyingGlass, false);

Lecture d'une liste d'AbulEduMediaMedias

Début de lecture

1) Clic sur le bouton Play d'AbulEduControlAudioV1 : le signal signalAbeControlAudioPlayClicked est émis.
2) L'émission de ce signal provoque l'entrée de l'AbulEduMultiMediaV1 dans l'état m_playingState
3) l'entrée dans cet état lance le slot playNextMedia : en gros on donne le bon média à lire

abeMultiMediaSetMedia(m_currentMedia);

et on lance la lecture
m_viewerWidget->slotAbeMediaViewerPlay();
m_playerState = Playing;

Ce qui va (ça dépend du type de viewer) dans AbulEduSlidesViewerV1 faire un
m_audioPlayer->play();

tout en émettant le signal
emit signalAbeMultiMediaCurrentMediaChanged(m_currentMedia + 1)

C'est un AbulEduAudioPlayerV1 qui va se charger de lire le son de notre media. C'est à dire que sous Linux un AbulEduAudioDecoderV1 décode le ogg, puis lance en fin de décodage un QAudioOutput qui lit le wav obtenu. Alors que sous Windows et Androïd un QMediaPlayer lit directement le ogg.

Connexions du QMediaPlayer
connect(m_abeAudioPlayerMediaPlayer, SIGNAL), this, SLOT), Qt::UniqueConnection);
Connexion du QAudioOutput
connect(m_player, SIGNAL), this, SLOT), Qt::UniqueConnection);
On trouve encore dans la méthode initAudioPlayer d'AbulEduSlidesViewer
connect(m_audioPlayer, SIGNAL), this, SLOT), Qt::UniqueConnection);
connect(m_audioPlayer, SIGNAL), this, SIGNAL), Qt::UniqueConnection);
plus (uniquement sous Windows en Androïd)
connect(m_audioPlayer->abeAudioPlayerGetMediaPlayer(), SIGNAL), this, SLOT), Qt::UniqueConnection);
et le pendant sous Linux
connect(m_player, SIGNAL), this, SLOT), Qt::UniqueConnection);

Sous Linux Sous Windows Sous Mac Sous Androïd
Play start() de l'AbulEduAudioDecoderV1 qui lance en fin un start(ioDevice) du QAudioOutput play() du QMediaPlayer euh ... idem Windows
Fin de lecture AbulEduAudioPlayer passe à IdleState ce qui provoque l'émission de signalAbeMediaFinished et donc le lancement du slotAbeViewerPlayingMediaFinished qui fait un playNextMedia() QMediaPlayer émet EndOfMedia et donc le lancement du slotAbeMediaStatusChanged qui à son tour émet signalAbeMediaFinished et donc le lancement du slotAbeViewerPlayingMediaFinished qui fait un playNextMedia() idem Windows
Clic sur Stop

Fin de lecture

1) Clic sur le bouton Stop d'AbulEduControlAudioV1 : le signal signalAbeControlAudioStopClicked est émis.
2) L'émission de ce signal provoque l'entrée de l'AbulEduMultiMediaV1 dans l'état m_stoppedState
3) l'entrée dans cet état émet 3 signaux :

emit signalAbeStopRequested();
emit signalAbeMultiMediaStateChanged(m_playerState);
emit signalAbeMultiMediaStopped(m_currentMedia);

et l'interface est stoppée
m_viewerWidget->slotAbeMediaViewerStop();

essaiSlidesRecorder.tar.gz - Un petit test avec l'option Full (6,84 Mo) Jean-Louis Frucot, 01/01/2014 15:57

Redmine Appliance - Powered by TurnKey Linux