Qt - 音视频录制

注意:qt5与qt6 QMediaRecorder的构造函数不一样,所以qt5中的QMediaRecorder不支持录制屏幕

官方文档链接:https://doc.qt.io/qt-6.5/qmediarecorder.html#public-functions

 

一、音频录制

在Qt中,可以使用QAudioRecorder类来进行音频录制。以下是一个简单的例子,展示如何使用QAudioRecorder进行音频录制:

#include <QAudioRecorder>
#include <QUrl>
 
// 创建一个QAudioRecorder实例
QAudioRecorder recorder;
 
// 设置音频源
recorder.setAudioInput("default");
 
// 设置输出文件的URL
recorder.setOutputLocation(QUrl::fromLocalFile("output.mp3"));
 
// 设置编码格式(如MPEG-4 AAC)
recorder.setOutputFormat("MPEG4");
 
// 设置录制时间(例如,限制录制时间为30秒)
recorder.setRecordDuration(30000); // 单位为毫秒
 
// 可以设置更多的属性,如比特率、采样率等
recorder.setQuality(QMultimedia::HighQuality);
recorder.setSampleRate(44100);
recorder.setBitRate(128);
 
// 准备录音(会检查设备是否可用,是否支持设置的格式等)
if (!recorder.isAvailable()) {
    // 处理错误情况
} else {
    // 开始录音
    if (!recorder.record()) {
        // 处理错误情况
    }
}
 
// 你可以在需要停止录音的时候调用
// recorder.stop();

在使用上述代码时,请确保你的应用程序具有适当的权限来访问麦克风,并且设备上的麦克风是可用的。

另外,请注意,QAudioRecorder类是Qt Multimedia模块的一部分,因此在使用之前你需要确保该模块已经正确安装在你的Qt环境中。

 

二、视频录制

在Qt中进行视频录制,可以使用QMediaRecorder类。以下是一个简单的例子,展示如何使用Qt进行视频录制:

首先,确保你的项目文件.pro中包含了multimedia和multimediawidgets模块:

QT += multimedia multimediawidgets

然后,在你的代码中,创建一个QMediaRecorder对象,并将其与QVideoWidget小部件相关联。以下是一个简单的录制视频的例子:

#include <QApplication>
#include <QMediaRecorder>
#include <QVideoWidget>
#include <QCamera>
#include <QCameraInfo>
 
int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
 
    // 检查并选择一个摄像头
    QCamera *camera = new QCamera(QCameraInfo::defaultCamera());
    QMediaRecorder *recorder = new QMediaRecorder(camera);
    QVideoWidget *videoWidget = new QVideoWidget();
 
    // 设置录制输出文件
    QString outputLocation = QStandardPaths::writableLocation(QStandardPaths::MoviesLocation) + "/output.mp4";
    recorder->setOutputLocation(QUrl::fromLocalFile(outputLocation));
 
    // 设置视频和音频配置
    recorder->setMediaObject(camera);
    recorder->setContainerFormat("mp4");
    recorder->setVideoEncoding(QVideoEncoder::H264);
    recorder->setVideoFrameRate(30);
    recorder->setVideoResolution(640, 480);
    recorder->setAudioEncoding(QAudioEncoder::Aac);
 
    // 创建视频显示窗口
    videoWidget->setVideoSource(QMediaVideoSource::VideoOutput);
    videoWidget->setGeometry(10, 10, 640, 480);
    videoWidget->show();
 
    // 开始录制
    if (recorder->state() != QMediaRecorder::RecordingState) {
        camera->setViewfinder(videoWidget);
        recorder->record();
    }
 
    // ... 处理UI事件
 
    return app.exec();
}

确保在你的应用程序中处理好用户界面事件,并且在适当的时候停止录制。停止录制并清理资源的代码示例如下:

// 停止录制
if (recorder->state() == QMediaRecorder::RecordingState) {
    recorder->stop();
}
 
// 删除对象
delete videoWidget;
delete recorder;
delete camera;
 
return 0;

请注意,上述代码示例没有错误处理,实际应用中应该添加错误处理逻辑,以确保代码的健壮性。

 

posted @   [BORUTO]  阅读(295)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
历史上的今天:
2023-10-10 C语言 - 数据类型
2023-10-10 C语言 - 初识C语言
2023-10-10 Linux - 动态库和静态库
点击右上角即可分享
微信分享提示