警告

本节包含从C++自动翻译到Python的代码片段,可能包含错误。

视频概览

视频播放

视频功能

Qt Multimedia 提供了用于播放和操作视频数据的高级和低级 C++ 类,以及用于播放和录制的 QML 类型。这里介绍的一些类与 Camera OverviewAudio Overview 中介绍的内容有所重叠。

视频实现细节

在C++中播放视频

你可以使用QMediaPlayer类来解码视频文件,并使用QVideoWidgetQGraphicsVideoItem或自定义类来显示它。

这里有一个使用 QVideoWidget 的示例:

player = QMediaPlayer()
player.setSource(QUrl("http://example.com/myclip1.mp4"))
videoWidget = QVideoWidget()
player.setVideoOutput(videoWidget)
videoWidget.show()
player.play()

以及一个使用 QGraphicsVideoItem 的示例:

player = QMediaPlayer(self)
item = QGraphicsVideoItem()
player.setVideoOutput(item)
graphicsView.scene().addItem(item)
graphicsView.show()
player.setSource(QUrl("http://example.com/myclip4.ogv"))
player.play()

在QML中播放视频

你可以使用VideoOutput来渲染由MediaPlayerCamera提供的内容。VideoOutput是一个可视组件,可以嵌入到QQuickScene或Window中,而所有的媒体解码和播放控制则由MediaPlayerCaptureSession处理。为了方便起见,提供了一个Video元素。它将MediaPlayerVideoOutputAudioOutput元素组合在一个项目中。

处理低级视频帧

Qt Multimedia 提供了一些低级类,使处理视频帧变得更加容易。这些类主要用于编写处理视频或相机帧的代码(例如,检测条形码或应用花哨的晕影效果),或者需要以其他方式不支持的特殊方式显示视频。

QVideoFrame 类封装了一个视频帧,并允许将内容映射到系统内存中进行操作或处理。使用你自己的 QVideoSink 可以从 QMediaPlayerQCamera 接收这些帧。

录制视频

用于任何类型的音频和视频捕获或录制的核心类是QMediaCaptureSession(或CaptureSession QML类型)。你可以将QCamera(QML中的Camera)和QMediaRecorderMediaRecorder)连接到会话中,然后要求媒体录制器开始录制。

支持的媒体格式

支持的媒体格式最终取决于目标系统的配置。

Windows

默认情况下,MS Windows 目标上可用的内容取决于操作系统附带的 Windows Media Player 版本。有关官方信息,请参阅 Windows Media Player 文档

独立于Windows Media Player,当然还有许多可以安装的编解码器包。请参阅编解码器指南网站以获取一些示例。

安卓

查看Android支持的媒体格式以获取此信息。

Linux

在Linux上,这涉及到安装正确的GStreamer插件。

最低要求的GStreamer插件

  • gstreamer1.0-plugins-base

  • gstreamer1.0-plugins-good

  • gstreamer1.0-plugins-pulseaudio

对于Linux桌面目标,强烈建议安装gstreamer1.0-libav以获得良好的编解码器支持,并安装gstreamer1.0-vaapi以获得硬件加速。

在嵌入式Linux上,所需的插件集可能会有所不同。

在运行时确定支持的媒体格式

您可以在运行时使用静态的QMediaFormat API来确定目标系统上可用的格式。

示例

有C++和QML示例可供使用。

C++ 示例

Camera-Example

展示如何捕捉静态图像或录制视频。

Media-Player-Example

播放音频和视频。

QML 示例

QML-Media-Player-Example

使用QML MediaPlayer类型播放音频和视频。

QML-Video-Recorder

使用Qt Quick录制音频和视频。

参考文档

C++ 类

PySide6.QtMultimedia.QMediaPlayer

QMediaPlayer 类允许播放媒体文件。

PySide6.QtMultimedia.QCapturableWindow

用于获取可捕获窗口的基本信息。

PySide6.QtMultimedia.QMediaCaptureSession

QMediaCaptureSession 类允许捕获音频和视频内容。

PySide6.QtMultimedia.QMediaRecorder

QMediaRecorder 类用于编码和录制捕获会话。

PySide6.QtMultimedia.QScreenCapture

此类用于捕获屏幕。

PySide6.QtMultimedia.QVideoFrameInput

QVideoFrameInput 类用于通过 QMediaCaptureSession 向 QMediaRecorder 或视频输出提供自定义视频帧。

PySide6.QtMultimedia.QWindowCapture

此类用于捕获窗口。

PySide6.QtMultimedia.QAbstractVideoBuffer

QAbstractVideoBuffer 类是视频数据的抽象。

QAbstractVideoBuffer.MapData

QAbstractVideoBuffer::MapData 结构描述了映射的平面布局。

PySide6.QtMultimedia.QVideoFrame

QVideoFrame 类表示视频数据的一帧。

PySide6.QtMultimedia.QVideoFrameFormat

QVideoFrameFormat 类指定视频呈现表面的流格式。

PySide6.QtMultimedia.QVideoSink

QVideoSink 类表示视频数据的通用接收器。

PySide6.QtMultimediaWidgets.QVideoWidget

QVideoWidget 类提供了一个用于显示由媒体对象生成的视频的小部件。

QML 类型

qml-cameraformat.html

描述相机设备支持的视频格式。

qml-cameradevice.html

描述一个相机设备。

qml-qtmultimedia-mediaplayer.html

向场景中添加媒体播放功能。

qml-mediametadata.html

提供媒体文件的元数据。

qml-capturablewindow.html

CapturableWindow 类型用于获取可通过 WindowCapture 捕获的窗口的基本信息。

qml-qtmultimedia-capturesession.html

允许捕获音频和视频内容。

qml-qtmultimedia-mediarecorder.html

用于编码和记录在CaptureSession中生成的媒体。

qml-qtmultimedia-screencapture.html

此类型用于捕获屏幕。

qml-qtmultimedia-windowcapture.html

此类型用于捕获窗口。

定义播放列表中的一个项目。

qml-qtmultimedia-videooutput.html

渲染视频或相机取景器。

qml-qtmultimedia-video.html

用于显示指定视频的便捷类型。