Video Overview¶
Video playback
Video Features¶
Video Implementation Details¶
Playing Video in C++¶
You can use the
QMediaPlayerclass to decode a video file, and display it usingQVideoWidget,QGraphicsVideoItem, or a custom class.Here’s an example of using
QVideoWidget:player = new QMediaPlayer; playlist = new QMediaPlaylist(player); playlist->addMedia(QUrl("http://example.com/myclip1.mp4")); playlist->addMedia(QUrl("http://example.com/myclip2.mp4")); videoWidget = new QVideoWidget; player->setVideoOutput(videoWidget); videoWidget->show(); playlist->setCurrentIndex(1); player->play();And an example with
QGraphicsVideoItem:player = new QMediaPlayer(this); QGraphicsVideoItem *item = new QGraphicsVideoItem; player->setVideoOutput(item); graphicsView->scene()->addItem(item); graphicsView->show(); player->setMedia(QUrl("http://example.com/myclip4.ogv")); player->play();
Playing Video in QML¶
You can use VideoOutput to render content that is provided by either a MediaPlayer or a Camera . The VideoOutput is a visual component that can be transformed or acted upon by shaders (as the QML Video Shader Effects Example shows), while all media decoding and playback control is handled by the MediaPlayer .
Alternatively there is also a higher level Video type that acts as a single, visual element to play video and control playback.
Working with Low Level Video Frames¶
Qt Multimedia offers a number of low level classes to make handling video frames a bit easier. These classes are primarily used when writing code that processes video or camera frames (for example, detecting barcodes, or applying a fancy vignette effect), or needs to display video in a special way that is otherwise unsupported.
The
QVideoFrameclass encapsulates a video frame and allows the contents to be mapped into system memory for manipulation or processing, while deriving a class fromQAbstractVideoSurfaceallows you to receive these frames fromQMediaPlayerandQCamera.class MyVideoSurface : public QAbstractVideoSurface { QList<QVideoFrame::PixelFormat> supportedPixelFormats( QAbstractVideoBuffer::HandleType handleType = QAbstractVideoBuffer::NoHandle) const { Q_UNUSED(handleType); // Return the formats you will support return QList<QVideoFrame::PixelFormat>() << QVideoFrame::Format_RGB565; } bool present(const QVideoFrame &frame) { Q_UNUSED(frame); // Handle the frame and do your processing return true; } };and with an instance of this surface,
myVideoSurface, you can set the surface as thevideo outputforQMediaPlayer.player->setVideoOutput(myVideoSurface);Several of the built-in Qt classes offer this functionality as well, so if you decode video in your application, you can present it to classes that offer a
QVideoRendererControlclass, and in QML you can set a custom object for the source of a VideoOutput with either a writablevideoSurfaceproperty (that the instance will set it’s internal video surface to) or a readablemediaObjectproperty with aQMediaObjectderived class that implements theQVideoRendererControlinterface.The following snippet shows a class that has a writable
videoSurfaceproperty and receives frames through a public slotonNewVideoContentReceived(). These frames are then presented on the surface set insetVideoSurface().class MyVideoProducer : public QObject { Q_OBJECT Q_PROPERTY(QAbstractVideoSurface *videoSurface READ videoSurface WRITE setVideoSurface) public: QAbstractVideoSurface* videoSurface() const { return m_surface; } void setVideoSurface(QAbstractVideoSurface *surface) { if (m_surface != surface && m_surface && m_surface->isActive()) { m_surface->stop(); } m_surface = surface; if (m_surface) m_surface->start(m_format); } // ... public slots: void onNewVideoContentReceived(const QVideoFrame &frame) { if (m_surface) m_surface->present(frame); } private: QAbstractVideoSurface *m_surface; QVideoSurfaceFormat m_format; };
Recording Video¶
You can use the
QMediaRecorderclass in conjunction with other classes to record video to disk. Primarily this is used with the camera, so consult the Camera Overview for more information.
Monitoring Video Frames¶
You can use the
QVideoProbeclass to access video frames as they flow through different parts of a media pipeline when using other classes likeQMediaPlayer,QMediaRecorderorQCamera. After creating the high level media class, you can set the source of the video probe to that instance. This can be useful for performing some video processing tasks (like barcode recognition, or object detection) while the video is rendered normally. You can not affect the video frames using this class, and they may arrive at a slightly different time than they are being rendered.Here’s an example of installing a video probe while recording the camera:
camera = new QCamera; viewfinder = new QCameraViewfinder(); camera->setViewfinder(viewfinder); camera->setCaptureMode(QCamera::CaptureVideo); videoProbe = new QVideoProbe(this); if (videoProbe->setSource(camera)) { // Probing succeeded, videoProbe->isValid() should be true. connect(videoProbe, SIGNAL(videoFrameProbed(QVideoFrame)), this, SLOT(detectBarcodes(QVideoFrame))); } camera->start(); // Viewfinder frames should now also be emitted by // the video probe, even in still image capture mode. // Another alternative is to install the probe on a // QMediaRecorder connected to the camera to get the // recorded frames, if they are different from the // viewfinder frames.
Examples¶
There are both C++ and QML examples available.
C++ Examples¶
QML Examples¶
Reference Documentation¶
C++ Classes¶
PySide2.QtMultimedia.QAbstractVideoBufferThe QAbstractVideoBuffer class is an abstraction for video data.
QAbstractPlanarVideoBufferThe QAbstractPlanarVideoBuffer class is an abstraction for planar video data.
PySide2.QtMultimedia.QAbstractVideoFilterThe QAbstractVideoFilter class represents a filter that is applied to the video frames received by a VideoOutput type.
PySide2.QtMultimedia.QVideoFilterRunnableThe QVideoFilterRunnable class represents the implementation of a filter that owns all graphics and computational resources, and performs the actual filtering or calculations.
PySide2.QtMultimedia.QAbstractVideoSurfaceThe QAbstractVideoSurface class is a base class for video presentation surfaces.
PySide2.QtMultimedia.QVideoFrameThe QVideoFrame class represents a frame of video data.
PySide2.QtMultimedia.QVideoProbeThe QVideoProbe class allows you to monitor video frames being played or recorded.
PySide2.QtMultimedia.QVideoSurfaceFormatThe QVideoSurfaceFormat class specifies the stream format of a video presentation surface.
QML Types¶
qml-qtmultimedia-video.html
A convenience type for showing a specified video.
qml-qtmultimedia-mediaplayer.html
Add media playback to a scene.
qml-qtmultimedia-playlistitem.html
Defines an item in a Playlist.
qml-qtmultimedia-playlist.html
For specifying a list of media to be played.
qml-qtmultimedia-videooutput.html
Render video or camera viewfinder.
© 2022 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.