Qt第十六章 多媒体Multimedia

server/2024/9/25 0:54:43/

文章目录

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

多媒体

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/server/106223.html

相关文章

Clickhouse集群化(一)k8s集群搭建

环境准备&#xff1a; vm 17 pro 有些功能必须pro版本才会提供&#xff08;https://download.csdn.net/download/weixin_40663313/89677277?spm1001.2014.3001.5501&#xff09;夸克下载链接 centos 7.9 docker&#xff1a;1.26 k8s&#xff1a;1.21.14 1. 创建虚拟机 …

java后端请求与响应总结

get 请求&#xff1a;将参数写在请求路径中&#xff08;请求路径跟一个&#xff1f;后面跟参数多个参数之间用&连接&#xff09; post 请求&#xff1a;将参数写在请求体中中 一、请求 1.简单参数 如 传一个或两个字符串、整数等 例如串一个用户名和密码 如果传入的数…

【Linux】实现三个迷你小程序(倒计时,旋转指针,进度条)

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:Linux ⚙️操作环境:Xshell (操作系统:CentOS 7.9 64位) 目录 &#x1f4cc;倒计时小程序 &#x1f38f;项目效果展示 &#x1f38f;项目实现思路 &#x1f38f;项目完整代码 &#x1f4cc;旋转指针小程序 &#x…

如何使用ssm实现校园美食交流系统+vue

TOC ssm026校园美食交流系统vue 第1章 概述 1.1 研究背景 随着现代网络技术发展&#xff0c;对于校园美食交流系统现在正处于网络发展的阶段&#xff0c;所以对它的要求也是比较严格的&#xff0c;要从这个系统的功能和用户实际需求来进行对系统制定开发的发展方式&#xf…

设计模式24-命令模式

设计模式24-命令模式 写在前面行为变化模式 命令模式的动机定义与结构定义结构 C 代码推导优缺点应用场景总结补充函数对象&#xff08;Functors&#xff09;定义具体例子示例&#xff1a;使用函数对象进行自定义排序代码说明输出结果具体应用 优缺点应用场景 命令模式&#xf…

PCB中焊盘的注意事项

这种不要在焊盘边上打过孔&#xff0c;不然焊盘损坏修都没法修&#xff1a; 把连接焊盘的飞线拉远点&#xff0c;再打过孔&#xff1a;

Android Studio(3) 使用 Kotlin DSL和 Gradle 8.7 打包远程库到 AAR 的自定义方法

背景介绍 在 Gradle 7.3 及更早版本中,通常使用 com.kezong.fat-aar 插件来打包远程库到 AAR 中,随着 Gradle 的不断升级,尤其是到 8.7 版本后,Kotlin DSL开发逐渐成为主流,fat-aar 社区没有更新,插件的兼容性问题逐渐显现。我探索一种新的自定义方法,能够在 Kotlin DS…

【以太坊基础】以太坊的基本概念与工作原理

以太坊基础 以太坊的基本概念与工作原理 引言 以太坊&#xff08;Ethereum&#xff09;是继比特币之后&#xff0c;最受关注的区块链平台。它不仅仅是一种加密货币&#xff0c;而是一个支持去中心化应用&#xff08;dApps&#xff09;和智能合约的平台。本文将深入探讨以太坊…