Mise en oeuvre d’une caméra USB sous Qt

La caméra USB

Modèle testé : ELP 5MP 2592x1944 Aptina MI5100 uvc caméra Webcam USB www.amazon.fr

Caractéristiques :

  • Capteur d’image CMOS 5 MegaPixel interface USB 2.0
  • Résolution : 2592x1944 @ 15fps MJPEG ou 1280x720 @ 30fps MJPEG
  • Capteur : 1 / 2,5 pouces Aptina MI5100 capteur CMOS
  • Format d’image : MJPEG ou YUY2 option
  • Performance : 2592x1944 @ 15fps MJPEG / 2048x1536 @ 15fps MJPEG 1600x1200 @ 15fps MJPEG / 1280x1024 @ 15fps MJPEG 1920x1080 @ 15fps MJPEG / 1280x720 @ 30fps MJPEG 800x600 @ 30fps MJPEG / 640x480 @ 30fps MJPEG
  • Paramètres ajustables : Luminosité, Contraste, Saturation des couleurs, Définition, Gamma
  • Alimentation : DC 5V - 150mA

Détection sous Linux :

$ dmesg 
...
[453794.929614] usb 1-5.4.2: new high-speed USB device number 70 using xhci_hcd
[453795.055377] usb 1-5.4.2: New USB device found, idVendor=05a3, idProduct=9530
[453795.055378] usb 1-5.4.2: New USB device strings: Mfr=2, Product=1, SerialNumber=3
[453795.055379] usb 1-5.4.2: Product: USB 2.0 Camera
[453795.055380] usb 1-5.4.2: Manufacturer: Sonix Technology Co., Ltd.
[453795.055381] usb 1-5.4.2: SerialNumber: SN5100
[453795.115252] media: Linux media interface: v0.10
[453795.120461] Linux video capture interface: v2.00
[453795.127707] uvcvideo: Found UVC 1.00 device USB 2.0 Camera (05a3:9530)
[453795.142689] uvcvideo 1-5.4.2:1.0: Entity type for entity Extension 4 was not initialized!
[453795.142690] uvcvideo 1-5.4.2:1.0: Entity type for entity Extension 3 was not initialized!
[453795.142691] uvcvideo 1-5.4.2:1.0: Entity type for entity Processing 2 was not initialized!
[453795.142692] uvcvideo 1-5.4.2:1.0: Entity type for entity Camera 1 was not initialized!
[453795.142814] input: USB 2.0 Camera: HD USB Camera as /devices/pci0000:00/0000:00:14.0/usb1/1-5/1-5.4/1-5.4.2/1-5.4.2:1.0/input/input49
[453795.142934] usbcore: registered new interface driver uvcvideo
[453795.142934] USB Video Class driver (1.1.1)

$ lsusb
...
Bus 001 Device 070: ID 05a3:9530 ARC International

$ dpkg -l | grep v4l
ii  libv4l-0:amd64       1.14.2-1 amd64 Collection of video4linux support libraries
ii  libv4l2rds0:amd64    1.14.2-1 amd64 Video4Linux Radio Data System (RDS) decoding library
ii  libv4lconvert0:amd64 1.14.2-1 amd64 Video4linux frame format conversion library
ii  v4l-utils            1.14.2-1 amd64 Collection of command line video4linux utilities

$ ffmpeg -f v4l2 -list_formats all -i /dev/video0
...
[video4linux2,v4l2 @ 0x557c3d4188c0] Compressed: mjpeg : Motion-JPEG : 1600x1200 2592x1944 2048x1536 1920x1080 1280x1024 1280x720 1024x768 800x600 640x480 1600x1200
[video4linux2,v4l2 @ 0x557c3d4188c0] Raw: yuyv422 : YUYV 4:2:2 : 1600x1200 2592x1944 2048x1536 1920x1080 1280x1024 1280x720 1024x768 800x600 640x480 1600x1200

$ v4l2-ctl --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
    Index       : 0
    Type        : Video Capture
    Pixel Format: 'MJPG' (compressed)
    Name        : Motion-JPEG
        Size: Discrete 1600x1200
            Interval: Discrete 0.067s (15.000 fps)
        Size: Discrete 2592x1944
            Interval: Discrete 0.067s (15.000 fps)
        Size: Discrete 2048x1536
            Interval: Discrete 0.067s (15.000 fps)
        Size: Discrete 1920x1080
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 1280x1024
            Interval: Discrete 0.067s (15.000 fps)
        Size: Discrete 1280x720
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 1024x768
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 800x600
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 640x480
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 1600x1200
            Interval: Discrete 0.067s (15.000 fps)

    Index       : 1
    Type        : Video Capture
    Pixel Format: 'YUYV'
    Name        : YUYV 4:2:2
        Size: Discrete 1600x1200
            Interval: Discrete 0.200s (5.000 fps)
        Size: Discrete 2592x1944
            Interval: Discrete 0.333s (3.000 fps)
        Size: Discrete 2048x1536
            Interval: Discrete 0.250s (4.000 fps)
        Size: Discrete 1920x1080
            Interval: Discrete 0.200s (5.000 fps)
        Size: Discrete 1280x1024
            Interval: Discrete 0.111s (9.000 fps)
        Size: Discrete 1280x720
            Interval: Discrete 0.200s (5.000 fps)
        Size: Discrete 1024x768
            Interval: Discrete 0.100s (10.000 fps)
        Size: Discrete 800x600
            Interval: Discrete 0.050s (20.000 fps)
        Size: Discrete 640x480
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 1600x1200
            Interval: Discrete 0.200s (5.000 fps)

Pour vérifier que la caméra est fonctionnelle, on peut visualiser son flux avec VLC :

$ vlc v4l2:///dev/video0

Qt 5

Le support multimédia dans Qt5 est fourni par le module Qt Multimedia. L’API multimédia Qt (C++ et QML) fournit un certain nombre de classes pour gérer des caméras et ainsi accéder aux images et aux vidéos de ces périphériques.

Le module multimédia regroupent quatre composants principaux : l’audio, la vidéo, la radio et la caméra.

Pour utiliser les classes de QtMultimedia, il faut donc ajouter au fichier de projet .pro :

QT += multimedia multimediawidgets

D’autre part, il faudra aussi disposer du module multimedia pour le développement (et des plugins pour les codecs) :

$ sudo apt-get install qtmultimedia5-dev qtmultimedia5-examples qtmultimedia5-doc qml-module-qtmultimedia

Le composant caméra fournit les classes C++ suivantes :

Voir la liste des exemples fournis par Qt.

Détection et informations de la caméra

La classe QCameraInfo permet de déterminer le nombre de caméras détectées et accèder à quelques informations :

if (QCameraInfo::availableCameras().count() > 0)
{
    qDebug() << "Caméra(s) disponible(s)" << QCameraInfo::availableCameras().count();
    QList<QCameraInfo> cameras = QCameraInfo::availableCameras();
    foreach (const QCameraInfo &cameraInfo, cameras)
    {
        qDebug() << "Device" << cameraInfo.deviceName();
        qDebug() << "Description" << cameraInfo.description();
        if (cameraInfo.position() == QCamera::FrontFace)
            qDebug() << "Position : FrontFace";
        else if (cameraInfo.position() == QCamera::BackFace)
            qDebug() << "Position : BackFace";
        qDebug() << "Orientation" << cameraInfo.orientation() << "degrés";
    }
}
else
{
    qDebug() << "Aucune caméra disponible !";
}

On obtient ceci :

Caméra(s) disponible(s) 1
Device "/dev/video0"
Description "USB 2.0 Camera: HD USB Camera"
Orientation 0 degrés

Visionner le flux de la caméra

La classe QCameraViewfinder fournit un widget qui hérite de QVideoWidget pour le rendu de la caméra.

Il faut créer un objet de type QCamera puis l’associer à un “rendu” pour visualiser son flux dans la fenêtre de l’application.

En C++, on a le choix car la méthode setViewfinder() qui assure l’association permet les cas suivants :

  • setViewfinder(QVideoWidget *viewfinder) : avec un widget de type QCameraViewfinder ou QVideoWidget
  • setViewfinder(QGraphicsVideoItem *viewfinder) : avec un QGraphicsVideoItem si on utilise QGraphicsView
  • setViewfinder(QAbstractVideoSurface *surface) : avec son propre objet hérité de QAbstractVideoSurface pour une utilisation avancée (traitement d’images comme la détection d’objets)

On utilisera ici un widget de type QCameraViewfinder :

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtWidgets>
#include <QCamera>
#include <QCameraViewfinder>

class MainWindow : public QMainWindow
{
    Q_OBJECT
private:
    QCamera *camera;
    QCameraViewfinder *viewfinder;

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
};

#endif // MAINWINDOW_H
#include "mainwindow.h"
#include <QCameraInfo>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), camera(NULL), viewfinder(NULL)
{
    viewfinder = new QCameraViewfinder(this);

    if (QCameraInfo::availableCameras().count() > 0)
    {
        // la caméra détectée par défaut
        //camera = new QCamera;
        // ou directement en choisissant le périphérique :
        camera = new QCamera("/dev/video0", this);
        camera->setViewfinder(viewfinder);

        camera->start();
    }
    else
    {
        qDebug() << "Aucune caméra disponible !";
    }

    setCentralWidget(viewfinder);
    setWindowTitle(QString::fromUtf8("Test Caméra USB"));
}

MainWindow::~MainWindow()
{
}

On obtient ceci :

Il est possible de faire quelques paramétrages du QCameraViewfinder avec la classe QCameraViewfinderSettings :

  • setResolution() : modifier la résolution
  • setMaximumFrameRate() : modifier le nombre max de frames par seconde (fps)
  • setMinimumFrameRate() : modifier le nombre max de frames par seconde (fps)
  • setPixelAspectRatio() : modifier l’aspect en fixant un ratio
  • setPixelFormat() : le format QVideoFrame::PixelFormat

Il faut donc créer un objet de type QCameraViewfinderSettings puis on l’associe au QCameraViewfinder avec setViewfinderSettings() :

// Par exemple :
QCameraViewfinderSettings viewfinderSettings;
//viewfinderSettings.setResolution(2592, 1944);
viewfinderSettings.setResolution(1920, 1080);
viewfinderSettings.setMaximumFrameRate(5.0);
viewfinderSettings.setPixelFormat(QVideoFrame::Format_YUYV);
camera->setViewfinderSettings(viewfinderSettings);

Voir les commandes ffmepg et v4l2-ctl ci-dessus pour connaître les réglages supportées par la caméra.

Enregistrement du flux de la caméra

Il est possible d’enregistrer à partir de la caméra :

  • l’enregistrement d’une image nécessite l’utilisation d’un objet QCameraImageCapture associé à un objet de type QCamera. Il faut ensuite configurer le mode de capture QCamera::CaptureStillImage avec setCaptureMode().

  • l’enregistrement d’une vidéo nécessite l’utilisation d’un objet QMediaRecorder associé à un objet de type QCamera. Il faut ensuite configurer le mode de capture QCamera::CaptureVideo avec setCaptureMode().

Code source : qt5-camera-1.zip

L’exemple complet Camera Example C++ fourni par Qt.

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtWidgets>

#include <QCamera>
#include <QCameraViewfinder>
#include <QCameraImageCapture>
#include <QMediaRecorder>

class MainWindow : public QMainWindow
{
    Q_OBJECT
private:
    QCamera *camera;
    QCameraViewfinder *viewfinder;
    QCameraImageCapture *captureImage;
    QMediaRecorder *captureVideo;
    bool enregistre;

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

public slots:
    void etatCamera(QCamera::State etat);
    void statusCamera(QCamera::Status etat);
    void etatCaptureVideo(QMediaRecorder::State etat);
    void afficherTempsEnregistrement(qint64 temps);
    void enregistrerImage();
    void enregistrerVideo();
    void estPretCaptureImage(bool pret);
    void imageCaptured(int id, QImage image);
    void imageSauvegardee(int id, QString nomFichier);
    void selectionnerCapture(int index);
};

#endif // MAINWINDOW_H

On crée une GUI pour visualiser le flux et choisir le type de capture :

#include "mainwindow.h"
#include <QCameraInfo>
#include <QDebug>
#include <QCameraViewfinderSettings>
#include <QMediaMetaData>

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), camera(NULL), cameraInfo(NULL), viewfinder(NULL), captureImage(NULL), captureVideo(NULL)
{
    viewfinder = new QCameraViewfinder(this);

    if (QCameraInfo::availableCameras().count() > 0)
    {
        //camera = new QCamera;
        camera = new QCamera("/dev/video0", this);
        cameraInfo = new QCameraInfo(*camera);
        this->statusBar()->showMessage(cameraInfo->description() + " [" + cameraInfo->deviceName() + "]");
        connect(camera, SIGNAL(statusChanged(QCamera::Status)), this, SLOT(statusCamera(QCamera::Status)));
        connect(camera, SIGNAL(stateChanged(QCamera::State)), this, SLOT(etatCamera(QCamera::State)));
        camera->setViewfinder(viewfinder);
    }
    else
    {
        qDebug() << "Aucune caméra disponible !";
    }

    captureImage = new QCameraImageCapture(camera, this);
    // ...

    captureVideo = new QMediaRecorder(camera, this);
    // ...    

    // GUI
    QWidget *widgetPrincipal = new QWidget;
    QVBoxLayout *layoutPrincipal = new QVBoxLayout;
    QHBoxLayout *layoutFlux = new QHBoxLayout;
    viewfinder->setFixedSize(640, 480);
    layoutFlux->addWidget(viewfinder);
    QHBoxLayout *layoutBoutons = new QHBoxLayout;
    QPushButton *boutonImage = new QPushButton(QString::fromUtf8("Image"), this);
    connect(boutonImage, SIGNAL(clicked(bool)), this, SLOT(enregistrerImage()));
    QPushButton *boutonVideo = new QPushButton(QString::fromUtf8("Vidéo"), this);
    connect(boutonVideo, SIGNAL(clicked(bool)), this, SLOT(enregistrerVideo()));
    QComboBox *listeTypeCapture = new QComboBox(this);
    connect(listeTypeCapture, SIGNAL(currentIndexChanged(int)), this, SLOT(selectionnerCapture(int)));
    listeTypeCapture->addItem(QString::fromUtf8("Image"));
    listeTypeCapture->addItem(QString::fromUtf8("Vidéo"));
    layoutBoutons->addStretch();
    layoutBoutons->addWidget(listeTypeCapture);
    layoutBoutons->addWidget(boutonImage);
    layoutBoutons->addWidget(boutonVideo);
    layoutPrincipal->addLayout(layoutFlux);
    layoutPrincipal->addLayout(layoutBoutons);
    widgetPrincipal->setLayout(layoutPrincipal);

    setCentralWidget(widgetPrincipal);
    setWindowTitle(QString::fromUtf8("Test Caméra USB"));

    if(camera != NULL)
        camera->start();
}

MainWindow::~MainWindow()
{
    if(camera != NULL)
        camera->stop();
}

void MainWindow::etatCamera(QCamera::State etat)
{
    qDebug() << Q_FUNC_INFO << etat;
}

void MainWindow::statusCamera(QCamera::Status etat)
{
    qDebug() << Q_FUNC_INFO << etat;
}

void MainWindow::selectionnerCapture(int index)
{
    switch (index)
    {
    case 0:
        camera->setCaptureMode(QCamera::CaptureStillImage);
        break;
    case 1:
        camera->setCaptureMode(QCamera::CaptureVideo);
        break;
    default:
        break;
    }

    if(camera->captureMode() == QCamera::CaptureStillImage)
        qDebug() << "Capture Mode " << camera->captureMode() << "CaptureStillImage";
    else if(camera->captureMode() == QCamera::CaptureVideo)
        qDebug() << "Capture Mode " << camera->captureMode() << "CaptureVideo";
    else
        qDebug() << "Capture Mode " << camera->captureMode();
}

...

Enregistrement d’une image

L’enregistrement d’une image nécessite l’utilisation d’un objet QCameraImageCapture associé à un objet de type QCamera. Il faut ensuite configurer le mode de capture QCamera::CaptureStillImage avec setCaptureMode().

Pour capturer une image, on utilisera donc un objet QCameraImageCapture. Il suffit ensuite :

  • de démarrer la caméra (camera->start()),
  • de la verrouiller (camera->searchAndLock()) pour que la mise au point soit nette et que les réglages ne changent pas pendant la capture de l’image,
  • de capturer (captureImage->capture()) l’image et enfin
  • de déverrouiller la caméra (camera->unlock()) pour la photo suivante.

Il est possible de choisir le chemin (path) où sera stockée l’image au moment de la capture. Ici, on choisit de les stoker dans le répertoire de l’application (qApp->applicationDirPath()). Les images sont nommées automatiquement “IMG_0000000x.jpg” avec x incrémenté à chaque capture d’image.

...

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), camera(NULL), cameraInfo(NULL), viewfinder(NULL), captureImage(NULL), captureVideo(NULL)
{
    // ...
    
    captureImage = new QCameraImageCapture(camera, this);
    qDebug() << "Capture Image available" << captureImage->isAvailable() << "CaptureToBuffer" << captureImage->isCaptureDestinationSupported(QCameraImageCapture::CaptureToBuffer);
    qDebug() << "Capture Image codecs" << captureImage->supportedImageCodecs();
    qDebug() << "Capture Image resolution(s)" << captureImage->supportedResolutions();
    connect(captureImage, SIGNAL(readyForCaptureChanged(bool)), this, SLOT(estPretCaptureImage(bool)));
    connect(captureImage, SIGNAL(imageCaptured(int,QImage)), this, SLOT(imageCaptured(int,QImage)));
    connect(captureImage, SIGNAL(imageSaved(int,QString)), this, SLOT(imageSauvegardee(int,QString)));
    
    camera->setCaptureMode(QCamera::CaptureStillImage);
    
    // ...
    
    if(camera != NULL)
        camera->start();
}

//...

void MainWindow::enregistrerImage()
{
    if(camera == NULL)
        return;
    if(camera->captureMode() == QCamera::CaptureStillImage)
    {
        camera->searchAndLock();
        captureImage->capture(qApp->applicationDirPath());
        camera->unlock();
    }
}

void MainWindow::estPretCaptureImage(bool pret)
{
    qDebug() << Q_FUNC_INFO << pret;
}

void MainWindow::imageCaptured(int id, QImage image)
{
    qDebug() << Q_FUNC_INFO << id;
}

void MainWindow::imageSauvegardee(int id, QString nomFichier)
{
    qDebug() << Q_FUNC_INFO << id << QDir::toNativeSeparators(nomFichier);
    this->statusBar()->showMessage("Image " + nomFichier + QString::fromUtf8(" sauvegardée"), 2000);
}

On obtient ceci :

Starting qt5-camera-1...
Caméra(s) disponible(s) 1
Device "/dev/video0"
Description "USB 2.0 Camera: HD USB Camera"
Capture Image available true CaptureToBuffer true
Capture Image codecs ("jpeg")
Capture Image resolution(s) ()
Capture Mode  QFlags(0x1) CaptureStillImage
void MainWindow::statusCamera(QCamera::Status) QCamera::LoadingStatus
void MainWindow::etatCamera(QCamera::State) QCamera::ActiveState
void MainWindow::statusCamera(QCamera::Status) QCamera::LoadedStatus
void MainWindow::statusCamera(QCamera::Status) QCamera::StartingStatus
void MainWindow::enregistrerImage()
void MainWindow::statusCamera(QCamera::Status) QCamera::ActiveStatus
void MainWindow::estPretCaptureImage(bool) true
void MainWindow::estPretCaptureImage(bool) false
void MainWindow::statusCamera(QCamera::Status) QCamera::StoppingStatus
void MainWindow::etatCamera(QCamera::State) QCamera::LoadedState
qt5-camera-1 exited with code 0

Il est possible de faire quelques paramétrages de l’encodage de l’image avec la classe QImageEncoderSettings :

  • setResolution() : modifier la résolution
  • setEncodingOption() et setEncodingOptions() : modifier les options d’encodage
  • setQuality() : modifier la qualité
  • setCodec() : modifier le codec

On modifiera ensuite les paramètres de l’objet de type QCameraImageCapture avec setEncodingSettings().

Enregistrement d’une vidéo

L’enregistrement d’une vidéo nécessite l’utilisation d’un objet QMediaRecorder associé à un objet de type QCamera. Il faut ensuite configurer le mode de capture QCamera::CaptureVideo avec setCaptureMode().

Pour capturer une vidéo, on utilisera donc un objet QMediaRecorder. Il suffit ensuite :

  • de démarrer la caméra (camera->start()),
  • de démarrer l’enregistrement (captureVideo->record())
  • d’arrêter l’enregistrement (captureVideo->stop())

Il est possible de choisir le chemin (path) où sera stockée la vidéo avec setOutputLocation(). Ici, on choisit de les stoker dans le répertoire de l’application (qApp->applicationDirPath()). Les vidéos sont nommées automatiquement “clip_0000000x.ogg” avec x incrémenté à chaque enregistrement.

...

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), camera(NULL), cameraInfo(NULL), viewfinder(NULL), captureImage(NULL), captureVideo(NULL)
{
    // ...
    
    captureVideo = new QMediaRecorder(camera, this);
    qDebug() << "Capture Video available" << captureVideo->isAvailable();
    qDebug() << "Capture Video codecs" << captureVideo->supportedVideoCodecs();
    qDebug() << "Capture Video resolution(s)" << captureVideo->supportedResolutions();
    qDebug() << "Capture Video frame rate(s)" << captureVideo->supportedFrameRates();
    qDebug() << "Capture Video containers" << captureVideo->supportedContainers();

    captureVideo->setMetaData(QMediaMetaData::Title, QVariant(QLatin1String("Test Camera USB")));
    captureVideo->setOutputLocation(qApp->applicationDirPath());
    connect(captureVideo, SIGNAL(stateChanged(QMediaRecorder::State)), this, SLOT(etatCaptureVideo(QMediaRecorder::State)));
    connect(captureVideo, SIGNAL(durationChanged(qint64)), this, SLOT(afficherTempsEnregistrement(qint64)));
    //connect(captureVideo, SIGNAL(), this, SLOT());
    enregistre = false;

    camera->setCaptureMode(QCamera::CaptureVideo);
    
    // ...
    
    if(camera != NULL)
        camera->start();
}

void MainWindow::etatCaptureVideo(QMediaRecorder::State etat)
{
    qDebug() << Q_FUNC_INFO << etat;
}

void MainWindow::enregistrerVideo()
{
    if(camera == NULL)
        return;
    if(camera->captureMode() == QCamera::CaptureVideo)
    {
        if(!enregistre)
        {
            captureVideo->record();
            enregistre = true;
        }
        else if (captureVideo->state() == QMediaRecorder::RecordingState)
        {
            captureVideo->stop();
            enregistre = false;
        }
    }
}

void MainWindow::afficherTempsEnregistrement(qint64 temps)
{
    QString str = QString::fromUtf8("Enregistrement vidéo %1 s").arg(captureVideo->duration()/1000);
    this->statusBar()->showMessage(str);
}

...

On obtient ceci :

Starting qt5-camera-1...
Caméra(s) disponible(s) 1
Device "/dev/video0"
Description "USB 2.0 Camera: HD USB Camera"

Capture Video available true
Capture Video codecs ("image/jpeg", "image/png", "video/x-theora", "video/x-vp8", "video/x-vp9", "video/x-h264", "application/x-yuv4mpeg", "video/x-amv", "video/x-asus", "image/bmp", "video/x-cinepak", "video/x-cirrus-logic-accupak", "video/x-dnxhd", "video/x-dv", "video/x-ffv", "video/x-gst-av-ffvhuff", "video/x-flash-screen", "video/x-flash-screen2", "video/x-flash-video", "video/x-h261", "video/x-h263, variant=(string)itu", "video/x-huffyuv", "image/x-j2c", "video/mpeg, mpegversion=(int)1", "video/mpeg, mpegversion=(int)2", "video/mpeg, mpegversion=(int)4", "video/x-divx", "video/x-msmpeg", "video/x-msvideocodec", "image/x-portable-anymap", "image/pbm", "image/x-pcx", "image/x-portable-graymap", "video/x-gst-av-pgmyuv", "image/ppm", "video/x-prores", "video/x-rle, layout=(string)quicktime", "video/x-gst-av-roqvideo", "video/x-pn-realvideo", "image/x-sgi", "image/x-sun-raster", "video/x-svq", "image/x-tga", "image/tiff", "video/x-wmv, wmvversion=(int)1", "video/x-wmv, wmvversion=(int)2", "video/x-zmbv")
Capture Video resolution(s) ()
Capture Video frame rate(s) ()
Capture Video containers ("video/quicktime, variant=(string)3gpp", "video/x-msvideo", "video/x-flv", "video/quicktime, variant=(string)iso-fragmented", "video/x-matroska", "video/x-matroska-3d", "audio/x-matroska", "video/mj2", "video/quicktime, variant=(string)iso", "application/ogg", "audio/ogg", "video/ogg", "video/quicktime, variant=(string)apple", "video/quicktime", "audio/x-wav", "audio/x-rf64", "video/webm", "audio/webm", "video/quicktime, variant=(string)3g2", "application/x-gst-av-a64", "application/x-gst-av-adx", "audio/x-amr-nb-sh", "application/x-gst-av-apng", "application/x-gst-av-ast", "audio/x-au", "application/x-gst-av-avm2", "application/x-gst-av-bit", "application/x-gst-av-caf", "application/x-gst-av-chromaprint", "application/x-gst-av-dash", "application/x-gst-av-daud", "video/x-dv", "application/x-gst-av-dvd", "application/x-gst-av-f4v", "application/x-gst-av-ffm", "application/x-gst-av-filmstrip", "application/x-gst-av-fits", "application/gxf", "application/x-gst-av-hash", "application/x-gst-av-hds", "application/x-gst-av-hls", "application/x-gst-av-ico", "application/x-gst-av-ilbc", "video/quicktime, variant=(string)ipod", "application/x-gst-av-ircam", "application/x-gst-av-ismv", "video/x-ivf", "application/x-gst-av-latm", "application/x-gst-av-md5", "application/x-gst-av-mkvtimestamp_v2", "application/x-gst-av-mmf", "video/mpeg", "application/mxf", "application/x-gst-av-mxf_opatom", "application/x-gst-av-nut", "application/x-gst-av-oga", "application/x-gst-av-ogv", "application/x-gst-av-oma", "application/x-gst-av-opus", "video/quicktime, variant=(string)psp", "application/x-pn-realmedia", "application/x-gst-av-rso", "application/x-gst-av-rtsp", "application/x-gst-av-sap", "application/x-gst-av-singlejpeg", "application/x-gst-av-smjpeg", "application/x-gst-av-smoothstreaming", "application/x-gst-av-sox", "application/x-gst-av-spdif", "application/x-gst-av-spx", "application/x-gst-av-svcd", "application/x-shockwave-flash", "audio/x-ttafile", "application/x-gst-av-uncodedframecrc", "application/x-gst-av-vc1test", "application/x-gst-av-vcd", "application/x-gst-av-vob", "audio/x-voc", "application/x-gst-av-w64", "application/x-gst-av-webp", "application/x-gst-av-wtv", "audio/mpeg, mpegversion=(int)1")

void MainWindow::statusCamera(QCamera::Status) QCamera::LoadingStatus
void MainWindow::etatCamera(QCamera::State) QCamera::ActiveState
void MainWindow::statusCamera(QCamera::Status) QCamera::LoadedStatus
void MainWindow::statusCamera(QCamera::Status) QCamera::StartingStatus
void MainWindow::statusCamera(QCamera::Status) QCamera::ActiveStatus
Capture Mode  QFlags(0x2) CaptureVideo
void MainWindow::statusCamera(QCamera::Status) QCamera::LoadedStatus
void MainWindow::statusCamera(QCamera::Status) QCamera::StartingStatus
void MainWindow::statusCamera(QCamera::Status) QCamera::ActiveStatus
void MainWindow::enregistrerVideo() record()
void MainWindow::etatCaptureVideo(QMediaRecorder::State) QMediaRecorder::RecordingState
void MainWindow::afficherTempsEnregistrement(qint64) 0 ms "Enregistrement vidéo 0 s"
void MainWindow::afficherTempsEnregistrement(qint64) 0 ms "Enregistrement vidéo 0 s"
void MainWindow::afficherTempsEnregistrement(qint64) 1666 ms "Enregistrement vidéo 1 s"
void MainWindow::afficherTempsEnregistrement(qint64) 2666 ms "Enregistrement vidéo 2 s"
void MainWindow::enregistrerVideo() stop()
void MainWindow::etatCaptureVideo(QMediaRecorder::State) QMediaRecorder::StoppedState
qt5-camera-1 exited with code 0

Il est possible de faire quelques paramétrages de la vidéo avec la classe QVideoEncoderSettings et QAudioEncoderSettings. On modifiera ensuite les paramètres de l’objet de type QMediaRecorder avec setEncodingSettings().

Voir aussi

Retour au sommaire