Qt Multimedia
Objectifs
Le module Qt Multimedia fournit des API permettant de profiter des fonctionnalités audio, vidéo, caméra et radio de votre ordinateur, smartphone ou tablette, si celui-ci en dispose et si votre système d’exploitation est équipé des pilotes de périphériques adéquats.
Il est bien évident que le caractère multiplateforme de ce module est fortement limité par les capacités de la plateforme visée. Les fonctionnalités radio nécessiteront un équipement adapté, des pilotes de périphériques et surtout une API système permettant à Qt de tirer profit du matériel. Il en va de même pour la caméra. Il vous sera difficile de proposer, dans ce domaine, une application totalement compatible avec tous les systèmes d’exploitation pour PC et pour mobiles ou tablettes (mais c’est possible).
Qt n’embarque aucun codec ni mécanisme d’enregistrement ou de lecture sophistiqué, les classes du module Qt Multimedia utilisent directement les fonctionnalités bas niveau du système d’exploitation pour effectuer leurs travaux.
L’encodage et le décodage sont effectués en utilisant les API du système d’exploitation, ainsi les codecs disponibles sont ceux du système. Sous Windows, les API sont celles de DirectShow...
Intégration
Le module Qt Multimedia est intégré à votre projet grâce à l’ajout du mot-clé multimedia dans la déclaration QT de votre fichier .pro.
QT += multimedia
QT += multimediawidgets #Si vous utilisez les widgets
Audio
Les API audio vous permettront d’effectuer les tâches suivantes :
-
Jouer des effets sonores sur un périphérique audio.
-
Jouer des fichiers audio sur un périphérique audio.
-
Enregistrer des sons en provenance d’un périphérique d’enregistrement.
-
Lister les périphériques audio disponibles.
1. Lister les périphériques
La classe QAudioDeviceInfo fournit des fonctions permettant de connaître la liste des périphériques disponibles pour la lecture ainsi que pour l’enregistrement de l’audio. Cette liste est fournie par le système d’exploitation.
La fonction statique availableDevices(QAudio::Mode) retourne une instance de QList<QAudioDeviceInfo> des périphériques dans le mode défini. Les modes disponibles sont QAudio::AudioInput pour les périphériques d’entrée et QAudio::AudioOutput pour les périphériques de sortie.
Les fonctions statiques defaultInputDevice() et defaultOutput Device() vous renseigneront sur les périphériques par défaut définis par l’utilisateur dans le système.
Le code source est disponible dans le projet Audio.
Une fois que vous avez déterminé le périphérique sur lequel l’utilisateur souhaite enregistrer ou jouer son fichier audio, vous pouvez obtenir davantage d’informations sur les capacités de ce périphérique ou de son driver :
-
supportedChannelCounts() : retourne le nombre des canaux de lecture ou d’enregistrement (habituellement deux sur un PC stéréo).
-
supportedCodecs() : retourne la liste des codecs pour la capture ou la lecture brute sur la carte (habituellement PCM).
-
supportedSampleRates() : retourne les fréquences d’échantillonnage (en Hertz) disponibles.
-
supportedSampleSized() : retourne la taille (en bits) d’un échantillon....
Vidéo
Qt fournit un jeu de classes permettant d’accéder à des flux vidéo stockés dans des fichiers, compressés ou non.
Le code source est disponible dans le projet Video.
1. Enregistrer une vidéo
L’enregistrement d’une vidéo se fait exactement de la même manière qu’avec l’audio. Nous utiliserons cependant directement la classe QMediaRecorder car il n’existe pas de classe spécialisée pour l’enregistrement vidéo.
Les réglages de l’enregistrement vidéo seront effectués grâce à la classe QVideoEncoderSettings. Les réglages couramment utilisés sont bien entendu le codec, défini grâce à la fonction setCodec(QString nomDuCodec), mais aussi la résolution utilisée pour l’enregistrement, définie grâce à la fonction setResolution(int x, int y), ainsi que le bitrate avec setBitrate(int) et le framerate avec setFrameRate(qreal).
La liste des codecs disponibles est fournie par la fonction supportedVideoCodecs().
QVideoEncoderSettings videoSettings ;
videoSettings.setCodec("video/mpeg2") ;
//Nous utilisons une résolution de 800x600 (en pixels)
videoSettings.setResolution("800, 600") ;
//Nous enregistrons 25 images par seconde
videoSettings.setFrameRate(1.0/25.0) ; ...
Caméra
Qt est capable de gérer les webcams et caméras numériques au même titre que l’affichage de vidéos. D’un certain point de vue il s’agit dans les deux cas d’un flux de vidéo à capturer ou afficher.
Le code source est disponible dans le projet Webcam.
1. Afficher en direct
La classe permettant de gérer les caméras est la classe QCamera. Celle-ci vous donnera la liste des caméras disponibles pour l’affichage ou la capture grâce à la fonction statique availableDevices(). Cette fonction renvoie des identifiants sous la forme d’une instance de QList<QByteArray>. Pour obtenir un identifiant intelligible, vous devez utiliser la fonction statique deviceDescription(QByteArray&) avec, comme paramètre, l’identi-fiant numérique obtenu avec la fonction précédente.
QList<QByteArray> cameras = QCamera::availableDevices() ;
foreach(QByteArray camera, cameras)
{
qDebug() << "Caméra : " << QCamera::deviceDescription(camera) ;
}
Pour accéder au flux vidéo de la webcam, il vous suffit d’instancier un objet QCamera avec l’identifiant numérique de celle-ci obtenu à l’aide de la fonction availableDevices().
De la même manière que dans...
Radio
Grâce aux fonctionnalités multimédias de Qt, il est possible d’accéder au flux audio d’une carte radio analogique, pour peu que celle-ci dispose des drivers pour votre système d’exploitation.
La classe QRadioTuner hérite elle aussi de la classe QMediaObject, ce qui vous permettra à la fois de lire et d’enregistrer le flux audio qui en provient, en utilisant le QMediaRecorder.
1. Lire un flux radio
Un objet QRadioTuner est instancié sans paramètre mais il doit être configuré pour définir la bande radio à utiliser (AM, FM, etc.) ainsi que la fréquence de la station à écouter. La bande est définie avec l’aide de la fonction setBand(Band) qui prend en paramètre une des valeurs de l’énumération QRadioTuner::Band (AM, FM, SW, LW).
Quant à la fréquence, elle est définie par un nombre entier, en Hertz, grâce à la fonction setFrequency(int).
QRadioTuner* tuner = new QRadioTuner(this) ;
if(tuner->isBandSupported(QRadioTuner::FM))
{
radio->setBand(QRadioTuner::FM) ;
radio->setFrequency(105500000) ; //105.5 Mhz
radio->start() ; //démarrage de la lecture du flux ...