多媒体(Multimedia)是多种媒体的综合,一般包括文本,声音和图像等多种媒体形式。在计算机系统中,多媒体指组合两种或两种以上媒体的一种人机交互式信息交流和传播媒体。使用的媒体包括文字、图片、照片、声音、动画和影片,以及程式所提供的互动功能。Qt 的多媒体模块提供了音频、视频、录音、摄像头拍照和录像等功能。
Qt 多媒体模块提供了很多类, 主要有 QMediaPlayer, QSound、 QSoundEffect、QAudioOutput、QAudioInput、 QAudioRecorder、 QVideoWidget。在 Qt 里使用使用 Qt 多媒体模块,需要在 pro 项目文件里添加如下语句:
QT += multimedia
QMediaPlayer常用函数:
//设置播放的媒体
[slot] void QMediaPlayer::setMedia(const QMediaContent &media, QIODevice *stream = nullptr);
//设置播放列表
void setPlaylist(QMediaPlaylist *playlist);
//播放列表需要设置播放模式,使用播放列表的成员函数设置
void setPlaybackMode(QMediaPlaylist::PlaybackMode mode);
循环播放:QMediaPlaylist::Loop
随机播放:QMediaPlaylist::Random
play() ------- 播放
stop() ------- 停止
pause() ------ 暂停
//当前播放媒体
QMediaContent currentMedia() const;
//设置音量
void setVolume(int volume);
//设置进度
void setPosition(qint64 position);
常用信号:
1.状态改变
[signal] void QMediaPlayer::stateChanged(QMediaPlayer::State state);
多媒体停止状态:QMediaPlayer::StoppedState 0
多媒体运行状态:QMediaPlayer::PlayingState 1
多媒体暂停状态:QMediaPlayer::PauseState 2
2.播放媒体改变(歌曲切换)
[signal] void QMediaPlayer::currentMediaChanged(const QMediaContent &media);
3.播放周期(总长度)改变(歌曲切换)
[signal] void QMediaPlayer::durationChanged(qint64 duration);
4.播放进度改变(快进/快退)
[signal] void QMediaPlayer::positionChanged(qint64 position);
QMediaPlaylist播放列表
1.添加媒体,如歌曲,视频
bool QMediaPlaylist::addMedia(const QMediaContent &content);
2.删除媒体
bool QMediaPlaylist::removeMedia(int pos);
3.清空媒体
bool QMediaPlaylist::clear();
4.设置当前媒体 注意与CurrentRow的区别
[slot] void QMediaPlaylist::setCurrentIndex(int playlistPosition);
若是播放视频,QMediaPlayer提供了成员函数,用来指定视频输出窗口
使用了视频播放窗口,需要在项目中添加如下内容
//在项目文件中添加
QT += multimedia multimediawidgets
//在头文件中添加
#include
注意:子窗口全屏播放与恢复
全屏播放:Qt通过子窗口的成员函数showFullScreen实现窗口全屏,但是只允许顶层窗口全屏,子窗口如果要全屏必须先升级成顶层窗口。
QWidget ------------ setWindowFlags(Qt::Window); //设置为顶层窗口
QWidget ------------ showFullScreen(); //将顶层窗口设置为全屏
恢复播放:子窗口退出全屏,也必须先恢复成子窗口,再通过showNormal成员函数退出全屏
QWidget ------------ setWindowFlags(Qt::SubWindow); //设置为子窗口
QWidget ------------ showNormal(); //子窗口正常显示
二、QTextToSpeech类Qt5.8开始加入文字转语音的功能,使用QTextToSpeech类,使用该类需要在项目文件中加入texttospeech模块。
QT += texttospeech
使用步骤:
1.选择语音引擎
//获取可支持的语音引擎
[static] QStringList QTextToSpeech::availableEngines();
//构造QTextToSpeech对象可以选择引擎
QTextToSpeech::QTextToSpeech(const QString &engine, QObject *parent = nullptr);
2.选择语言,声音类型,音量,音调和语速
注意:前两步不操作就使用默认。
3.转换
[slot] void QTextToSpeech::say(const QString &text);
//调用系统的语音模块播放文本信息
1. QTextToSpeech tts = new QTextToSpeech(this); //创建对象
2. tts->say(QString("内容")); //要转换的文字
三、QCamera类摄像头是视频输入/捕获的硬件,在不同的系统和硬件环境下,可以选择不同的处理方法,主要介绍在windows如何处理摄像头的信息。
在工程中使用QCamera相关操作,需要在工程中添加多媒体模块,多媒体模块中包含了处理摄像头的类
QT += multimedia multimediawidgets
QCameraInfo(摄像头信息类)
//返回当前系统中可用的摄像头信息:返回摄像头信息的链表
[static] QList QCameraInfo::availableCameras(QCamera::Position position = QCamera::UnspecifiedPosition);
//获取摄像头的描述信息
QString QCameraInfo::description() const;
//获取摄像头的设备名
QString QCameraInfo::deviceName() const;
QCamera(摄像头类)
//构造函数,两种方式,传入摄像头描述或者设备名
QCamera::QCamera(const QCameraInfo &cameraInfo, QObject *parent = nullptr); QCamera::QCamera(const QByteArray &deviceName, QObject *parent = nullptr);
//设置显示窗口
void QCamera::setViewfinder(QVideoWidget *viewfinder); void QCamera::setViewfinder(QGraphicsVideoItem *viewfinder); void QCamera::setViewfinder(QAbstractVideoSurface *surface);
//槽函数
//开始采集
[slot] void QCamera::start();
//停止采集
[slot] void QCamera::stop();
QCameraImageCapture(摄像头截屏类)
//构造函数:
QCameraImageCapture::QCameraImageCapture(QMediaObject *mediaObject, QObject *parent = nullptr);
//截屏槽函数:参数就是截屏图片的保存路径
[slot] int QCameraImageCapture::capture(const QString &file = QString());
//截屏完成信号,id代表截屏的编号,preview就是截屏的图像
[signal] void QCameraImageCapture::imageCaptured(int id, const QImage &preview);
四、简易音乐播放器mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
#include
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_platBtn_clicked();
void on_stopBtn_clicked();
void on_pauseBtn_clicked();
void on_prevBtn_clicked();
void on_nextBtn_clicked();
void on_clearBtn_clicked();
void on_delBtn_clicked();
void on_addBtn_clicked();
void on_listWidget_itemDoubleClicked(QListWidgetItem *item);
void on_verticalSlider_sliderMoved(int position);
void on_horizontalSlider_sliderMoved(int position);
private:
Ui::MainWindow *ui;
QMediaPlayer *player; //播放器
QMediaPlaylist *playlist; //播放列表
QString music_duration; //记录当前媒体周期
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
#include
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
player = new QMediaPlayer(this);
playlist = new QMediaPlaylist(this);
//设置播放列表模式
playlist->setPlaybackMode(QMediaPlaylist::Loop); //循环模式
//设置播放器的播放列表
player->setPlaylist(playlist);
//周期改变,
connect(player,&QMediaPlayer::durationChanged,this,[&](quint64 duration){
//设置进度条的最大值
ui->horizontalSlider->setRange(0,duration);
//显示周期
music_duration = QString("%1:%2").arg(duration/1000/60,2,10,QLatin1Char('0')).arg(duration/1000%60,2,10,QLatin1Char('0'));
ui->pro->setText(QString("00:00/%1").arg(music_duration));
//显示切换歌曲
ui->listWidget->setCurrentRow(playlist->currentIndex());
});
//进度改变
connect(player,&QMediaPlayer::positionChanged,this,[&](quint64 position){
//更新进度条
ui->horizontalSlider->setValue(position);
//qDebug()play();
//设置音量
player->setVolume(ui->verticalSlider->value());
ui->pauseBtn->setText("暂停");
ui->pauseBtn->setEnabled(true);
}
//停止
void MainWindow::on_stopBtn_clicked()
{
player->stop();
ui->pauseBtn->setText("暂停");
ui->pauseBtn->setEnabled(false);
}
//暂停 / 继续
void MainWindow::on_pauseBtn_clicked()
{
if(player->state() == QMediaPlayer::PlayingState)
{
player->pause();
ui->pauseBtn->setText("继续");
}
else if(player->state() == QMediaPlayer::PausedState)
{
player->play();
ui->pauseBtn->setText("暂停");
}
}
//上一首
void MainWindow::on_prevBtn_clicked()
{
int row = ui->listWidget->currentRow();
if(row == 0)
{
row = ui->listWidget->count()-1;
}
else
row--;
ui->listWidget->setCurrentRow(row);
playlist->setCurrentIndex(row);
player->play();
player->setVolume(ui->verticalSlider->value());
ui->pauseBtn->setText("暂停");
ui->pauseBtn->setEnabled(true);
}
//下一首
void MainWindow::on_nextBtn_clicked()
{
int row = ui->listWidget->currentRow();
if(row == ui->listWidget->count()-1)
{
row = 0;
}
else
row++;
ui->listWidget->setCurrentRow(row);
playlist->setCurrentIndex(row);
player->play();
player->setVolume(ui->verticalSlider->value());
ui->pauseBtn->setText("暂停");
ui->pauseBtn->setEnabled(true);
}
void MainWindow::on_clearBtn_clicked()
{
ui->listWidget->clear();
playlist->clear();
}
void MainWindow::on_delBtn_clicked()
{
int row = ui->listWidget->currentRow();
//取出该项
QListWidgetItem *item = ui->listWidget->takeItem(row);
if(item)
{
delete item;
}
//再删除playList播放列表中的
playlist->removeMedia(row);
}
//添加音乐
void MainWindow::on_addBtn_clicked()
{
QStringList music_files = QFileDialog::getOpenFileNames(this,"选择音乐文件","/home/xiaochao/qt/myMusic","*.mp3 *.WAV");
//去重
for(int i = 0;ilistWidget->count();i++)
{
for(int j = 0;jlistWidget->item(i)->text() == music_files.at(j))
{
music_files.removeAt(j);
break;
}
}
}
//如果无文件添加
if(music_files.isEmpty())return ;
//将音乐文件同时添加到playlist播放列表和listWidget显示列表中
for(int i = 0;iaddMedia(QUrl::fromLocalFile(file));
}
ui->listWidget->addItems(music_files);
ui->listWidget->setCurrentRow(0); //定位
}
//双击播放
void MainWindow::on_listWidget_itemDoubleClicked(QListWidgetItem *item)
{
//指定播放文件
int row = ui->listWidget->currentRow();
playlist->setCurrentIndex(row);
//开始播放
player->play();
//设置音量
player->setVolume(ui->verticalSlider->value());
ui->pauseBtn->setText("暂停");
ui->pauseBtn->setEnabled(true);
}
//音量调节
void MainWindow::on_verticalSlider_sliderMoved(int position)
{
player->setVolume(position);
ui->vol->setText(QString("音量:%1").arg(position)); //更新显示
}
//歌曲进度调节
void MainWindow::on_horizontalSlider_sliderMoved(int position)
{
player->setPosition(position);
}
运行效果:
五、简易视频播放器
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
#include
#include //video专门的播放窗口
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
bool eventFilter(QObject *watched, QEvent *event);
private slots:
void on_platBtn_clicked();
void on_stopBtn_clicked();
void on_pauseBtn_clicked();
void on_prevBtn_clicked();
void on_nextBtn_clicked();
void on_addBtn_clicked();
void on_delBtn_clicked();
void on_clearBtn_clicked();
void on_horizontalSlider_sliderMoved(int position);
void on_listWidget_itemDoubleClicked(QListWidgetItem *item);
void on_fullBtn_clicked();
void on_verticalSlider_sliderMoved(int position);
private:
Ui::MainWindow *ui;
QMediaPlayer *player; //播放器
QMediaPlaylist *playlist; //播放列表
QVideoWidget *vw; //播放窗口
QString video_duration; //视频的播放时长
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
#include
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
player = new QMediaPlayer(this);
playlist = new QMediaPlaylist(this);
vw = new QVideoWidget(this);
//安装过滤器:在按下esc时退出全屏
vw->installEventFilter(this);
ui->horizontalLayout->addWidget(vw);//将播放视频的窗口添加到布局中
//设置播放器显示的窗口
player->setVideoOutput(vw);
//设置播放列表的播放模式:循环模式
playlist->setPlaybackMode(QMediaPlaylist::Loop);
//设置播放器的播放列表
player->setPlaylist(playlist);
//周期改变,
connect(player,&QMediaPlayer::durationChanged,this,[&](quint64 duration){
//设置进度条的最大值
ui->horizontalSlider->setRange(0,duration);
//显示周期
video_duration = QString("%1:%2:%3").arg(duration/1000/60/60,2,10,QLatin1Char('0'))
.arg(duration/1000/60%60,2,10,QLatin1Char('0'))
.arg(duration/1000%60,2,10,QLatin1Char('0'));
ui->pro->setText(QString("00:00:00/%1").arg(video_duration));
//显示切换歌曲
ui->listWidget->setCurrentRow(playlist->currentIndex());
});
//进度改变
connect(player,&QMediaPlayer::positionChanged,this,[&](quint64 position){
//更新进度条
ui->horizontalSlider->setValue(position);
//qDebug()showNormal();
vw->setParent(this);
ui->horizontalLayout->addWidget(vw);
}
}
return QWidget::eventFilter(watched,event);
}
MainWindow::~MainWindow()
{
delete ui;
}
//播放视频
void MainWindow::on_platBtn_clicked()
{
//指定播放文件
int row = ui->listWidget->currentRow();
playlist->setCurrentIndex(row);
//开始播放
player->play();
//设置音量
player->setVolume(ui->verticalSlider->value());
ui->pauseBtn->setText("暂停");
ui->pauseBtn->setEnabled(true);
}
void MainWindow::on_stopBtn_clicked()
{
player->stop();
ui->pauseBtn->setText("暂停");
ui->pauseBtn->setEnabled(false);
}
void MainWindow::on_pauseBtn_clicked()
{
if(player->state() == QMediaPlayer::PlayingState)
{
player->pause();
ui->pauseBtn->setText("继续");
}
else if(player->state() == QMediaPlayer::PausedState)
{
player->play();
ui->pauseBtn->setText("暂停");
}
}
//切换上一个
void MainWindow::on_prevBtn_clicked()
{
int row = ui->listWidget->currentRow();
if(row == 0)
{
row = ui->listWidget->count()-1;
}
else
row--;
ui->listWidget->setCurrentRow(row);
playlist->setCurrentIndex(row);
player->play();
player->setVolume(ui->verticalSlider->value());
ui->pauseBtn->setText("暂停");
ui->pauseBtn->setEnabled(true);
}
void MainWindow::on_nextBtn_clicked()
{
int row = ui->listWidget->currentRow();
if(row == ui->listWidget->count()-1)
{
row = 0;
}
else
row++;
ui->listWidget->setCurrentRow(row);
playlist->setCurrentIndex(row);
player->play();
player->setVolume(ui->verticalSlider->value());
ui->pauseBtn->setText("暂停");
ui->pauseBtn->setEnabled(true);
}
//添加视频
void MainWindow::on_addBtn_clicked()
{
QStringList video_files = QFileDialog::getOpenFileNames(this,"选择视频文件","/home/xiaochao/qt/myVideo","*.mp4 *.avi *.mkv");
//去重
for(int i = 0;ilistWidget->count();i++)
{
for(int j = 0;jlistWidget->item(i)->text() == video_files.at(j))
{
video_files.removeAt(j);
break;
}
}
}
//如果无文件添加
if(video_files.isEmpty())return ;
//将音乐文件同时添加到playlist播放列表和listWidget显示列表中
for(int i = 0;iaddMedia(QUrl::fromLocalFile(file));
}
ui->listWidget->addItems(video_files);
ui->listWidget->setCurrentRow(0); //定位
}
void MainWindow::on_delBtn_clicked()
{
int row = ui->listWidget->currentRow();
//取出该项
QListWidgetItem *item = ui->listWidget->takeItem(row);
if(item)
{
delete item;
}
//再删除playList播放列表中的
playlist->removeMedia(row);
}
void MainWindow::on_clearBtn_clicked()
{
ui->listWidget->clear();
playlist->clear();
}
//双击播放
void MainWindow::on_listWidget_itemDoubleClicked(QListWidgetItem *item)
{
//指定播放文件
int row = ui->listWidget->currentRow();
playlist->setCurrentIndex(row);
//开始播放
player->play();
//设置音量
player->setVolume(ui->verticalSlider->value());
ui->pauseBtn->setText("暂停");
ui->pauseBtn->setEnabled(true);
}
void MainWindow::on_fullBtn_clicked()
{
//vw升级为顶层窗口
vw->setWindowFlag(Qt::Window);
//vw全屏
vw->showFullScreen();
}
void MainWindow::on_verticalSlider_sliderMoved(int position)
{
player->setVolume(position);
ui->vol->setText(QString("音量:%1").arg(position)); //更新显示
}
void MainWindow::on_horizontalSlider_sliderMoved(int position)
{
player->setPosition(position);
}
运行效果:
六、简易摄像机
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
#include
#include //截屏类
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_startBtn_clicked();
void on_stopBtn_clicked();
void on_screenBtn_clicked();
private:
Ui::MainWindow *ui;
QCamera *ca; //摄像头对象
QVideoWidget *vw; //显示窗口对象
QCameraImageCapture *cap;//截屏对象
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include //截屏类
#include
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//获取系统可用的摄像头
QList infos = QCameraInfo::availableCameras();
//遍历显示
foreach(QCameraInfo info,infos)
{
ui->comboBox->addItem(info.deviceName());
}
}
MainWindow::~MainWindow()
{
delete ui;
}
//开始采集
void MainWindow::on_startBtn_clicked()
{
//摄像头对象
ca = new QCamera(ui->comboBox->currentText().toUtf8(),this);
//截屏对象
cap = new QCameraImageCapture(ca,this);
//连接截屏成功的信号
connect(cap,&QCameraImageCapture::imageCaptured,this,[&](int id, const QImage &preview){
qDebug()size());
ui->pic->setPixmap(map);
});
//摄像头显示窗口对象
vw = new QVideoWidget(ui->widget);
//调整大小
vw->resize(ui->widget->size());
//设置摄像头显示窗口
ca->setViewfinder(vw);
vw->show();
//开始采集
ca->start();
ui->startBtn->setEnabled(false);
ui->stopBtn->setEnabled(true);
ui->screenBtn->setEnabled(true);
}
//停止采集
void MainWindow::on_stopBtn_clicked()
{
//停止采集
ca->stop();
//隐藏窗口
vw->show();
delete ca;
delete vw;
ui->startBtn->setEnabled(true);
ui->stopBtn->setEnabled(false);
ui->screenBtn->setEnabled(false);
}
//截图
void MainWindow::on_screenBtn_clicked()
{
cap->capture();
//cap->capture("D:\\Data\\qt\\mycamera\\1.jpg");//截屏保存的路径,此时不能显示图片,图片还可能没有保存成功
}
运行效果