QT5.14.2 码上热浪,用Qt5狂暴轰入多媒体狂潮


在这个视觉化、移动化的时代,多媒体应用无疑成为了现代计算机程序的香饽饽。无论是摄像头录像、视频播放器,还是音频可视化、GIF动画浏览,都让用户体验达到了前所未有的层次。而要想在这片热土上百战百胜,我们的祭旗就是Qt5这一跨平台框架了!


相比其他多媒体开发方案,Qt5最大的独门绝学就在于其强大的跨平台能力。不管是Windows、macOS、Linux、Android还是iOS,Qt5都可以像交好朋友那样亲密无间地与之相处,毫无隔阂。这就意味着,我们只需要一份代码,就能覆盖所有主流平台,大大降低了开发和维护成本。对于时间就是金钱的程序员们来说,这简直就是最智能的选择!


除了跨平台,Qt5同样在多媒体支持方面展现出了非凡的实力。凭借其成熟的多媒体模块,我们能轻松地调用系统多媒体框架,进行音视频数据的采集、编解码、渲染等一系列操作。这一切在Qt5的加持下,变得如此简单优雅,让我们彻底告别了那些底层API繁琐费力的噩梦。


接下来,就让我们踏上探索的征程,去领略Qt5多媒体开发的前所未有的魅力吧!无论是富有动感的音视频播放器、时尚的相册浏览应用,还是炫酷的GIF动画欣赏程序,在Qt5的加持下,这一切ኗ氪都将不在话下!来吧,和我一同用代码热力开垦这片神奇的多媒体处女地,让梦想在指尖百花齐放!


一、视觉之王 - 用Qt5打造绚丽视频播放器

对于大多数用户来说,视频播放器是体验多媒体应用的最直接入口。那么,接下来我们就一起学习如何用Qt5打造一款时尚大气的视频播放器吧!


// 在.pro文件中添加模块
QT += multimedia multimediawidgets// 创建播放器
QVideoWidget *videoWidget = new QVideoWidget;
QMediaPlayer *player = new QMediaPlayer(this);
player->setVideoOutput(videoWidget);// 打开文件
player->setSource(QUrl::fromLocalFile(":/videos/movie.mp4"));// 播放控制
videoWidget->show();
player->play();// 连接信号槽
connect(player, &QMediaPlayer::positionChanged, this, &VideoPlayer::updateSlider);
connect(player, &QMediaPlayer::durationChanged, this, &VideoPlayer::setSliderRange);// 声音控制  
QAudioOutput *audioOutput = new QAudioOutput;
player->setAudioOutput(audioOutput);
audioOutput->setVolume(50); // 0 - 100// 视频调节
player->setPlaybackRate(1.5); // 加速1.5倍
player->videoOutput()->setBrightness(0.5); // -1 to 1
player->videoOutput()->setContrast(1.2);   // 0 to 4// 流媒体支持 
QMediaPlayer *streamPlayer = new QMediaPlayer;
streamPlayer->setMedia(QUrl("http://example.com/movie.mp4"));
streamPlayer->play();

首先我们需要在项目文件中包含Qt多媒体(multimedia)和多媒体窗口(multimediawidgets)两个模块。

然后创建QMediaPlayer和QVideoWidget对象并关联,就可以播放本地视频文件了。我们可以非常方便地控制播放进度,比如连接positionChanged信号更新进度条,或者直接设置播放位置。

声音控制通过创建QAudioOutput对象和设置音量大小即可轻松实现。视频的亮度、对比度等参数也可以根据需求随时自定义调节,让视频质量恰到好处。

最后还展示了如何播放在线视频流的代码,只需将QMediaPlayer的源设为一个流媒体地址即可,就能在应用中无缝衔接在线视频资源。

相比桌面程序,在移动设备上观看视频也是一种非常常见的使用场景。好在Qt5本身就着力于跨平台支持,所以我们完全可以将桌面视频播放器后端的代码复用到手机端的UI上,通过借助QML等技术,为用户打造出与手机系统原生视频应用体验几乎无异的播放器。


二、欣赏者 - 用Qt5打造出色的图片浏览器


除了视频播放,图片浏览也是多媒体应用中非常基础且重要的一部分。通过Qt5强大的图形界面功能和资源管理工具,我们同样可以轻松开发出专业级的图片浏览应用。

// 加载图片资源
QImage image(":/images/picture.jpg");// 显示图片 
QLabel *imageLabel = new QLabel;
imageLabel->setPixmap(QPixmap::fromImage(image));// 平移、缩放、旋转等
QTransform transform; 
transform.translate(50, 50);   
transform.rotate(30);
transform.scale(0.8, 0.8);QImage transformedImage = image.transformed(transform, Qt::SmoothTransformation);// 动画过渡 
QMovie *movie = new QMovie(":/images/animation.gif"); 
QLabel *movieLabel = new QLabel;  
movieLabel->setMovie(movie);
movie->start();// 图像特效
QGraphicsColorizeEffect *effect = new QGraphicsColorizeEffect;  
effect->setColor(Qt::green);   
effect->setStrength(0.8);
imageLabel->setGraphicsEffect(effect);// 调色板支持
QPalette palette = imageLabel->palette();
palette.setBrush(QPalette::Window, QBrush(image));
imageLabel->setPalette(palette);

最基本的是使用QImage或QPixmap加载并显示图像文件。如果需要对图像进行姿态变换,例如平移、旋转、缩放等,我们可以创建一个QTransform对象,设置变换参数,再将QImage对象转换过来即可。

Qt5开发图片浏览器的其他技术细节:

// 图像IO插件
QImageReader reader(":/images/picture.jpg");
QImageWriter writer(":/images/output.png"); 
reader.setAutoTransform(true); // 自动旋转
writer.setText("Description", "Output from Qt");// 图像格式转换
QImage convertedImage = image.convertToFormat(QImage::Format_RGBX8888);
convertedImage.save(":/images/output.bmp", "BMP");// 图像打印支持
QPrinter printer(QPrinter::HighResolution);  
QPrintDialog dialog(&printer, this);  
if (dialog.exec() == QDialog::Accepted) {QPainter painter(&printer);QRect rect = painter.viewport();QSize size = image.size();size.scale(rect.size(), Qt::KeepAspectRatio);painter.setViewport(rect.x(), rect.y(), size.width(), size.height());painter.setWindow(image.rect());painter.drawImage(0, 0, image);
}// 摄像头支持
QCameraViewfinder *viewfinder = new QCameraViewfinder;
QCameraInfo cameraInfo = QCameraInfo::defaultCamera();
QCamera *camera = new QCamera(cameraInfo);
camera->setViewfinder(viewfinder);
viewfinder->show();
camera->start(); // 获取摄像头图像数据

Qt5提供了强大的图像IO插件系统,支持读写多种常见格式,并且可以在加载图像时自动旋转方向。我们也可以方便地转换图像格式,或者将已有图像保存为不同的文件格式。

打印图像同样没有什么困难,Qt5已经为我们封装好了QPrinter和QPrintDialog类。我们只需新建一个QPrinter实例,调用QPrintDialog进行必要的设置,接下来就可以在打印上下文中使用QPainter将图像绘制出来了。

最后还展示了如何通过Qt5调用系统摄像头获取图像数据的代码。QCameraInfo类可以枚举系统摄像头,QCamera负责控制采集,而QCameraViewfinder则将摄像头捕获到的原始图像数据呈现到UI界面上。


三、纷光夺目 - 用Qt5打造动感音频可视化


要创建出全方位的多媒体体验,音频支持是少不了的。而Qt5也在这一领域为我们提供了强有力的支持,让我们可以在程序中灵活处理音频数据,还能基于此打造出视觉华丽、体验炫酷的音频可视化效果。

// 播放音频文件
QMediaPlayer *player = new QMediaPlayer; 
QAudioOutput *audioOutput = new QAudioOutput;
player->setAudioOutput(audioOutput);
player->setSource(QUrl::fromLocalFile(":/audio/music.mp3")); 
audioOutput->setVolume(50); 
player->play();// 音频波形可视化
QAudioLevel *levelMeter = new QAudioLevel(player->audioOutput());
qreal peak = levelMeter->peakValue();
QVector<qreal> brushLevels = levelMeter->brushLevels();// 音频频谱可视化 
QVideoSink *sink = player->videoSink(); 
while (sink->query(QVideoSink::SinkType) != QVideoSink::SinkType::OpenGLSink);
QOpenGLSink *glSink = static_cast<QOpenGLSink*>(sink);
glSink->enableEGLSink(true); 
QVideoFrameFormat format(QSize(1280, 720), QVideoFrameFormat::Format_BGR32);  
QAbstractVideoBuffer *buffer = glSink->startEGLSink(format);while (true) {ctx->device()->bind(); const QRectF rect(0, 0, 1280, 720);ctx->fillRect(rect, QColor::fromRgb(0, 0, 0, 255));// 绘制频谱可视化效果ctx->device()->release();ctx->swapBuffers();
}// 录制音频
QAudioInput *audioInput = new QAudioInput(QAudioDeviceInfo::defaultInputDevice());
QFile outputFile(":/recordings/recording.raw");
outputFile.open(QIODevice::WriteOnly | QIODevice::Truncate);QAudioFormat format;
format.setByteOrder(QAudioFormat::LittleEndian);  
format.setChannelCount(1);
format.setCodec("audio/pcm");
format.setSampleRate(8000);
format.setSampleSize(8);
format.setSampleType(QAudioFormat::UnSignedInt);QIODevice *io = audioInput->start(&format);
qint64 bytesWritten = 0;
while(bytesWritten < 88200) {bytesWritten += outputFile.write(io->readAll());  
}audioInput->stop();
outputFile.close();

首先是如何播放音频文件的基本代码,我们创建了QMediaPlayer、QAudioOutput对象并关联,然后就可以像播放视频一样播放音频文件了。

接下来是音频可视化的重头戏。Qt5为我们提供了两种可视化模式,一种是基于QAudioLevel来实现经典的音频波形可视化,我们可以获取到每个音频通道的最大波峰值和波形曲线等数据,将其绘制到UI界面上就能看到醒目的音频波形曲线。

另一种是音频频谱可视化,实现方式相对复杂一些。首先要从QMediaPlayer获取到QVideoSink对象,并启用OpenGL ES渲染支持。然后在循环渲染的过程中,我们就可以直接操作OpenGL上下文,在每一帧中更新渲染内容,从而产生动态的频谱可视化效果。具体的渲染算法由开发者自行实现。

最后是音频录制的示例代码。这里我们使用QAudioInput设备,先指定好待录制音频的格式参数,比如通道数、采样率、位深度等,然后调用start启动录制,每次从音频设备中读取数据写入输出文件,直到录制结束。也可以在录制的同时做一些音频处理操作,非常灵活方便。

通过Qt5强大的音频支持,我们不仅能在程序中使用各种音频格式文件,还可以创建出色彩纷呈的音频可视化效果和实用的音频录制工具。如此一来,就可以为多媒体应用增添更多娱乐和实用的体验了。


四、任重而道远 - 未来遥遥,多媒体力量任我们把玩


短短数千字,恐怕还难以窥探Qt5多媒体开发的全部精髓。其实除了视频播放、图像浏览、音频处理之外,Qt5的多媒体生态还包括了相机处理、实时通信、增强现实等更多精彩的领域。


1、虚实共生 - 用Qt5打造增强现实体验

增强现实(AR)正日益成为热门科技领域,而Qt5作为一个跨平台开发框架,也为AR应用的开发提供了强有力的支持。通过Qt3D和QML等模块,我们可以将真实世界和虚拟world无缝融合,创造出身临其境的AR体验。

// 使用QML描述UI界面
import QtQuick 2.7
import QtQuick.Scene3D 2.0Scene3D {// 加载真实环境图像或视频作为背景Texture2D {id: backgroundTexture// 从摄像头获取实时图像数据}// 创建虚拟3D物体并集成到真实环境中Node {Model {source: "3dmodel.obj"materials: [ DefaultMaterial {// 设置模型纹理和各项渲染参数}]}// 根据设备传感器调整物体位置和角度transform: Transformation {// 从陀螺仪等获取旋转和平移数据}}
}

上面是一段简化的QML代码示例,展示了如何在Qt中创建一个AR应用界面。我们首先通过Texture加载真实环境的背景图像或视频数据,比如从摄像头获取。

接着使用Node和Model节点创建一个3D虚拟物体,并应用合适的渲染材质。最重要的是要根据设备的陀螺仪、加速计等传感器数据,实时调整虚拟物体的变换,使其正确地集成到现实场景中。

除了QML,我们也可以使用C++配合Qt3D模块进行AR开发,从而获得更多定制化和优化的能力。Qt3D提供了全面的3D渲染支持,包括了场景管理、相机、光照、纹理、网格模型、动画等多种实用组件。

通过Qt QML、Qt3D等模块的supports等支持,我们就可以高效开发出各种创新的AR应用,给用户带来全新的沉浸式体验。


2、实时在线 - 用Qt5构建多媒体通信应用

在线实时通信无疑已成为现代生活工作中不可或缺的一部分。使用Qt5,我们可以无需过多底层编码,就构建出功能强大、质量上乘的多媒体通信应用。

// 使用STUN服务器建立P2P通道
QNearbyConnectionManager *manager = new QNeartyConnectionManager;
if (manager->startAdvertising("video.call.app")) {while(true) {QNearbyConnection *connection = manager->waitForConnection(3000);if (connection) {// 建立点对点连接break;}}
}// 通过WebRTC协议传输多媒体数据
QWebEngineView *remoteView = new QWebEngineView(this);
QWebChannel *channel = new QWebChannel(this);
QPeerConnectionHelper *peerHelper = new QPeerConnectionHelper(this); 
channel->registerObject(QStringLiteral("peerHelper"), peerHelper);
remoteView->page()->setWebChannel(channel);peerHelper->createOffer();
connect(peerHelper, &QPeerConnectionHelper::sendOfferDescriptionSucceeded, this, [this, peerHelper](){// 发送SDP消息peerHelper->setRemoteDescription(remoteSdp);peerHelper->gatherCandidates();
});

上面的代码分为两部分。第一部分展示了如何使用Qt的NearbyConnection模块在局域网内建立P2P连接通道。我们首先要调用startAdvertising在本地注册一个应用服务,然后等待远程客户端连入即可。


第二部分则演示了如何通过WebRTC协议在建立的连接通道中进行多媒体数据传输。首先要在网页视图中加载并注册QPeerConnectionHelper对象,用于创建和管理连接。


创建本地SDP连接描述后,我们可以通过信令服务器将其发送给远程客户端,双方交换完SDP及ICE候选描述后,就可以开始传输编码后的音视频数据流了。


值得一提的是,QPeerConnectionHelper作为WebRTC协议的高级封装,为我们屏蔽了底层复杂的信令交互和多媒体编解码等细节,极大地简化了开发流程。

五、疆场无垠 - 还有哪些多媒体大有可为?


通过以上代码示例,相信你已经初步领略到了Qt5在多媒体开发领域的浑厚实力。事实上,除了视频播放、图像处理、音频可视化、AR集成、在线通信等,Qt5的多媒体能力远不止于此。

比如在数字电视领域,Qt5可以帮助我们构建高品质的机顶盒软件,实现高清电视信号的解码和播放。又比如在游戏开发领域,Qt5也能发挥独特优势,让我们创建出精美的2D或3D游戏画面,并实现丝滑高效的游戏音频处理。

此外,Qt5的多媒体能力还可以广泛运用于机器视觉、视频会议、无人机航拍、虚拟现实等更多热门领域。总之,只要你有足够的想象力,就一定能在Qt5的支持下,开发出无数精彩绝伦的多媒体应用。

那么,你最感兴趣将Qt5的多媒体实力应用于哪些领域呢?你又有何绝妙构思要在程序中一展身手呢?欢迎在评论区留言,和我一起畅所欲言,共同描绘编程无垠的多媒体画卷!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/774101.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

了解微信小程序开发流程

前言&#xff1a;本文只适合初学者了解大致开发流程&#xff0c;好让后续学习胸有成竹&#xff0c;有条不紊 1、开发准备 ① 在微信公众平台 (qq.com)完成微信小程序账号注册 ②下载安装微信小程序开发者工具 2、创建项目 新建 新建时需要的appid&#xff0c;在微信公众平…

Python学习:函数

函数定义 在Python中&#xff0c;函数&#xff08;Function&#xff09;是一组用于完成特定任务或计算的语句块。定义函数可以让我们将一段代码重用多次&#xff0c;提高代码的可读性和可维护性。以下是定义函数的基本语法和结构&#xff1a; def function_name(parameters):&…

运动规划_碰撞检测算法之分离轴定理

运动规划:碰撞检测算法之分离轴定理 附赠自动驾驶全套学习资料和量产经验&#xff1a;链接 如上文所述&#xff0c;基于包围形的方法是一种粗略的碰撞检测方法&#xff0c;基于外接圆形的方法运算速度很快&#xff0c;但精度很差&#xff1b;基于轴对齐包围矩形&#xff08;AA…

0.96寸OLED屏调试 ----(二)

所需设备&#xff1a; 1、USB 转 SPI I2C 适配器&#xff1b;内附链接 2、0.96寸OLED显示模块&#xff1b; 备注&#xff1a;专业版、升级版都适用&#xff1b; 读写控制 SSD1306通过 D/C# 和 R/W# 两位来确定&#xff1a;读/写数据&#xff0c;写命令和读状态四种通信行为。…

从凑零钱问题理解动态规划

给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以认为每种硬币的数量是无限的。 示例…

【论文笔记】RobotGPT: Robot Manipulation Learning From ChatGPT

【论文笔记】RobotGPT: Robot Manipulation Learning From ChatGPT 文章目录 【论文笔记】RobotGPT: Robot Manipulation Learning From ChatGPTAbstractI. INTRODUCTIONII. RELATED WORK1. LLMs for Robotics2. Robot Learning III. METHODOLOGY1. ChatGPT Prompts for Robot …

【MySQL】9. 内置函数

函数 1. 日期函数 获得年月日&#xff1a; mysql> select current_date(); ---------------- | current_date() | ---------------- | 2024-03-23 | ---------------- 1 row in set (0.00 sec)获得时分秒&#xff1a; mysql> select current_time(); ------------…

vue3+Pinia的使用 - 封装

目录&#xff1a; persist.ts 可存储到本地 import { PersistedStateOptions } from "pinia-plugin-persistedstate";/*** description pinia 持久化参数配置* param {String} key 存储到持久化的 name* param {Array} paths 需要持久化的 state name* return per…

测试缺陷定位的基本方法

前后端bug特征 后端&#xff1a; 业务逻辑问题&#xff1a;如任务状态未扭转成功&#xff0c;创建任务失败等数据类问题&#xff1a;如新增的任务在页面没有展示出来等性能类问题&#xff1a;提交任务一直显示创建中、批量操作等待耗时长超时等 前端&#xff1a; 页面显示类…

基于人类反馈的强化学习:最核心的5个步骤

基于人类反馈的强化学习&#xff08; Reinforcement Learning with Human Feedback&#xff09;工作原理 强化学习正在彻底改变技术和商业世界中复杂问题的处理方式。这是一种强大的工具。通过该工具&#xff0c;机器能够从环境中学习并根据奖惩做出明智的决策。 但是&#x…

约克中央空调YES-will系列,舒适冷暖与高品质家居的优选

漫漫寒冬,室内一片寒意,开启空调多久才能享受到暖意?如果冬季气温较低,空调能否保持正常的制热运行? 炎炎夏季,即便在室内也同样是“暴汗”不断,身上黏糊糊,什么样的家用中央空调才能快速制冷,让全家人感受到舒适,同时又能避免传统空调直吹带来的一系列问题? 遇上梅雨季节…

面试题 之 webpack

1.说说你对webpack理解&#xff1f;解决什么问题&#xff1f; Webpack 是实现前端项目的模块化&#xff0c;用于现代 JavaScript 应用程序的静态模块打包工具&#xff0c;被webpack 直接引用的资源打包进 bunde.js的资源&#xff0c;当webpack 处理应用程序时,它会在内部构建一…

SpringBoot-注解:@Async 使用

不同类中使用Async 线程配置初始化类-ThreadPoolConfig package com.zzdy.recharge.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableA…

迁移android studio 模拟器位置

android studio 初始位置是安装在c盘&#xff0c;若是要迁移需 1创建一个目标位置如我的F:/avd 2在系统环境变量里面设置新的地址 变量名&#xff1a;ANDROID_SDK_HOME 变量值&#xff1a;F:/avd 3最重要的是文件复制&#xff0c;将C盘里面avd的上层目录.android的目录整体…

【哈希专题】【蓝桥杯备考训练】:星空之夜、模拟散列表、字符串哈希、四平方和、扫雷【已更新完成】

目录 1、星空之夜&#xff08;usaco training 5.1&#xff09; 2、模拟散列表&#xff08;模板&#xff09; 3、字符串哈希&#xff08;模板&#xff09; 4、四平方和&#xff08;第七届蓝桥杯省赛C A组/B组 & JAVA B组/C组&#xff09; 5、扫雷&#xff08;Google Ki…

2024室内设计和建筑必须知道的十大3D渲染趋势!

2023年对建筑圈是非常不平凡的一年&#xff0c;高清视频渲染、元宇宙全覆盖、AI模型大爆发.....不断发展的 3D 数字技术世界正迅速重塑建筑设计行业。 2024年&#xff0c;室内设计和建筑设计领域在3D渲染方面又将迎来怎样的变革&#xff1f;以下十大3D渲染趋势&#xff0c;你不…

python dict 序列化

python dict 序列化 在Python中&#xff0c;可以使用json模块来序列化&#xff08;转换为JSON格式的字符串&#xff09;和反序列化&#xff08;将JSON格式的字符串转换回字典&#xff09;一个字典。 序列化&#xff1a; import json # 假设有一个字典 data { name: J…

五、Elasticsearch 集成

目录 5.1 Spring Data 框架集成5.1.1 Spring Data 框架介绍5.1.2 Spring Data Elasticsearch 介绍5.1.3 Spring Data Elasticsearch 版本对比5.1.4 集成步骤 5.1 Spring Data 框架集成 5.1.1 Spring Data 框架介绍 Spring Data 是一个用于简化数据库开发的开源框架。其主要目…

❤️算法笔记❤️-(每日一刷-26、删除有序数组的重复项)

文章目录 题目思路解法 题目 给你一个 非严格递增排列 的数组 nums &#xff0c;请你** 原地** 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯…

【python】(07)理解Python中函数的参数类型

系列文章回顾 【python】(01)初识装饰器Decorator 【python】(02)初识迭代器Iterator 【python】(03)初识生成器Generator 【python】(04)python中实现多任务并发和并行的区别 【python】(05)如何使用python中的logging模块记录日志信息 【python】(06)理解Python中的 lambda 、…