当前位置: 首页 > news >正文

Qt第十六章 多媒体Multimedia

文章目录

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

多媒体

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;
}

与视频处理相关的类

支持的媒体格式

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • fscan下载和使用
  • 预训练语言模型PLM(课程笔记)
  • 数据结构:栈、队列详解篇
  • 找到sql里面参数字段占位符的位置,方便对字段进行加密存储
  • “软件定义汽车”下的软件虚拟化技术
  • Unity常用插件记录
  • MATLAB算法实战应用案例精讲-【人工智能】暗数据(概念篇)
  • 添加数据判断是否存在存在不添加,或存在更新
  • 【网络编程】第十章 网络层-IP(分片组装+网段+路由+NAT)
  • Linux rocky 9.2 安装mysql-8.0.39-linux-glibc2.28-x86_64.tar.xz
  • 引领未来的NVR方案:海思3520D芯片与全套NVR模组源代码解析
  • 搭建springboot项目,并解决项目出现红色J问题
  • 网络之DHCP实验
  • simulink 回放can数据,离线仿真,用来验证算法,应该怎么回读mat格式文件(重要)
  • 拍立淘API在商品搜索中的应用实践案例
  • @angular/forms 源码解析之双向绑定
  • Babel配置的不完全指南
  • CentOS 7 防火墙操作
  • ES6简单总结(搭配简单的讲解和小案例)
  • HTTP中GET与POST的区别 99%的错误认识
  • PHP变量
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 小而合理的前端理论:rscss和rsjs
  • 一些关于Rust在2019年的思考
  • ​iOS实时查看App运行日志
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • #1014 : Trie树
  • #pragma data_seg 共享数据区(转)
  • #每天一道面试题# 什么是MySQL的回表查询
  • (31)对象的克隆
  • (windows2012共享文件夹和防火墙设置
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (十三)Flask之特殊装饰器详解
  • (算法)硬币问题
  • (转)【Hibernate总结系列】使用举例
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .Net多线程总结
  • .NET简谈设计模式之(单件模式)
  • .net下的富文本编辑器FCKeditor的配置方法
  • @RequestBody详解:用于获取请求体中的Json格式参数
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798
  • [.net] 如何在mail的加入正文显示图片
  • [20150904]exp slow.txt
  • [20160902]rm -rf的惨案.txt
  • [20170705]lsnrctl status LISTENER_SCAN1
  • [Android]通过PhoneLookup读取所有电话号码
  • [APIO2012] 派遣 dispatching
  • [BZOJ 3282] Tree 【LCT】
  • [bzoj 3534][Sdoi2014] 重建
  • [C++] sqlite3_get_table 的使用
  • [Day 63] 區塊鏈與人工智能的聯動應用:理論、技術與實踐