本文最后更新于 2025-02-24,学习久了要注意休息哟

第一章 音频功能

// 搜索
"http://music.163.com/api/search/get/web?csrf_token=hlpretag=&hlposttag=&s=周杰伦&type=1&offset=0&total=true&limit=10"

// 播放1406036590
"http://music.163.com/song/media/outer/url?id=1406036590.mp3";  // 须尽欢 1457476994
"http://music.163.com/song/media/outer/url?id=1457476994.mp3";  // 闲庭絮

// 歌词
"https://music.163.com/api/song/lyric?id=1815969317&lv=1&kv=1&tv=-1"

1.1 常用类

1.1.1 QMediaPlayer 音乐

QMediaPlayer 是 QtMultimedia 模块中的核心类,用于播放音频和视频。它支持播放多种格式的音频和视频文件(如 MP3、WAV、AVI、MP4 等),并允许进行基本的音频控制,如播放、暂停、音量控制等。

1、功能

  • 播放、暂停、停止音频或视频。
  • 音量控制、播放进度、静音设置。
  • 支持本地文件、网络流媒体的播放。

2、常用API

// 设置要播放的音频或视频文件
setMedia(const QMediaContent &media)

// 播放控制
play();   // 开始播放
pause();  // 暂停播放
stop();   // 停止播放并重置播放进度

// 音量控制
setVolume(int volume);  // 设置音量,范围是 0 到 100
volume();               // 获取当前音量

// 播放进度
setPosition(qint64 position);  // 设置播放进度,单位是毫秒
position();                   // 获取当前播放进度,单位是毫秒

// 总时长
duration
// 获取播放状态
state();  // 获取当前播放状态

3、示例程序

#include <QMediaPlayer>
#include <QUrl>

QMediaPlayer *player = new QMediaPlayer;

// 设置要播放的音频文件
player->setMedia(QUrl::fromLocalFile("path/to/music.mp3")); // 本地
player->setMedia(QUrl("http://music.163.com/song/media/outer/url?id=1815969317.mp3"));

// 开始播放
player->play();

// 设置音量
player->setVolume(50);

// 获取播放进度
qint64 currentPosition = player->position();
qDebug() << "当前播放进度:" << currentPosition;

// 停止播放
player->stop();

音乐有两个重要的信号

positionChanged(qint64),歌曲播放的位置发生改变,一般可以用来作为播放进度

durationChanged(qint64),歌曲的总时长发生改变,一般可以用来判断是否切换了歌曲和获得当前切换歌曲的总时长

1.1.2 QMediaPlaylist 音乐列表

QMediaPlaylist 是 QtMultimedia 模块中的一个类,用于管理和播放多个音频或视频文件。它允许你将多个音频文件添加到播放列表中,并控制这些文件的播放顺序(如顺序播放、随机播放、循环播放等)。


1. 功能

  • 管理音频文件列表:将多个音频文件添加到播放列表中。
  • 播放模式:支持多种播放模式,如顺序播放、随机播放、循环播放等。
  • 控制播放顺序:通过设置当前播放文件的索引,控制播放顺序。
  • 批量操作:支持批量添加、删除音频文件,方便操作大规模的音乐列表。

2. 常用 API

// 添加音频文件到播放列表
addMedia(const QMediaContent &content);

// 批量添加音频文件
addMedia(const QList<QMediaContent> &contentList);

// 获取当前播放的媒体文件
currentMedia();

// 设置播放模式
setPlaybackMode(QMediaPlaylist::PlaybackMode mode);

// 获取播放模式
playbackMode();

// 设置当前播放的索引
setCurrentIndex(int index);

// 获取当前播放的索引
currentIndex();

3. 播放模式

QMediaPlaylist::PlaybackMode 是一个枚举类型,提供了不同的播放模式选项:

QMediaPlaylist::Sequential`**:顺序播放,按列表顺序播放文件。
QMediaPlaylist::Loop:循环播放,播放到列表的最后一项后,自动重新从第一项开始。
QMediaPlaylist::Random:随机播放,随机选择播放列表中的文件。
QMediaPlaylist::CurrentItemInLoop:循环播放当前项。

4. 示例程序

#include <QMediaPlayer>
#include <QMediaPlaylist>
#include <QUrl>
#include <QPushButton>
#include <QVBoxLayout>
#include <QWidget>

class MusicPlayerWidget : public QWidget
{
    Q_OBJECT

public:
    MusicPlayerWidget(QWidget *parent = nullptr) : QWidget(parent)
    {
        // 创建 QMediaPlayer 和 QMediaPlaylist
        player = new QMediaPlayer(this);
        playlist = new QMediaPlaylist(this);

        // 将播放列表添加到播放器
        player->setPlaylist(playlist);

        // 设置播放模式
        playlist->setPlaybackMode(QMediaPlaylist::Loop);  // 循环播放

        // 添加音乐文件到播放列表
        playlist->addMedia(QUrl::fromLocalFile("path/to/music1.mp3"));
        playlist->addMedia(QUrl::fromLocalFile("path/to/music2.mp3"));

        // 创建播放按钮
        playButton = new QPushButton("Play", this);

        // 设置布局
        layout = new QVBoxLayout(this);
        layout->addWidget(playButton);

        // 连接信号和槽
        connect(playButton, &QPushButton::clicked, this, &MusicPlayerWidget::togglePlayback);
    }

    ~MusicPlayerWidget()
    {
        delete player;
        delete playlist;
        delete playButton;
    }

private slots:
    // 切换播放/暂停
    void togglePlayback()
    {
        if (player->state() == QMediaPlayer::PlayingState) {
            player->pause();
            playButton->setText("Play");
        } else {
            player->play();
            playButton->setText("Pause");
        }
    }

private:
    QMediaPlayer *player;       // 媒体播放器
    QMediaPlaylist *playlist;   // 播放列表
    QPushButton *playButton;    // 播放按钮
    QVBoxLayout *layout;        // 布局
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    MusicPlayerWidget window;
    window.resize(400, 200);
    window.setWindowTitle("Qt Music Player");
    window.show();

    return app.exec();
}

其他类

QMediaRecorder 录音

QAudioOutput 类用于控制音频的输出。它是处理音频播放时的输出设备和音频格式的主要类。

QAudioDeviceInfo 类用于提供有关音频设备的信息。你可以使用它来获取系统中可用的音频设备的信息,例如,设备支持的音频格式、设备名称等。

1.2 示例程序

第二章 视频功能

本章主要介绍如何使用Qt的功能来处理视频播放。视频播放涉及视频文件的加载、播放控制以及视频渲染等功能。我们将介绍 QMediaPlayerQVideoWidget 这两个主要类,并提供示例代码帮助理解如何使用这些类进行视频播放操作。

2.1 常用类

2.1.1 QMediaPlayer - 视频播放

QMediaPlayer 类是 QtMultimedia 模块中的一个重要类,用于音频和视频的播放。它支持多种视频格式的播放,包括 MP4、AVI、MKV 等,并提供了丰富的控制功能,如播放、暂停、音量调节、播放进度控制等。

1、功能

  • 播放、暂停、停止视频。
  • 控制音量、播放进度。
  • 支持多种视频文件格式,包含本地和网络流媒体播放。
  • 视频渲染至指定的控件(如 QVideoWidget)。

2、常用 API

// 设置要播放的视频文件
setMedia(const QMediaContent &media);

// 播放控制
play();   // 播放
pause();  // 暂停
stop();   // 停止播放

// 音量控制
setVolume(int volume);  // 设置音量 (0-100)
volume();               // 获取当前音量

// 播放进度控制
setPosition(qint64 position);  // 设置播放进度(毫秒)
position();                   // 获取当前播放进度

// 获取视频的总时长
duration

// 获取播放器的播放状态
state();  // 获取当前播放状态

3、示例程序

#include <QMediaPlayer>
#include <QVideoWidget>
#include <QUrl>
#include <QWidget>
#include <QPushButton>
#include <QVBoxLayout>

class VideoPlayerWidget : public QWidget
{
    Q_OBJECT

public:
    VideoPlayerWidget(QWidget *parent = nullptr) : QWidget(parent)
    {
        // 创建 QMediaPlayer 和 QVideoWidget
        player = new QMediaPlayer(this);
        videoWidget = new QVideoWidget(this);

        // 将 QMediaPlayer 的视频输出设置到 QVideoWidget
        player->setVideoOutput(videoWidget);

        // 设置要播放的视频文件
        player->setMedia(QUrl::fromLocalFile("path/to/video.mp4"));

        // 创建播放按钮
        playButton = new QPushButton("Play", this);

        // 设置布局
        layout = new QVBoxLayout(this);
        layout->addWidget(videoWidget);
        layout->addWidget(playButton);

        // 连接信号和槽
        connect(playButton, &QPushButton::clicked, this, &VideoPlayerWidget::togglePlayback);
    }

    ~VideoPlayerWidget()
    {
        delete player;
        delete videoWidget;
        delete playButton;
    }

private slots:
    // 切换播放/暂停
    void togglePlayback()
    {
        if (player->state() == QMediaPlayer::PlayingState) {
            player->pause();
            playButton->setText("Play");
        } else {
            player->play();
            playButton->setText("Pause");
        }
    }

private:
    QMediaPlayer *player;
    QVideoWidget *videoWidget;
    QPushButton *playButton;
    QVBoxLayout *layout;
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    VideoPlayerWidget window;
    window.resize(640, 480);
    window.setWindowTitle("Qt Video Player");
    window.show();

    return app.exec();
}

重要信号

  • positionChanged(qint64):视频播放位置变化,通常用于更新UI中的播放进度条。
  • durationChanged(qint64):视频的总时长发生变化,用于更新UI中显示的总时长。

2.1.2 QVideoWidget - 视频渲染

QVideoWidget 是 Qt 用于视频渲染的控件,它能够将视频流显示在一个窗口中。你可以将 QMediaPlayer 的视频输出设置为 QVideoWidget,从而使视频在该控件内播放。

1、功能

  • 视频渲染:将视频显示在窗口内。
  • 支持视频大小调整,自动适应窗口大小。
  • 配合 QMediaPlayer 使用,显示视频内容。

2、常用 API

// 设置视频渲染窗口
setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing); // 设置渲染的抗锯齿效果
resizeEvent(QResizeEvent *event);  // 窗口大小变化时自动调整视频大小

3、示例程序

QMediaPlayer *player = new QMediaPlayer;
QVideoWidget *videoWidget = new QVideoWidget;

// 设置视频输出
player->setVideoOutput(videoWidget);

// 播放视频
player->setMedia(QUrl::fromLocalFile("path/to/video.mp4"));
player->play();

2.2 播放控制

视频播放的基本操作与音频播放类似,包括播放、暂停、停止、音量控制等。

1、控制音量

player->setVolume(50);  // 设置音量(范围:0到100)
qDebug() << "当前音量:" << player->volume();

2、播放进度

你可以控制视频的播放进度:

player->setPosition(10000);  // 设置播放进度,单位为毫秒(10秒)
qDebug() << "当前进度:" << player->position();

2.3 播放列表

你也可以使用 QMediaPlaylist 来管理多个视频文件并控制它们的播放顺序,类似于音频播放列表。

2.3.1 常用 API

// 添加视频文件到播放列表
playlist->addMedia(QMediaContent(QUrl::fromLocalFile("path/to/video.mp4")));

// 设置播放模式
playlist->setPlaybackMode(QMediaPlaylist::Loop);  // 循环播放

// 获取当前播放的视频
playlist->currentMedia();

2.4 其他相关类

  • QMediaRecorder:用于视频录制功能,可以录制视频并保存。
  • QAudioOutput:控制音频输出,处理音频播放时的输出设备和音频格式。
  • QAudioDeviceInfo:提供音频设备的信息,如设备名称和支持的音频格式。

第三章 摄像头功能

本章将介绍如何在Qt中实现摄像头功能,包括如何捕捉视频流、显示视频、以及如何从摄像头获取图像数据。我们将着重介绍 QCameraQCameraViewfinderQCameraImageCapture 这三个关键类,以及如何通过这些类来实现摄像头的操作和图像捕捉。

3.1 常用类

3.1.1 QCamera - 摄像头控制

QCamera 是 QtMultimedia 模块中的类,用于与摄像头硬件进行交互。通过 QCamera 类,你可以控制摄像头的启动、停止、拍照等操作。

功能

  • 启动和停止摄像头。
  • 获取摄像头的图像流。
  • 设置摄像头参数,如分辨率、闪光灯等。

常用 API

// 启动摄像头
start();

// 停止摄像头
stop();

// 获取当前摄像头状态
state();  // 返回当前摄像头的状态,例如摄像头正在运行、暂停等

// 设置摄像头参数(如分辨率、对焦等)
setViewfinder(QCameraViewfinder *viewfinder);

示例程序

#include <QCamera>
#include <QCameraViewfinder>
#include <QCameraImageCapture>
#include <QVBoxLayout>
#include <QWidget>
#include <QPushButton>

class CameraWidget : public QWidget
{
    Q_OBJECT

public:
    CameraWidget(QWidget *parent = nullptr) : QWidget(parent)
    {
        // 创建 QCamera 和 QCameraViewfinder
        camera = new QCamera(this);
        viewfinder = new QCameraViewfinder(this);
        imageCapture = new QCameraImageCapture(camera);

        // 将 QCamera 的视频输出设置到 QCameraViewfinder
        camera->setViewfinder(viewfinder);

        // 创建开始/停止按钮
        startButton = new QPushButton("Start Camera", this);

        // 设置布局
        layout = new QVBoxLayout(this);
        layout->addWidget(viewfinder);
        layout->addWidget(startButton);

        // 连接信号和槽
        connect(startButton, &QPushButton::clicked, this, &CameraWidget::toggleCamera);
    }

    ~CameraWidget()
    {
        delete camera;
        delete viewfinder;
        delete imageCapture;
        delete startButton;
    }

private slots:
    // 启动或停止摄像头
    void toggleCamera()
    {
        if (camera->state() == QCamera::ActiveState) {
            camera->stop();
            startButton->setText("Start Camera");
        } else {
            camera->start();
            startButton->setText("Stop Camera");
        }
    }

private:
    QCamera *camera;            // 摄像头
    QCameraViewfinder *viewfinder;  // 摄像头视频显示控件
    QCameraImageCapture *imageCapture;  // 图像捕捉
    QPushButton *startButton;       // 启动按钮
    QVBoxLayout *layout;            // 布局
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    CameraWidget window;
    window.resize(640, 480);
    window.setWindowTitle("Qt Camera");
    window.show();

    return app.exec();
}

重要信号

  • stateChanged(QCamera::State state):摄像头状态变化,通知应用程序摄像头的状态(例如启动、暂停等)。
  • error(QCamera::Error error):摄像头发生错误时触发。

3.1.2 QCameraViewfinder - 摄像头视频显示

QCameraViewfinder 是一个控件,能够显示来自 QCamera 的实时视频流。你可以将它作为一个窗口部件嵌入到应用程序的界面中,用于展示摄像头捕捉到的视频画面。

功能

  • 显示摄像头的实时视频流。
  • 支持自动适应窗口大小,展示视频画面。

常用 API

// 设置视频显示窗口
setAspectRatioMode(Qt::KeepAspectRatio); // 保持宽高比显示

示例程序

QCameraViewfinder *viewfinder = new QCameraViewfinder(this);
camera->setViewfinder(viewfinder); // 设置摄像头的输出到此控件
viewfinder->show();

3.1.3 QCameraImageCapture - 图像捕捉

QCameraImageCapture 用于捕捉单个图像。它通常与 QCamera 配合使用,可以用来拍摄照片并保存到磁盘。

功能

  • 捕捉图像并保存。
  • 支持设置图像质量、格式等。

常用 API

// 捕捉图像
capture();

// 设置图像保存目录
setCaptureDestination(QCameraImageCapture::CaptureToFile);

示例程序

// 设置图像捕捉对象
imageCapture = new QCameraImageCapture(camera);

// 捕捉图像
imageCapture->capture();

// 连接信号,获取捕捉结果
connect(imageCapture, &QCameraImageCapture::imageCaptured, this, &CameraWidget::processCapturedImage);

重要信号

  • imageCaptured(int id, const QImage &image):图像捕捉完成时触发,返回捕捉到的图像。

3.2 摄像头参数

你可以通过 QCamera 设置一些摄像头参数,例如分辨率、对焦模式、闪光灯等。这些参数会影响摄像头的捕捉效果。

设置分辨率

QList<QSize> availableResolutions = camera->supportedViewfinderResolutions();
camera->setViewfinderResolution(availableResolutions.first()); // 设置为支持的分辨率

设置对焦模式

QCameraFocus *focus = camera->focus();
focus->setFocusMode(QCameraFocus::ContinuousFocus);  // 设置为连续对焦模式

控制闪光灯

QCameraFlash *flash = camera->flash();
flash->setFlashMode(QCameraFlash::FlashAuto);  // 设置闪光灯为自动模式

3.3 摄像头错误与状态管理

在使用摄像头时,有时会遇到一些错误或状态变化。通过监听 QCamera 的相关信号,你可以有效地处理这些问题。

错误信号

connect(camera, &QCamera::errorOccurred, this, &CameraWidget::handleError);

错误处理槽

void CameraWidget::handleError(QCamera::Error error)
{
    qDebug() << "摄像头错误:" << error;
    // 可以根据错误类型进行相应处理,例如显示错误信息等
}

3.4 其他相关类

  • QCameraInfo:提供关于可用摄像头的信息,可以用来选择不同的摄像头。
  • QMediaRecorder:用于音频和视频录制,配合摄像头可以实现视频录制功能。