
06_Qt教案 多媒体
本文最后更新于 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的功能来处理视频播放。视频播放涉及视频文件的加载、播放控制以及视频渲染等功能。我们将介绍 QMediaPlayer
和 QVideoWidget
这两个主要类,并提供示例代码帮助理解如何使用这些类进行视频播放操作。
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中实现摄像头功能,包括如何捕捉视频流、显示视频、以及如何从摄像头获取图像数据。我们将着重介绍 QCamera
、QCameraViewfinder
和 QCameraImageCapture
这三个关键类,以及如何通过这些类来实现摄像头的操作和图像捕捉。
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:用于音频和视频录制,配合摄像头可以实现视频录制功能。
- 感谢你赐予我前进的力量