You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将视频存储至SQLite数据库?Qt+OpenCV录制场景技术咨询

将AVI视频存入SQLite数据库的实现方案(Qt+OpenCV场景)

当然可以把你用Qt+OpenCV录制好的AVI视频存入SQLite数据库,我之前做过类似的需求,给你拆解具体的实现步骤和注意事项:

核心原理

SQLite支持BLOB(二进制大对象)类型字段,刚好可以用来存储视频这类二进制文件。我们只需要把AVI文件的二进制内容读取出来,插入到带BLOB字段的数据库表中即可;后续需要时再从数据库读取二进制数据,还原成AVI文件。

具体实现步骤

1. 配置Qt SQL模块并创建数据库表

首先确保你的Qt项目中启用了SQL模块:在.pro文件里添加:

QT += sql

然后用Qt的QSqlDatabase连接SQLite,并创建用于存储视频的表:

#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDateTime>

bool initVideoDatabase() {
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("video_records.db"); // 数据库文件名,不存在会自动创建

    if (!db.open()) {
        qDebug() << "数据库打开失败:" << db.lastError().text();
        return false;
    }

    // 创建视频存储表
    QSqlQuery query;
    QString createTableSql = R"(
        CREATE TABLE IF NOT EXISTS videos (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            video_data BLOB NOT NULL,
            filename TEXT NOT NULL,
            record_time DATETIME NOT NULL
        )
    )";

    if (!query.exec(createTableSql)) {
        qDebug() << "建表失败:" << query.lastError().text();
        return false;
    }
    return true;
}

2. 读取AVI文件并插入数据库

你已经完成了AVI视频的录制,接下来只需要读取该文件的二进制内容,插入到数据库中:

bool saveVideoToDatabase(const QString& aviFilePath) {
    // 读取AVI文件的二进制数据
    QFile videoFile(aviFilePath);
    if (!videoFile.open(QIODevice::ReadOnly)) {
        qDebug() << "无法打开AVI文件:" << videoFile.errorString();
        return false;
    }
    QByteArray videoBytes = videoFile.readAll();
    videoFile.close();

    // 插入到数据库
    QSqlQuery query;
    query.prepare(R"(
        INSERT INTO videos (video_data, filename, record_time)
        VALUES (:data, :name, :time)
    )");
    query.bindValue(":data", videoBytes);
    query.bindValue(":name", aviFilePath.section('/', -1)); // 只取文件名
    query.bindValue(":time", QDateTime::currentDateTime().toString(Qt::ISODate));

    if (!query.exec()) {
        qDebug() << "插入视频失败:" << query.lastError().text();
        return false;
    }
    return true;
}

3. 从数据库读取并还原AVI视频

如果需要从数据库中取出视频,只需要查询BLOB字段,再写入文件即可:

bool loadVideoFromDatabase(int videoId, const QString& savePath) {
    QSqlQuery query;
    query.prepare("SELECT video_data FROM videos WHERE id = :id");
    query.bindValue(":id", videoId);

    if (!query.exec() || !query.next()) {
        qDebug() << "查询视频失败:" << query.lastError().text();
        return false;
    }

    // 读取BLOB数据并写入文件
    QByteArray videoBytes = query.value(0).toByteArray();
    QFile outputFile(savePath);
    if (!outputFile.open(QIODevice::WriteOnly)) {
        qDebug() << "无法写入文件:" << outputFile.errorString();
        return false;
    }
    outputFile.write(videoBytes);
    outputFile.close();
    return true;
}

注意事项

  • 视频大小限制:SQLite对BLOB的大小没有硬性上限,但如果你的视频文件很大(比如几百MB以上),直接存储整个文件可能会影响数据库性能,这种情况可以考虑将视频分块存储,或者只存储文件路径、把视频存在本地,数据库记录路径即可。
  • 实时录制优化:如果想跳过本地AVI文件,直接把OpenCV录制的视频流写入数据库,可以考虑将视频写入cv::Mat序列的二进制数据,或者用内存流(比如QBuffer)配合OpenCV的VideoWriter,不过这种方式复杂度更高,建议先通过本地文件中转更稳妥。
  • 编码兼容性:确保你读取和写入的AVI编码一致,避免还原后的视频无法播放。

内容的提问来源于stack exchange,提问作者Ryder389

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:11:48