Qt第十六章 多媒体Multimedia

embedded/2024/10/18 7:54:38/

文章目录

  • 多媒体
  • 音频
    • 播放音频
    • 录制音频
    • 低延迟音效
    • 低级音频播放和录制
    • 推送和拉取
    • 解码压缩音频到内存
    • 与音频处理相关的类
  • 视频
    • 播放视频
    • 处理低级视频帧
    • 录制视频
    • 与视频处理相关的类
  • 支持的媒体格式

多媒体

cmakelist 添加Multimedia模块

设备信息查询

#include <QAudioDevice>
#include <QCameraDevice>
#include <QCameraFormat>
#include <QMediaDevices>void showDevs()
{QList<QAudioDevice> inAudios = QMediaDevices::audioInputs(); // 获取音频输入设备列表QList<QAudioDevice> outAudios = QMediaDevices::audioOutputs(); // 输出设备QList<QCameraDevice> cameras = QMediaDevices::videoInputs(); // 获取视频输入设备for (auto& ia : inAudios) {qInfo() << "设备名称:" << ia.description(); // 设备描述qInfo() << "设备Id:" << ia.id();qInfo() << "最大声道数:" << ia.maximumChannelCount(); // 最大声道数qInfo() << "最大采样率:" << ia.maximumSampleRate(); // 最大采样率QAudioFormat fmt = ia.preferredFormat();qInfo() << "=====默认设备参数====";qInfo() << "声道数" << fmt.channelCount();qInfo() << "声道配置" << fmt.channelConfig();qInfo() << "采样率" << fmt.sampleRate();qInfo() << "采样格式" << fmt.sampleFormat();}for (auto& ia : outAudios) {qInfo() << "设备名称:" << ia.description(); // 设备描述qInfo() << "设备Id:" << ia.id();qInfo() << "最大声道数:" << ia.maximumChannelCount(); // 最大声道数qInfo() << "最大采样率:" << ia.maximumSampleRate(); // 最大采样率QAudioFormat fmt = ia.preferredFormat();qInfo() << "=====默认设备参数====";qInfo() << "声道数" << fmt.channelCount();qInfo() << "声道配置" << fmt.channelConfig();qInfo() << "采样率" << fmt.sampleRate();qInfo() << "采样格式" << fmt.sampleFormat();}for (auto& cd : cameras) {qInfo() << "设备名称:" << cd.description(); // 设备描述qInfo() << "设备Id:" << cd.id();qInfo() << "设备方位" << cd.position();QList<QCameraFormat> fmt = cd.videoFormats();for (auto& f : fmt) {qInfo() << "最大帧率" << f.maxFrameRate();qInfo() << "最小帧率" << f.minFrameRate();qInfo() << "像素格式" << f.pixelFormat();}}
}

音频

cmakelist 添加MultimediaWidgets模块

播放音频

播放mp3、aac等非原始格式音频

void playAudio()
{QMediaPlayer* player = new QMediaPlayer;player->setSource(QUrl::fromLocalFile("E:/KwDownload/song/陈占美-恰似你的温柔.mp3"));QAudioOutput* adOut = new QAudioOutput;adOut->setVolume(0.8); // 设置音量,0到1之间player->setAudioOutput(adOut);player->play();
}

播放原始音频pcm格式

void playAudio2()
{QFile file("G:/qtproject/multiMedia/audio.pcm");file.open(QFile::ReadOnly);QAudioDevice dev = QMediaDevices::defaultAudioOutput();QAudioFormat fmt = dev.preferredFormat();QAudioSink* sink = new QAudioSink(dev, fmt);QIODevice* iodev = sink->start();while (true) {if (sink->bytesFree() > 85535)iodev->write(file.read(80000));}sink->start(iodev);
}

录制音频

存储位置只能是本地文件系统位置,存储格式也是固定的

void Widget::recordAudio()
{cs = new QMediaCaptureSession;// 输入设备audIn = new QAudioInput;audIn->setVolume(0.8);// 录制器recorder = new QMediaRecorder;cs->setAudioInput(audIn);cs->setRecorder(recorder);recorder->setQuality(QMediaRecorder::HighQuality);recorder->setOutputLocation(QUrl::fromLocalFile("C:/Users/PVer/Desktop/test")); // 设置存储路径
}void Widget::on_pushButton_clicked()
{static bool state = true;if (state) {ui->pushButton->setText("结束录制");recorder->record();} else {ui->pushButton->setText("开始录制");recorder->stop();}state = !state;
}

低延迟音效

void testSoundEffect()
{QSoundEffect* ef = new QSoundEffect(QMediaDevices::defaultAudioOutput());ef->setSource(QUrl::fromLocalFile("../../currency.wav")); // 设置文件路径ef->setVolume(1);ef->setLoopCount(2);ef->play();
}

低级音频播放和录制

void recordAudio()
{QAudioFormat fmt;fmt.setChannelCount(2);fmt.setSampleFormat(QAudioFormat::Float);fmt.setSampleRate(44100);if (!QMediaDevices::defaultAudioInput().isFormatSupported(fmt)) {qCritical() << "不支持该格式";return;}QAudioSource* as = new QAudioSource(QMediaDevices::defaultAudioInput(), fmt);QFile* file = new QFile("../../test.pcm");if (!file->open(QFile::ReadWrite)) {qCritical() << "文件打开失败";return;}as->start(file);// 设置定时结束录制,否则原始音频太大QTimer::singleShot(3000, [=] { as->stop(); });
}

推送和拉取

通过QAudiSink类从QIODevice中拉去数据
相反数据可以写入QIODevice

解码压缩音频到内存

与音频处理相关的类

视频

播放视频

void playVideo()
{QMediaPlayer* player = new QMediaPlayer;player->setSource(QUrl::fromLocalFile("../../黑神话.mp4"));// 设置画面输出设备QVideoWidget* vw = new QVideoWidget;player->setVideoOutput(vw);vw->show();// 设置声音输出设备QAudioOutput* audio = new QAudioOutput;player->setAudioOutput(audio);// 开始播放player->play();
}

处理低级视频帧

录制视频

void Widget::recordVideo()
{cs2 = new QMediaCaptureSession;recorder2 = new QMediaRecorder;camera = new QCamera(QMediaDevices::defaultVideoInput());if (!camera->isAvailable()) {qInfo() << "没有可用摄像头";return;}QVideoWidget* vw = new QVideoWidget;cs2->setAudioInput(audIn);cs2->setRecorder(recorder2);cs2->setVideoOutput(vw);recorder2->setQuality(QMediaRecorder::HighQuality);recorder2->setOutputLocation(QUrl::fromLocalFile("C:/Users/PVer/Desktop/vediotest"));vw->show(); // 显示视频窗口camera->setActive(true); // 激活相机
}
//按钮的信号与槽连接
void Widget::on_pushButton_2_clicked()
{static bool state = true;if (state) {ui->pushButton_2->setText("结束录制");recorder2->record();} else {ui->pushButton_2->setText("开始录制");recorder2->stop();}state = !state;
}

与视频处理相关的类

支持的媒体格式


http://www.ppmy.cn/embedded/100912.html

相关文章

ELK

ELK elk介绍前期准备1、修改主机名2、配置/ect/hosts3、检查防火墙selinux是否关闭4、时钟同步 elasticsearch部署介绍1、安装JAVA包2、解压安装包&#xff0c;修改配置文件 elasticsearch集群部署elaticsearch基础API操作1、RestFul API 格式2、查看节点信息3、查看索引信息和…

【Material-UI】深入了解Radio Group中的useRadioGroup Hook

文章目录 一、什么是useRadioGroup&#xff1f;1.1 Hook的返回值 二、useRadioGroup的基本用法2.1 代码示例2.2 代码解析 三、useRadioGroup的应用场景3.1 动态样式调整3.2 高级交互逻辑 四、使用useRadioGroup的最佳实践4.1 保持代码简洁4.2 结合主题定制4.3 注意无障碍设计 五…

【Pyhthon读取 PDF文件表格 ,转为 CSV/TSV/JSON文件】

tabula-py tabula-py 是一个将 PDF 表格转换为 pandas DataFrame 的工具。 tabula-py 是 tabula-java 的包装器&#xff0c;需要您的机器上有 java。 tabula-py 还允许您将 PDF 中的表格转换为 CSV/TSV 文件。 tabula-py 的 PDF 提取准确度与 tabula-java 或 tabula app 相…

(十五)Flink 内存管理机制

在大数据领域,很多开源框架(Hadoop、Spark、Storm)都是基于 JVM 运行,但是 JVM 的内存管理机制往往存在着诸多类似 OutOfMemoryError 的问题,主要是因为创建大量的实例,超过 JVM 的最大堆内存限制,没有被有效的回收。这在很大程度上影响了系统的稳定性,因此很多框架都实…

学习大数据DAY43 Sqoop 安装,配置环境和使用

目录 sqoop 安装 配置 mysql sqoop 安装 sqoop 指令集 sqoop 使用 sqoop 创建 hive 表 sqoop 全量导入表 sqoop 增量导入表 sqoop 全量导出表 sqoop 分区表导入表 sqoop 分区表导出表 上机练习 sqoop 安装 配置 mysql create database test DEFAULT CHARACTER S…

深度学习学习经验——长短期记忆网络(LSTM)

长短期记忆网络&#xff08;LSTM&#xff09; 长短期记忆网络&#xff08;LSTM&#xff0c;Long Short-Term Memory&#xff09;是一种特殊的循环神经网络&#xff08;RNN&#xff09;&#xff0c;专为解决 RNN 中长期依赖问题而设计。LSTM 引入了三个门和一个细胞状态&#x…

Linux云计算 |【第二阶段】SECURITY-DAY3

主要内容&#xff1a; Prometheus监控服务器、Prometheus被监控端、Grafana监控可视化 补充&#xff1a;Zabbix监控软件不自带LNMP和DB数据库&#xff0c;需要自行手动安装配置&#xff1b;Prometheus监控软件自带WEB页面和DB数据库&#xff1b;Prometheus数据库为时序数据库&…

机器人走路问题优化解法

public class Test53 {//假设有N个位置&#xff0c;记为1-N&#xff0c;N大于或等于2//开始机器人在M位置上&#xff08;M为1-N中的一个&#xff09;//如果机器人来到1位置&#xff0c;那么下一步只能向右来到2位置//如果机器人来到N位置&#xff0c;那么下一步只能向左来到N-1…