点击上方蓝字关注我们 8.1 访问系统摄像头在Qt 5中,多媒体由Qt Multimedia模块提供支持。Phonon框架不再是Qt的一部分,但它仍然由Phonon开发人员维护并支持Qt 5。 在QT5中,QCamera类为系统摄像头设备提供接口。 QCamera可与QCameraViewfinder一起用于取景器显示,QMediaRecorder用于视频录制,QCameraImageCapture用于拍摄图像。你可以使用QCameraInfo列出可用摄像头并选择使用哪一个。 要使用相关的QCamera类,需要在pro工程文件中添加multimedia模块:
8.1.1 获取系统上可用的摄像头信息QCameraInfo类提供有关摄像机设备的一般信息,允许查询系统当前可用的相机设备。 静态函数defaultCamera()和availableCameras()提供了所有可用相机的列表。 下列例子打印所有可用相机的名称:
QCameraInfo可用于构建QCamera。 以下示例实例化一个QCamera,其相机设备名为'mycamera':
你还可以使用QCameraInfo来获取有关相机设备的其他信息,如描述,系统上的物理位置或相机传感器方向等。
获取系统默认的相机静态函数:
返回系统上的默认摄像头。 在使用之前,应该使用isNull()检查返回的对象,以防没有默认相机或根本没有相机。
输出结果:
8.1.2 QCamera类介绍1. 设置相机捕获图像的模式
支持的模式如下:
2. 启动与停止相机槽函数
3. 设置取景器显示的位置
8.1.3 相机取景器QCameraViewfinder类提供了一个相机取景器的小部件。QCameraViewfinder类继承于QVideoWidget类,用于显示多媒体类提供的视频。 (配套代码CH8-1)
图 8.1.1 取景器显示样图 8.1.4 捕获图像数据QCameraImageCapture类用于记录媒体内容。 QCameraImageCapture类是高级图像记录类。它不是单独使用,而是用于访问其他媒体对象实现媒体录制功能,如QCamera。 1. 判断设备是否支持捕获模式
如果支持捕捉目标图像,则返回true; 否则返回false。 2. 设置图像捕获之后存放的位置
支持的目标模式:
3. 设置图像编码格式
QImageEncoderSettings类提供一组图像编码器设置。图像编码器设置对象用于指定QCameraImageCapture使用的图像编码器设置。通过构建QImageEncoderSettings对象,设置所需的属性,然后使用QCameraImageCapture :: setImageSettings()函数将其传递给QCameraImageCapture实例来选择图像编码器设置。 示例:
4. 设置缓冲区图像的格式
支持的格式如下:
5. 取消未完成的请求
取消未完成的拍摄请求,已经捕获并排队处理的图像可能会被丢弃。 6. 捕获图像并保存到文件
捕获图像并将其保存到文件。 这种操作在大多数情况下是异步的,需要关联信号进行操作。 如果传递一个空文件,相机后端将采用系统上的照片默认位置和命名方案,如果只指定没有完整路径的文件名,则图像将被保存到默认目录,用imageCaptured()和imageSaved()信号报告完整路径。 QCamera保存所有捕获参数,如曝光设置或图像处理参数,因此调用capture()后对相机参数的更改不会影响先前的捕获请求。 QCameraImageCapture :: capture()返回与ImageExposed(),imageCaptured()和imageSaved()信号一起使用的Capture Id参数。 执行capture函数之后会触发下列一些信号: QCameraImageCapture::imageExposed() //带有请求ID的帧被暴露时发出的信号。 QCameraImageCapture::imageCaptured() //发送带有请求标识的帧时发出的信号,但尚未处理和保存 QCameraImageCapture::imageSaved() //当具有请求标识的帧被保存到文件名时发出的信号。 QCameraImageCapture::error() //捕获请求标识失败并显示错误和errorString描述。 示例:
完整的信号函数:
|
#------------------------------------------------- # # Project created by QtCreator 2018-05-30T18:02:49 # #------------------------------------------------- QT += core gui QT += multimediawidgets QT += xml greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = QCamera TEMPLATE = app SOURCES += main.cpp\ widget.cpp HEADERS += widget.h FORMS += widget.ui |
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QCameraViewfinder> #include <QCameraImageCapture> #include <QCameraInfo> #include <QCameraImageCapture> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); QCamera * camera; QCameraViewfinder * view_finder; //取景器 QList<QCameraInfo> cameras; //存放系统支持的摄像头列表 QCameraImageCapture* camera_image_capture; private slots: void on_pushButton_GetImage_clicked(); void save_picture(int id,const QString file); void show_picture(int,const QImage);//显示拍照图片的槽函数 private: Ui::Widget *ui; }; #endif // WIDGET_H |
#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); cameras = QCameraInfo::availableCameras(); if(cameras.count()) { for(int i=0;i<cameras.count();i++) { qDebug()<<"设备唯一ID:"<<cameras.at(i).deviceName(); qDebug()<<"设备方向:"<<cameras.at(i).orientation(); } } else { qDebug()<<"系统没有可用相机!"; } /*创建摄像头对象,根据选择的摄像头打开*/ camera = new QCamera(cameras.at(0)); /*构造捕获的对象*/ camera_image_capture = new QCameraImageCapture(camera); /*关联信号槽--显示图片*/ connect(camera_image_capture,SIGNAL(imageCaptured(int,QImage)),this,SLOT(show_picture(int,QImage))); /*关联信号槽--返回保存照片的文件名称*/ connect(camera_image_capture,SIGNAL(imageSaved(int,const QString)),this,SLOT(save_picture(int,const QString))); //信号槽函数关联方式2 //connect(camera_image_capture,&QCameraImageCapture::imageCaptured,this,&MainWindow_camera::show_picture); /*设置捕获的目的地---到文件*/ camera_image_capture->setCaptureDestination(QCameraImageCapture::CaptureToFile); /*创建取景器*/ view_finder = new QCameraViewfinder(); /*将显示的位置加入到窗口中*/ //ui->verticalLayout->addWidget(view_finder); ui->horizontalLayout_2->insertWidget(0,view_finder); //插入到第一个位置 /*配置摄像头捕获模式为帧捕获模式*/ camera->setCaptureMode(QCamera::CaptureStillImage); /*设置取景器显示*/ camera->setViewfinder(view_finder); /*启动摄像头*/ camera->start(); } Widget::~Widget() { delete ui; } /*返回图片保存的文件名称*/ void Widget::save_picture(int id,const QString file) { qDebug()<<"保存的图片的编号:"<<id; qDebug()<<"图片保存的路径:"<<file; ui->lineEdit_ShowFileAddr->setText(file); //显示照片的路径 } /*在标签控件上显示拍照的图片*/ void Widget::show_picture(int id, const QImage image) { qDebug()<<"捕获的图片编号:"<<id; /* * 显示捕获的照片 * 可将image显示到指定控件上 */ //ui->label_ShowImage->setPixmap(QPixmap::fromImage(image).scaled(image.width()/2,image.height()/2)); ui->label_ShowImage->setPixmap(QPixmap::fromImage(image)); } void Widget::on_pushButton_GetImage_clicked() { /* * 触发imageCaptured和imageSaved信号 * 如果capture()不填写文件名系统会自动选择默认的路径 * */ camera_image_capture->capture(); } |
/*多媒体对象*/ QMediaPlayer *player = new QMediaPlayer; /*设置播放的文件*/ player->setMedia(QUrl::fromLocalFile("E:/KuGou/99.mp3")); /*音量设置*/ player->setVolume(50); /*开始播放*/ player->play(); |
#include <QMediaPlayer> #include <QMediaPlaylist> #include <QVideoWidget> /*多媒体对象*/ QMediaPlayer *player = new QMediaPlayer; QVideoWidget *videoWidget = new QVideoWidget; player->setVideoOutput(videoWidget); /*设置播放的文件*/ player->setMedia(QUrl::fromLocalFile("E:/linux-share-dir/QT/MediaPlayer/test_video/1.wmv")); /*音量设置*/ player->setVolume(50); /*开始播放*/ videoWidget->setWindowTitle("视频播放器"); videoWidget->show(); videoWidget->setGeometry(100,100,400,400); player->play(); |
QAudio::Role audioRole() const //获取当前的音频类型 void setAudioRole(QAudio::Role audioRole) //设置指定的音频类型 QList<QAudio::Role> QMediaPlayer::supportedAudioRoles() const //获取支持的音频类型,如果不支持设置,则返回空列表。 |
QAudio::UnknownRole | 0 | 音频类型未知或未定义 |
QAudio::MusicRole | 1 | 音乐 |
QAudio::VideoRole | 2 | 电影或视频的原声带 |
QAudio::VoiceCommunicationRole | 3 | 语音通信,如电话 |
QAudio::AlarmRole | 4 | 报警 |
QAudio::NotificationRole | 5 | 通知,例如传入电子邮件或聊天请求 |
QAudio::RingtoneRole | 6 | 铃声 |
QAudio::AccessibilityRole | 7 | 用于辅助功能,如使用屏幕阅读器 |
QAudio::SonificationRole | 8 | 用户界面声音 |
QAudio::GameRole | 9 | 游戏音频 |
void QMediaPlayer::setVideoOutput(QVideoWidget *output) 将QVideoWidget视频输出附加到媒体播放器。如果媒体播放器已经连接了视频输出,它将被替换为新的。 void QMediaPlayer::setVideoOutput(QGraphicsVideoItem *output) 附加一个QGraphicsVideoItem视频输出到媒体播放器。如果媒体播放器已经连接了视频输出,它将被替换为新的。 void QMediaPlayer::setVideoOutput(QAbstractVideoSurface *surface) 将视频Surface设置为媒体播放器的视频输出。如果已经在媒体播放器上设置了视频输出,则新表面将替换它。 |
const QIODevice *QMediaPlayer::mediaStream() const |
int volume() const void setVolume(int volume) |
State state() const |
QMediaPlayer::StoppedState | 0 | 媒体播放器没有播放内容,播放将从当前曲目开始播放。 |
QMediaPlayer::PlayingState | 1 | 媒体播放器正在播放内容。 |
QMediaPlayer::PausedState | 2 | 媒体播放器暂停播放,当前曲目的播放将从播放器暂停的位置恢复。 |
qint64 position() const void setPosition(qint64 position) |
QMediaPlaylist *playlist() const void setPlaylist(QMediaPlaylist *playlist) |
qreal playbackRate() const void setPlaybackRate(qreal rate) |
bool isVideoAvailable() const |
bool isMuted() const void setMuted(bool muted) |
bool isAudioAvailable() const |
QString errorString() const Error error() const |
常数 | 数值 | 描述 |
QMediaPlayer::NoError | 0 | 没有发生错误 |
QMediaPlayer::ResourceError | 1 | 媒体资源无法解析。 |
QMediaPlayer::FormatError | 2 | 没有(完全)支持媒体资源的格式。回放可能仍然是可能的,但没有音频或视频组件。 |
QMediaPlayer::NetworkError | 3 | 发生网络错误。 |
QMediaPlayer::AccessDeniedError | 4 | 没有适当的权限来播放媒体资源。 |
QMediaPlayer::ServiceMissingError | 5 | 没有找到有效的播放服务,播放无法继续。 |
connect(mediaPlayer, static_cast<void(QMediaPlayer::*)(QMediaPlayer::Error)>(&QMediaPlayer::error), [=](QMediaPlayer::Error error){ /* ... */ }); |
[slot] void QMediaPlayer::pause() |
[slot] void QMediaPlayer::play() |
[slot] void QMediaPlayer::setMedia(const QMediaContent &media, QIODevice *stream = Q_NULLPTR) |
[slot] void QMediaPlayer::setNetworkConfigurations(const QList<QNetworkConfiguration> &configurations) |
[slot] void QMediaPlayer::stop() |
#------------------------------------------------- # # Project created by QtCreator 2018-06-03T19:56:58 # #------------------------------------------------- QT += core gui QT += multimedia QT += multimediawidgets greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = MediaPlayer TEMPLATE = app RC_ICONS =images/log.ico SOURCES += main.cpp\ widget.cpp HEADERS += widget.h FORMS += widget.ui RESOURCES += \ images/images.qrc |
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QMediaPlayer> #include <QMediaPlaylist> #include <QVideoWidget> #include <QFileDialog> #include <QListWidgetItem> #include <QFile> #include <QDesktopWidget> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); QMediaPlayer *player; QVideoWidget *videoWidget; int PlayTime; void SetStyle(const QString &qssFile); private slots: void on_pushButton_AddrVideoFile_clicked(); void on_listWidget_itemDoubleClicked(QListWidgetItem *item); void on_pushButton_start_clicked(); void on_horizontalSlider_value_sliderMoved(int position); void on_pushButton_mute_clicked(); void on_pushButton_pause_clicked(); void on_comboBox_speed_activated(const QString &arg1); void on_pushButton_up_clicked(); void on_pushButton_down_clicked(); void player_location(qint64 value); void player_Time(qint64 value); private: Ui::Widget *ui; }; #endif // WIDGET_H |
#include "widget.h" #include "ui_widget.h" /* * 设置QT界面的样式 */ void Widget::SetStyle(const QString &qssFile) { QFile file(qssFile); if (file.open(QFile::ReadOnly)) { QString qss = QLatin1String(file.readAll()); qApp->setStyleSheet(qss); QString PaletteColor = qss.mid(20,7); qApp->setPalette(QPalette(QColor(PaletteColor))); file.close(); } else { qApp->setStyleSheet(""); } } Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); this->setWindowTitle("视频播放器"); this->SetStyle(":/qss/blue.css"); //设置样式表 this->setWindowIcon(QIcon(":/log.ico")); //设置图标 /*多媒体类*/ player = new QMediaPlayer(this); /*创建播放视频的窗口*/ videoWidget = new QVideoWidget(this); videoWidget->setWindowTitle("视频播放器"); QHBoxLayout *layout = new QHBoxLayout; videoWidget->setLayout(layout); ui->horizontalLayout->insertWidget(0,videoWidget); /*设置窗口的位置与大小*/ QDesktopWidget *pDesk = QApplication::desktop(); //设置视频窗口的大小 videoWidget->setMinimumSize(pDesk->width()/4*3,pDesk->height()/4*3); /*将播放的视频添加到窗口中*/ player->setVideoOutput(videoWidget); ui->horizontalSlider_value->setMaximum(100); //音量最大值 ui->horizontalSlider_value->setMinimum(0); //音量最小值 ui->horizontalSlider_value->setValue(50); //默认音量设置 player->setVolume(50);//默认音量设置 ui->progressBar->setValue(0); //进度条 //播放速率 ui->comboBox_speed->addItem("1.0"); ui->comboBox_speed->addItem("2.0"); ui->comboBox_speed->addItem("3.0"); ui->comboBox_speed->addItem("4.0"); connect(player, static_cast<void(QMediaPlayer::*)(QMediaPlayer::Error)>(&QMediaPlayer::error), [=](QMediaPlayer::Error error) { if(QMediaPlayer::NoError==error) { ui->lineEdit_errorinfo->setText("正常解码!"); } else if(QMediaPlayer::ResourceError==error) { ui->lineEdit_errorinfo->setText("媒体资源无法解析。"); } else if(QMediaPlayer::FormatError==error) { ui->lineEdit_errorinfo->setText("不支持该媒体资源的格式,没有解码器!"); } else if(QMediaPlayer::NetworkError==error) { ui->lineEdit_errorinfo->setText("发生网络错误。"); } else if(QMediaPlayer::AccessDeniedError==error) { ui->lineEdit_errorinfo->setText("没有适当的权限来播放媒体资源。"); } else if(QMediaPlayer::ServiceMissingError==error) { ui->lineEdit_errorinfo->setText("没有找到有效的播放服务,播放无法继续。"); } }); //添加播放进度的信号 connect(player, SIGNAL(positionChanged(qint64)),this, SLOT(player_location(qint64))); //添加获取播放总时间的信号 connect(player, SIGNAL(durationChanged(qint64)),this, SLOT(player_Time(qint64))); } Widget::~Widget() { delete ui; } //添加视频文件 void Widget::on_pushButton_AddrVideoFile_clicked() { QStringList filenamelist=QFileDialog::getOpenFileNames(this,"选择添加的文件","E:/",tr("*.*")); if(filenamelist.count()>0) ui->listWidget->addItems(filenamelist); //添加到列表 } //双击选中了一个文件 void Widget::on_listWidget_itemDoubleClicked(QListWidgetItem *item) { player->setMedia(QUrl::fromLocalFile(item->text())); player->play(); } //开始播放 void Widget::on_pushButton_start_clicked() { //判断是否选中条目 if(ui->listWidget->currentRow()!=-1) { if(player->state()==QMediaPlayer::PausedState) //暂停播放状态 { ui->lineEdit_errorinfo->setText(""); player->play(); } else { ui->lineEdit_errorinfo->setText(""); //获取当前选中的视频进行播放 player->setMedia(QUrl::fromLocalFile(ui->listWidget->currentItem()->text())); player->play(); } } } //音量的值 void Widget::on_horizontalSlider_value_sliderMoved(int position) { player->setVolume(position);//默认音量设置 } //静音设置 void Widget::on_pushButton_mute_clicked() { if(player->isMuted()) { player->setMuted(false); //取消静音 } else { player->setMuted(true); //静音 } } //暂停 void Widget::on_pushButton_pause_clicked() { player->pause(); //暂停 } //播放速率 void Widget::on_comboBox_speed_activated(const QString &arg1) { player->setPlaybackRate(arg1.toFloat()); } //上一行 void Widget::on_pushButton_up_clicked() { int cnt=ui->listWidget->currentRow(); if(cnt!=-1) //选中了行 { if(cnt==0) { ui->listWidget->setCurrentRow(0); } else { cnt--; ui->listWidget->setCurrentRow(cnt); } ui->lineEdit_errorinfo->setText(""); //获取当前选中的视频进行播放 player->setMedia(QUrl::fromLocalFile(ui->listWidget->currentItem()->text())); player->play(); } } //下一行 void Widget::on_pushButton_down_clicked() { int cnt=ui->listWidget->currentRow(); if(cnt!=-1) //选中了行 { cnt++; if(cnt>=ui->listWidget->count())ui->listWidget->setCurrentRow(ui->listWidget->count()-1); else ui->listWidget->setCurrentRow(cnt); ui->lineEdit_errorinfo->setText(""); //获取当前选中的视频进行播放 player->setMedia(QUrl::fromLocalFile(ui->listWidget->currentItem()->text())); player->play(); } } //播放进度 void Widget::player_location(qint64 value) { ui->progressBar->setValue(value); ui->label_Time->set |