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

QT----------多媒体

实现思路

  1. 多媒体模块功能概述
    • QT 的多媒体模块提供了丰富的功能,包括音频播放、录制、视频播放和摄像头操作等。
  2. 播放音频
    • 使用 QMediaPlayer 播放完整的音频文件。
    • 使用 QSoundEffect 播放简短的音效文件。
  3. 录制音频
    • 使用 QMediaRecorder 类进行音频录制。
    • 使用 QAudioSourceQAudioSink 类采集和播放原始音频数据。
  4. 播放视频文件
    • QVideoWidgetQGraphicsVideoItem 上播放视频。
  5. 摄像头的使用
    • 实现摄像头的控制,包括拍照和录像功能。

代码示例

1. 基于 QMediaPlayer 的音乐播放器
#include <QtWidgets/QApplication>
#include <QtMultimedia/QMediaPlayer>
#include <QtMultimediaWidgets/QVideoWidget>
#include <QtMultimedia/QMediaPlaylist>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QWidget>
#include <QtCore/QUrl>
#include <QtCore/QDebug>


int main(int argc, char *argv[]) {
    QApplication app(argc, argv);


    QWidget *mainWidget = new QWidget();
    QVBoxLayout *layout = new QVBoxLayout(mainWidget);


    QMediaPlayer *player = new QMediaPlayer();
    QMediaPlaylist *playlist = new QMediaPlaylist();
    playlist->addMedia(QUrl::fromLocalFile("path/to/your/audio.mp3"));
    playlist->setPlaybackMode(QMediaPlaylist::Loop);


    player->setPlaylist(playlist);


    QPushButton *playButton = new QPushButton("Play");
    connect(playButton, &QPushButton::clicked, player, &QMediaPlayer::play);


    layout->addWidget(playButton);


    mainWidget->show();


    return app.exec();
}
2. 使用 QSoundEffect 播放音效文件
#include <QtWidgets/QApplication>
#include <QtMultimedia/QSoundEffect>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QWidget>


int main(int argc, char *argv[]) {
    QApplication app(argc, argv);


    QWidget *mainWidget = new QWidget();
    QVBoxLayout *layout = new QVBoxLayout(mainWidget);


    QSoundEffect *effect = new QSoundEffect();
    effect->setSource(QUrl::fromLocalFile("path/to/your/sound.wav"));


    QPushButton *playButton = new QPushButton("Play Sound");
    connect(playButton, &QPushButton::clicked, effect, &QSoundEffect::play);


    layout->addWidget(playButton);


    mainWidget->show();


    return app.exec();
}
3. 录制音频
#include <QtWidgets/QApplication>
#include <QtMultimedia/QMediaRecorder>
#include <QtMultimedia/QAudioRecorder>
#include <QtMultimedia/QAudioEncoderSettings>
#include <QtMultimedia/QVideoEncoderSettings>
#include <QtMultimedia/QCamera>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QWidget>
#include <QtCore/QUrl>


int main(int argc, char *argv[]) {
    QApplication app(argc, argv);


    QWidget *mainWidget = new QWidget();
    QVBoxLayout *layout = new QVBoxLayout(mainWidget);


    QMediaRecorder *recorder = new QMediaRecorder();


    QAudioEncoderSettings audioSettings;
    audioSettings.setCodec("audio/mp3");
    audioSettings.setQuality(QMultimedia::HighQuality);


    recorder->setAudioSettings(audioSettings);


    QPushButton *recordButton = new QPushButton("Record");
    connect(recordButton, &QPushButton::clicked, [recorder]() {
        if (recorder->state() == QMediaRecorder::StoppedState) {
            recorder->record();
        } else {
            recorder->stop();
        }
    });


    layout->addWidget(recordButton);


    mainWidget->show();


    return app.exec();
}
4. 采集和播放原始音频数据
#include <QtWidgets/QApplication>
#include <QtMultimedia/QAudioSource>
#include <QtMultimedia/QAudioSink>
#include <QtMultimedia/QAudioFormat>
#include <QtMultimedia/QAudioDeviceInfo>
#include <QtCore/QIODevice>
#include <QtCore/QDebug>


class AudioProcessor : public QIODevice {
    Q_OBJECT
public:
    AudioProcessor(QObject *parent = nullptr) : QIODevice(parent) {}


    qint64 readData(char *data, qint64 maxlen) override {
        return 0;
    }


    qint64 writeData(const char *data, qint64 len) override {
        qDebug() << "Received audio data of length:" << len;
        return len;
    }
};


int main(int argc, char *argv[]) {
    QApplication app(argc, argv);


    QAudioFormat format;
    format.setSampleRate(44100);
    format.setChannelCount(2);
    format.setSampleSize(16);
    format.setCodec("audio/pcm");
    format.setByteOrder(QAudioFormat::LittleEndian);
    format.setSampleType(QAudioFormat::UnSignedInt);


    QAudioDeviceInfo inputDevice = QAudioDeviceInfo::defaultInputDevice();
    if (!inputDevice.isFormatSupported(format)) {
        qWarning() << "Default input device does not support the format";
        format = inputDevice.nearestFormat(format);
    }


    QAudioSource *audioSource = new QAudioSource(format);
    AudioProcessor *processor = new AudioProcessor();
    audioSource->start(processor);


    QAudioDeviceInfo outputDevice = QAudioDeviceInfo::defaultOutputDevice();
    QAudioSink *audioSink = new QAudioSink(outputDevice, format);
    audioSink->start(processor);


    return app.exec();
}


#include "main.moc"

在这里插入图片描述

5. 在 QVideoWidget 上播放视频文件
#include <QtWidgets/QApplication>
#include <QtMultimedia/QMediaPlayer>
#include <QtMultimediaWidgets/QVideoWidget>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QWidget>
#include <QtCore/QUrl>


int main(int argc, char *argv[]) {
    QApplication app(argc, argv);


    QWidget *mainWidget = new QWidget();
    QVBoxLayout *layout = new QVBoxLayout(mainWidget);


    QMediaPlayer *player = new QMediaPlayer();
    QVideoWidget *videoWidget = new QVideoWidget();


    player->setVideoOutput(videoWidget);
    player->setMedia(QUrl::fromLocalFile("path/to/your/video.mp4"));


    QPushButton *playButton = new QPushButton("Play Video");
    connect(playButton, &QPushButton::clicked, player, &QMediaPlayer::play);


    layout->addWidget(playButton);
    layout->addWidget(videoWidget);


    mainWidget->show();


    return app.exec();
}
6. 在 QGraphicsVideoItem 上播放视频文件
#include <QtWidgets/QApplication>
#include <QtMultimedia/QMediaPlayer>
#include <QtMultimediaWidgets/QGraphicsVideoItem>
#include <QtWidgets/QGraphicsView>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QWidget>
#include <QtCore/QUrl>


int main(int argc, char *argv[]) {
    QApplication app(argc, argv);


    QWidget *mainWidget = new QWidget();
    QVBoxLayout *layout = new QVBoxLayout(mainWidget);


    QMediaPlayer *player = new QMediaPlayer();
    QGraphicsVideoItem *videoItem = new QGraphicsVideoItem();


    player->setVideoOutput(videoItem);
    player->setMedia(QUrl::fromLocalFile("path/to/your/video.mp4"));


    QGraphicsScene *scene = new QGraphicsScene();
    scene->addItem(videoItem);


    QGraphicsView *view = new QGraphicsView(scene);


    QPushButton *playButton = new QPushButton("Play Video");
    connect(playButton, &QPushButton::clicked, player, &QMediaPlayer::play);


    layout->addWidget(playButton);
    layout->addWidget(view);


    mainWidget->show();


    return app.exec();
}
7. 摄像头的使用(拍照和录像)
#include <QtWidgets/QApplication>
#include <QtMultimedia/QCamera>
#include <QtMultimedia/QCameraViewfinder>
#include <QtMultimedia/QCameraImageCapture>
#include <QtMultimedia/QMediaRecorder>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QWidget>


int main(int argc, char *argv[]) {
    QApplication app(argc, argv);


    QWidget *mainWidget = new QWidget();
    QVBoxLayout *layout = new QVBoxLayout(mainWidget);


    QCamera *camera = new QCamera(QCamera::defaultCamera());


    QCameraViewfinder *viewfinder = new QCameraViewfinder();
    camera->setViewfinder(viewfinder);


    QCameraImageCapture *imageCapture = new QCameraImageCapture(camera);


    QMediaRecorder *mediaRecorder = new QMediaRecorder(camera);


    QPushButton *captureButton = new QPushButton("Take Photo");
    connect(captureButton, &QPushButton::clicked, [imageCapture]() {
        imageCapture->capture();
    });


    QPushButton *recordButton = new QPushButton("Start/Stop Recording");
    connect(recordButton, &QPushButton::clicked, [mediaRecorder]() {
        if (mediaRecorder->state() == QMediaRecorder::StoppedState) {
            mediaRecorder->record();
        } else {
            mediaRecorder->stop();
        }
    });


    layout->addWidget(viewfinder);
    layout->addWidget(captureButton);
    layout->addWidget(recordButton);


    camera->start();


    mainWidget->show();


    return app.exec();
}

代码解释

1. 基于 QMediaPlayer 的音乐播放器
  • QMediaPlayer
    • QMediaPlayer 用于播放音频和视频文件。
    • QMediaPlaylist 用于管理播放列表,可设置播放模式,如循环、顺序、随机等。
2. 使用 QSoundEffect 播放音效文件
  • QSoundEffect
    • 适合播放短音效,使用 setSource 加载音效文件,点击按钮调用 play 播放。
3. 录制音频
  • QMediaRecorder
    • QMediaRecorder 可以录制音频和视频。
    • QAudioEncoderSettings 可设置音频编码和质量。
4. 采集和播放原始音频数据
  • QAudioSource
    • 从输入设备采集音频,使用 start 开始采集。
  • QAudioSink
    • 向输出设备播放音频,使用 start 开始播放。
  • AudioProcessor
    • 自定义 QIODevice 子类,重写 writeData 处理接收到的音频数据。
5. 在 QVideoWidget 上播放视频文件
  • QMediaPlayer
    • 用于播放视频,通过 setVideoOutput 关联到 QVideoWidget 进行播放。
6. 在 QGraphicsVideoItem 上播放视频文件
  • QMediaPlayer
    • 关联到 QGraphicsVideoItem,添加到 QGraphicsScene 并通过 QGraphicsView 显示。
7. 摄像头的使用(拍照和录像)
  • QCamera
    • 表示摄像头设备,使用 setViewfinder 关联视图。
  • QCameraImageCapture
    • 用于拍照,调用 capture 进行拍照操作。
  • QMediaRecorder
    • 用于录像,调用 recordstop 控制录制过程。

使用说明

  • 对于每个示例,将代码保存为 main.cpp 文件。
  • 确保 .pro 文件包含 QT += multimedia multimediawidgets widgets 以及 CONFIG += c++11
  • 编译并运行程序,观察多媒体功能的效果。

在这里插入图片描述


http://www.kler.cn/a/464779.html

相关文章:

  • 电商项目-基于ElasticSearch实现商品搜索功能(一)
  • Oracle Dataguard(主库为 Oracle 11g 单节点)配置详解(3):配置备用数据库
  • 大白话拆解——多线程中关于死锁的一切(七)(已完结)
  • 米哈游可切换角色背景动态壁纸
  • Uncaught ReferenceError: __VUE_HMR_RUNTIME__ is not defined
  • linux 软链接 快捷方式 详解
  • HarmonyOS Next ArkUI @State @Prop @Link @Provide @Consume笔记
  • EasyExcel简介和读写操作
  • IoC设计模式详解:控制反转的核心思想
  • PyTorch 中 coalesce() 函数详解与应用示例
  • Linux之ARM(MX6U)裸机篇----6.BSP工程管理实验
  • Vue 自定义指令
  • 全国知名网络安全赛事西湖论剑·杭州网络安全技能大赛启动报名
  • 【C++/CMake】从静态库到动态库:一行改动解决 “找不到 -ljsoncpp” 链接报错
  • 第二十六天 自然语言处理(NLP)词嵌入(Word2Vec、GloVe)
  • TTL 传输中过期问题定位
  • 【网络协议】路由信息协议 (RIP)
  • 【PyTorch][chapter 28][李宏毅深度学习][Diffusion Model-2]
  • C# 设计模式(结构型模式):装饰器模式
  • 【51单片机-零基础chapter1】
  • MySQL/Oracle集群
  • 操作系统论文导读(八):Schedulability analysis of sporadic tasks with multiple criticality specifications——具有多个
  • 8086汇编(16位汇编)学习笔记10.寄存器总结
  • 数据的高级处理——pandas模块进阶——使用Python进行数据分析
  • 六十二:HTTP/3: QUIC 协议格式
  • 爬虫在分析网站结构时的注意事项及代码示例