# 第十章 多媒体 Multimedia

{% hint style="info" %}
参考资料：<https://zhuanlan.zhihu.com/p/518446503>
{% endhint %}

**多媒体(Multimedia)**

Qt Multimedia 中的多媒体元素使播放和记录媒体（如声音、视频或图片）成为可能。解码和编码是通过特定于平台的后端处理的。例如，流行的 GStreamer 框架用于 Linux，WMF 用于 Windows，AVFramework 用于 OS X 和 iOS，Android 多媒体 API 用于 Android。

多媒体元素不是 Qt Quick 核心 API 的一部分。相反，它们是通过导入 Qt Multimedia 提供的单独 API 提供的，如下所示：

```
import QtMultimedia
```

**播放媒体(Playing Media)**

QML 应用程序中多媒体集成的最基本案例是播放媒体。 QtMultimedia 模块通过提供一个专用的 QML 组件来支持这一点：MediaPlayer。

MediaPlayer 组件是将媒体源连接到一个或多个输出通道的非可视项。根据媒体的性质（即音频、图像或视频），可以配置各种输出通道。

### （一）播放音频(Playing audio)&#x20;

在以下示例中，MediaPlayer 在空窗口中播放来自本地URL 的 mp3 示例音频文件：

**准备工作：**

* 添加一个音频文件资源

**QML代码如下：**

```
import QtQuick
import QtMultimedia
Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    MediaPlayer {
    id:player
    source: "qrc:/001.mp3"
    audioOutput: AudioOutput{

    }

    Component.onCompleted: {
    player.play()
    }
    }
}
```

在这个例子中，MediaPlayer 定义了两个属性：

* source：它包含要播放的媒体的 URL。它可以嵌入 (qrc://)、本地 (file://) 或远程 (https\://)。
* audioOutput：它包含一个音频输出通道，AudioOutput，连接到一个物理输出设备。默认情况下，它将使用系统默认的音频输出设备。

一旦主组件完全初始化，就会调用播放器的播放函数：

```
Component.onCompleted: {
    player.play()
    }
```

### （二）播放视频(Playing a video)

如果要播放图片或视频等视觉媒体，还必须定义一个 VideoOutput 元素以将生成的图像或视频放置在用户界面中。

在以下示例中，MediaPlayer 播放来自本地 URL 的 mp4 示例视频文件，并将视频内容置于窗口的中心：

**准备工作：**

* 添加一个视频文件资源

**QML代码如下：**

```
import QtQuick
import QtMultimedia
Window {
    width: 1920
    height: 1080
    visible: true
    title: qsTr("Hello World")

    MediaPlayer {
     id:player
     source: "qrc:/Res/001.mp4"
    audioOutput: AudioOutput{
    }
    videoOutput: vdo

    }

    VideoOutput{
    id:vdo
    anchors.fill: parent
    anchors.margins: 20
    }
    Component.onCompleted: {
      player.play()
    }
}

```

videoOutput：它包含视频输出通道VideoOutput，表示为在用户界面中显示视频而保留的视觉空间。

{% hint style="info" %}
请注意，VideoOutput 组件是一个可视项。因此，它必须在可视组件层次结构中创建，而不是在 MediaPlayer 本身中创建。
{% endhint %}

### **（三）**&#x63A7;制回放(Controlling the playback)

。。。

### （四）声音特效(Sound Effects

。。。

### （五）视频流(Video Streams)

VideoOutput 元素不限于与 MediaPlayer 元素结合使用。它还可以与各种视频源一起使用以显示视频流。

例如，我们可以使用 VideoOutput 来显示用户相机的实时视频流。为此，我们将把它与两个组件结合起来：Camera 和 CaptureSession。

**QML代码如下：**

```
import QtQuick
import QtMultimedia

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    CaptureSession{
        id:capturesession
        camera: Camera{

        }

    videoOutput: output
    }
    VideoOutput{
      id:output
      anchors.fill: parent
    }
    Component.onCompleted: capturesession.camera.start()
}

```

CaptureSession 组件提供了一种简单的方法来读取摄像机流、捕获静止图像或录制视频。

作为 MediaPlayer 组件，CaptureSession 元素提供了一个 videoOutput 属性。因此我们可以使用这个属性来配置我们自己的可视化组件。

最后，当应用程序加载完毕后，我们就可以开始摄像了：

```
Component.onCompleted: captureSession.camera.start()
```

{% hint style="info" %}
根据您的操作系统，此应用程序可能需要敏感的访问权限。如果您使用 qml 二进制文件运行此示例应用程序，将自动请求这些权限。 但是，如果您将其作为独立程序运行，您可能需要首先请求这些权限（例如：在 MacOS 下，您需要一个与应用程序捆绑在一起的专用 .plist 文件）。
{% endhint %}

### **（六）**&#x62CD;摄图像(Capturing Images)

机元素的主要功能之一是可用于拍照。我们将在一个简单的定格动画应用程序中使用它。通过构建应用程序，您将学习如何显示取景器、在相机之间切换、拍摄照片以及跟踪拍摄的照片。

。。。
