Video Overview¶
Video playback
Video Features¶
Video Implementation Details¶
Playing Video in C++¶
You can use the
QMediaPlayer
class 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
QVideoFrame
class encapsulates a video frame and allows the contents to be mapped into system memory for manipulation or processing, while deriving a class fromQAbstractVideoSurface
allows you to receive these frames fromQMediaPlayer
andQCamera
.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 output
forQMediaPlayer
.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
QVideoRendererControl
class, and in QML you can set a custom object for the source of a VideoOutput with either a writablevideoSurface
property (that the instance will set it’s internal video surface to) or a readablemediaObject
property with aQMediaObject
derived class that implements theQVideoRendererControl
interface.The following snippet shows a class that has a writable
videoSurface
property 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
QMediaRecorder
class 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
QVideoProbe
class to access video frames as they flow through different parts of a media pipeline when using other classes likeQMediaPlayer
,QMediaRecorder
orQCamera
. 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.QAbstractVideoBuffer
The QAbstractVideoBuffer class is an abstraction for video data.
QAbstractPlanarVideoBuffer
The QAbstractPlanarVideoBuffer class is an abstraction for planar video data.
PySide2.QtMultimedia.QAbstractVideoFilter
The QAbstractVideoFilter class represents a filter that is applied to the video frames received by a VideoOutput type.
PySide2.QtMultimedia.QVideoFilterRunnable
The QVideoFilterRunnable class represents the implementation of a filter that owns all graphics and computational resources, and performs the actual filtering or calculations.
PySide2.QtMultimedia.QAbstractVideoSurface
The QAbstractVideoSurface class is a base class for video presentation surfaces.
PySide2.QtMultimedia.QVideoFrame
The QVideoFrame class represents a frame of video data.
PySide2.QtMultimedia.QVideoProbe
The QVideoProbe class allows you to monitor video frames being played or recorded.
PySide2.QtMultimedia.QVideoSurfaceFormat
The 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.