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

与视频处理相关的类

支持的媒体格式

相关推荐
用户805533698034 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner4 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz9 天前
QML Hello World 入门示例
qt
xcyxiner12 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner13 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner13 天前
DicomViewer (添加模型类)3
qt
xcyxiner14 天前
DicomViewer (目录调整) 2
qt
xcyxiner14 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00616 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术16 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript