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;
}

与视频处理相关的类

支持的媒体格式

相关推荐
豆本-豆豆奶9 分钟前
23个Python在自然语言处理中的应用实例
开发语言·python·自然语言处理·编程语音
曳渔15 分钟前
Java-数据结构-二叉树-习题(三)  ̄へ ̄
java·开发语言·数据结构·算法·链表
你可以自己看31 分钟前
python中函数式编程与高阶函数,装饰器与生成器,异常处理与日志记录以及项目实战
服务器·开发语言·python
gopher95111 小时前
go语言 数组和切片
开发语言·golang
ymchuangke1 小时前
线性规划------ + 案例 + Python源码求解(见文中)
开发语言·python
gopher95111 小时前
go语言Map详解
开发语言·golang
Python私教1 小时前
Go语言现代web开发15 Mutex 互斥锁
开发语言·前端·golang
小电玩1 小时前
JAVA SE8
java·开发语言
小丁爱养花2 小时前
记忆化搜索专题——算法简介&力扣实战应用
java·开发语言·算法·leetcode·深度优先
爱上语文2 小时前
Springboot三层架构
java·开发语言·spring boot·spring·架构