Qt6 播放音视频

server/2024/9/25 10:32:50/

一、概述

QT6相较于Qt5引入了许多新特性和改进,包括对音视频开发的增强支持。

  1. QT6中的音视频支持
    QT6提供了一套完整的音视频处理功能,这些功能被整合在QtAV项目中。QtAV是一个基于Qt的音视频处理框架,用于处理音视频播放、录制、编解码、处理等任务。QT6对QtAV进行了进一步的集成和优化,使得开发音视频应用更为方便。
  2. 音视频编解码
    QT6提供了对多种音视频编解码格式(如H.264, H.265, AAC等)的支持。这意味着开发者可以在不进行复杂的编解码配置的情况下,轻松实现音视频的编解码功能。
  3. 音视频播放和录制
    QT6支持音视频的播放和录制功能。开发者可以使用QT6提供的API实现各种音视频播放器和录制器,例如本地播放器、网络流媒体播放器和视频会议录制器等。
  4. 音视频处理
    QT6还提供了音视频处理功能,如滤镜、效果、转码等。开发者可以通过这些功能实现音视频的个性化处理,例如添加水印、调整亮度、对比度等。
  5. 跨平台支持
    QT6是一个跨平台框架,这意味着开发者可以在Windows、macOS、Linux等不同操作系统上使用QT6进行音视频开发。QT6提供了对各种操作系统音视频API的封装,使得开发者可以实现跨平台音视频应用的开发

二、音频和视频数据类型

音视频开发中,了解和正确处理音频和视频数据类型是非常重要的。QT6为音视频开发提供了丰富的类和方法,可以帮助开发者方便地进行音视频数据的处理。

  1. 音频数据类型
    QT6中,音频数据类型主要包括以下几种,
  • QAudioFormat,表示音频数据的格式信息,如采样率、采样位数、通道数等。
  • QAudioInput,表示音频输入设备,可以通过该类实现音频数据的采集。
  • QAudioOutput,表示音频输出设备,可以通过该类实现音频数据的播放。
  • QMediaObject,表示媒体对象,可以包含音频、视频等多种类型的媒体数据。
  1. 视频数据类型
    QT6中,视频数据类型主要包括以下几种,
  • QVideoFrame,表示视频帧,包含视频图像的数据和格式信息。
  • QVideoEncoder,表示视频编码器,可以将视频数据进行编码压缩。
  • QVideoDecoder,表示视频解码器,可以将编码压缩的视频数据进行解码。
  • QMediaObject,表示媒体对象,可以包含音频、视频等多种类型的媒体数据。
  1. 音频视频数据处理
    在QT6中,音频和视频数据的处理主要通过以下几个步骤进行,
  2. 创建QAudioFormat对象,设置音频数据的格式信息,如采样率、采样位数、通道数等。
  3. 创建QAudioInput或QAudioOutput对象,与音频输入或输出设备进行交互。
  4. 读取或写入音频数据。对于音频输入,可以使用QAudioInput对象的read()方法读取音频数据;对于音频输出,可以使用QAudioOutput对象的write()方法写入音频数据。
  5. 对于视频数据,可以使用QVideoFrame对象来处理视频图像数据。可以通过QVideoFrame对象的像素访问函数来获取或设置视频图像的像素数据。
  6. 如果需要对音频或视频数据进行编码或解码,可以使用QVideoEncoder或QVideoDecoder对象。
    以上是关于音频和视频数据类型的基本介绍。在后续的章节中,我们将通过具体的实例来详细讲解如何在QT6中进行音视频数据的采集、处理和播放。

三、播放音频

在Qt6中,如果想播放音频,你必须在.pro文件中加上

QT += multimedia

 如果你使用的是CMake,请在find_package里加上 Multimedia;

find_package(Qt6 REQUIRED Widgets Multimedia)

 .h文件如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QMediaPlayer>
#include <QAudioOutput>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:QMediaPlayer *player = nullptr;QAudioOutput *audioOutput = nullptr;MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

.cpp文件如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);player = new QMediaPlayer(this);audioOutput = new QAudioOutput(this);player->setAudioOutput(audioOutput);//指定音频输出位置audioOutput->setVolume(0.5);  //调节音频音量player->setSource(QUrl("qrc:/audio.mp3"));player->play();
}MainWindow::~MainWindow()
{delete ui;
}

四、播放视频

播放视频的代码结构类似于播放音频,但要注意的是视频它是一个窗口!!!

因此想播放视频,你必须在.pro文件中加上

QT += multimediawidgets

 如果你使用的是CMake,请在find_package里加上 Multimedia;

find_package(Qt6 REQUIRED Widgets Multimedia MultimediaWidgets)

五、完整代码

CMakeLists:

cmake_minimum_required(VERSION 3.10)project(demo VERSION 1.0 LANGUAGES CXX)set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)find_package(Qt6 REQUIRED Widgets Multimedia MultimediaWidgets)set(PROJECT_SOURCES main.cppWidget.hWidget.cpp#res.qrc
)add_executable(${PROJECT_NAME} ${PROJECT_SOURCES})target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Widgets Qt6::Multimedia Qt6::MultimediaWidgets)

 Widget.h:

// widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QMediaPlayer>
#include <QVideoWidget>
#include <QAudioOutput>class Widget : public QWidget{Q_OBJECTpublic:Widget(QWidget* parent = nullptr);~Widget();QMediaPlayer* m_player = nullptr;QAudioOutput* m_audioOutput = nullptr;QVideoWidget* m_videoWidget = nullptr;
};#endif // WIDGET_H

Widget.cpp

// widget.cpp
#include "widget.h"
#include <QPushButton>
#include <QFileDialog>
#include <QLabel>Widget::Widget(QWidget* parent): QWidget(parent)
{this->setFixedSize(500, 300);this->setWindowFlag(Qt::WindowMaximizeButtonHint, false);m_player = new QMediaPlayer(this);m_audioOutput = new QAudioOutput(this);m_videoWidget = new QVideoWidget(this);m_videoWidget->resize(500, 260);m_player->setAudioOutput(m_audioOutput);m_player->setVideoOutput(m_videoWidget);QPushButton* btn1 = new QPushButton(this);btn1->move(200, 270);btn1->setText("play");connect(btn1, &QPushButton::clicked, [=]() {QString str = QFileDialog::getOpenFileName();m_player->setSource(QUrl(str));//m_player->setSource(QUrl("qrc:/pear_snow.mp3"));//m_player->setSource(QUrl("qrc:/output.mp4"));m_player->play();});
}Widget::~Widget()
{}

main.cpp

#include <QApplication>
#include "Widget.h"int main(int argc, char* argv[])
{QApplication app(argc, argv);       Widget w;w.show();return app.exec();
}

以上代码既能播放音频也能播放视频,相信到这已经解决你的疑惑了。

详细代码:Qt6播放音视频: Qt6播放音视频


http://www.ppmy.cn/server/48547.html

相关文章

263.丑数

丑数 就是只包含质因数 2、3 和 5 的正整数。 给你一个整数 n &#xff0c;请你判断 n 是否为 丑数 。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;n 6 输出&#xff1a;true 解释&#xff1a;6 2 3 示例 …

Linux “ 软件管理 “

软件管理 widows 安装 方法一&#xff1a; 双击exe安装包&#xff0c;就可以安装。 用exe安装的软件会破记录到注册表中。 注册会记录安装位置&#xff0c;软件名称。 方法二&#xff1a; 用绿色方式进行安装。 不用写到注册表中&#xff0c;因此无法在开始菜单里面查看和卸…

【C++】编译

三、C编译 前面给大家演示了如何从写C代码到编译代码再到执行代码的全过程。这个过程中非常重要的编译环节&#xff0c;被我们一个按钮或者一个ctrlF7快捷键就给带过了。其实这个环节非常重要&#xff0c;如果你非常了解这个环节&#xff0c;你开发源代码就会更加自信和清醒&a…

一文了解如何安全有效的进行PB级别的大数据迁移

在这个信息量爆炸的时代&#xff0c;处理PB级别的数据转移已成为常态&#xff0c;但对企业而言&#xff0c;这仍然是一个充满挑战的任务。今天&#xff0c;我们来探讨一下这个话题&#xff0c;看看在进行PB级数据转移时&#xff0c;需要留意哪些事项&#xff0c;可能会遇到哪些…

使用 PNPM 从 0 搭建 monorepo,测试并发布

1 目标 通过 PNPM 创建一个 monorepo&#xff08;多个项目在一个代码仓库&#xff09;项目&#xff0c;形成一个通用的仓库模板。 这个仓库既可以用于公司存放和管理所有的项目&#xff0c;也可以用于将个人班余的所有积累整合其中。 2 环境要求 核心是 PNPM 和 Node.js&…

oracle dataguard 从库 MRP 进程的状态是 WAIT_FOR_GAP

因主库归档日志未备份直接删除后&#xff0c;从库不能更新&#xff0c;19c版本以上&#xff0c;之前未打补丁&#xff0c;使用 RECOVER STANDBY DATABASE FROM SERVICE PRM180;之后&#xff0c;在执行 alter database recover managed standby database using current logfil…

Qt信号槽与函数直接调用性能对比

1. 测试方法 定义一个类Recv&#xff0c;其中包含一个成员变量num和一个成员函数add()&#xff0c;add()实现num的递增。 另一个类Send通过信号槽或直接调用的方法调用Recv的add函数。 单独开一个线程Watcher&#xff0c;每秒计算num变量的增长数值&#xff0c;作为add函数被调…

Ubuntu 配置动态链接器的搜索路径(/etc/ld.so.conf.d)

引言 为了使程序在运行时可以正常找到指定的lib库&#xff0c;防止出现卡死或闪退现象。 /etc/ld.so.conf.d 路径是程序运行时&#xff0c;系统查找共享库&#xff08;如 .so 文件&#xff09;的位置。 简要说明 如果你安装了一个第三方软件&#xff0c;它可能将其共享库放在…