Qt第十六章 多媒体Multimedia

文章目录

多媒体

cmakelist 添加Multimedia模块

设备信息查询

c 复制代码
#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等非原始格式音频

c 复制代码
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格式

c 复制代码
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);
}

录制音频

存储位置只能是本地文件系统位置,存储格式也是固定的

c 复制代码
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;
}

低延迟音效

c 复制代码
void testSoundEffect()
{
    QSoundEffect* ef = new QSoundEffect(QMediaDevices::defaultAudioOutput());
    ef->setSource(QUrl::fromLocalFile("../../currency.wav")); // 设置文件路径
    ef->setVolume(1);
    ef->setLoopCount(2);
    ef->play();
}

低级音频播放和录制

c 复制代码
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

解码压缩音频到内存

与音频处理相关的类

视频

播放视频

c 复制代码
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();
}

处理低级视频帧

录制视频

c 复制代码
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;
}

与视频处理相关的类

支持的媒体格式

相关推荐
LIN-JUN-WEI13 分钟前
[ESP32]VSCODE+ESP-IDF环境搭建及blink例程尝试(win10 win11均配置成功)
c语言·开发语言·ide·vscode·单片机·学习·编辑器
望获linux1 小时前
【Linux基础知识系列】第四十三篇 - 基础正则表达式与 grep/sed
linux·运维·服务器·开发语言·前端·操作系统·嵌入式软件
雨落倾城夏未凉1 小时前
7.QObject定时器和QTimer定时器的区别
后端·qt
笑鸿的学习笔记1 小时前
qt-C++语法笔记之Stretch与Spacer的关系分析
c++·笔记·qt
留不住丨晚霞2 小时前
说说SpringBoot常用的注解?
java·开发语言
hardStudy_h2 小时前
C++——内联函数与Lambda表达式
开发语言·jvm·c++
艾莉丝努力练剑2 小时前
【C语言】学习过程教训与经验杂谈:思想准备、知识回顾(三)
c语言·开发语言·数据结构·学习·算法
witton4 小时前
Go语言网络游戏服务器模块化编程
服务器·开发语言·游戏·golang·origin·模块化·耦合
枯萎穿心攻击4 小时前
ECS由浅入深第三节:进阶?System 的行为与复杂交互模式
开发语言·unity·c#·游戏引擎
Jerry Lau4 小时前
go go go 出发咯 - go web开发入门系列(一) helloworld
开发语言·前端·golang