Video playback
可以使用
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();
可以使用 VideoOutput to render content that is provided by either a MediaPlayer 或 Camera 。 VideoOutput is a visual component that can be transformed or acted upon by shaders (as the QML 视频着色器效果范例 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.
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.
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 theQVideoRendererControl接口。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; };
可以使用
QMediaRecorderclass in conjunction with other classes to record video to disk. Primarily this is used with the camera, so consult 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.
存在 C++ 和 QML 两种可用范例。
QAbstractVideoBuffer 类是视频数据的抽象。
QAbstractPlanarVideoBufferThe QAbstractPlanarVideoBuffer class is an abstraction for planar video data.
The QAbstractVideoFilter class represents a filter that is applied to the video frames received by a VideoOutput type.
The QVideoFilterRunnable class represents the implementation of a filter that owns all graphics and computational resources, and performs the actual filtering or calculations.
QAbstractVideoSurface 类是视频呈现表面基类。
QVideoFrame 类表示视频数据的帧。
QVideoProbe 类允许监视视频帧播放或录制。
QVideoSurfaceFormat 类指定视频呈现表面的流格式。
qml-qtmultimedia-video.html
A convenience type for showing a specified video.
qml-qtmultimedia-mediaplayer.html
把媒体回放添加到场景。
qml-qtmultimedia-playlistitem.html
Defines an item in a Playlist.
qml-qtmultimedia-playlist.html
用于指定要播放媒体的列表。
qml-qtmultimedia-videooutput.html
渲染视频 (或摄像头取景器)。