Qt:如何从多个QImages创建视频

时间:2017-10-01 10:23:49

标签: qt mp4 qtmultimedia video-codecs qmediarecorder

如何在Qt应用程序中的多个QImage中创建.mp4视频。

查看QMediaRecorder示例,它只知道如何从相机中抓取帧。似乎没有办法将多个QImage或其他图像数据类型传递到QMediaRecorder只是为了制作视频,其中无关用相机

发展环境:
使用 Qt 5.9.1 商业版与应用 Android iOS & OSX

1 个答案:

答案 0 :(得分:1)

很难确定您需要在这里做些什么,考虑到您正在处理的图像数量并不清楚。

话虽这么说,如果您使用ffmpeg等工具生成视频,这是可能的,但是至少需要您将这些图像写入光盘。

以下是我用于为youtube生成幻灯片视频的工作示例。通过保存在驱动器上的命名方案来确定图像的串联。

    sl << "-i" << md.sku(true) + "##%03d.png"; // Images input,

因此,

mysku##001.png // First Slide
mysku##002.png // Second Slide
mysku##003.png // Third Slide
mysku##004.png // Fourth Slide
VideoConvert::VideoConvert(Metadata &md, QFile &oggFile, QObject *parent) : QObject(parent)
{
    QStringList sl;
    tt.warning(md.duration());
    tt.warning(md.length());
    QString framerate = md.duration(true);
    int hour   = QString(md.length()).split(":").at(0).toInt();
    int minute = QString(md.length()).split(":").at(1).toInt();
    int second = QString(md.length()).split(":").at(2).toInt();

    framerate.remove(".");
    framerate.remove(QRegularExpression("^[0]*"));

    sl << "-y"; // overwrite
    sl << "-framerate" << QString::number(md.images().length()) 
        + "/" + QString::number(((hour * 60) * 60) + (minute * 60) + second);
    sl << "-i" << md.sku(true) + "##%03d.png"; // Images input,
    sl << "-i" << oggFile.fileName();
    sl << "-c" << "copy";
    sl << "/home/akiva/FrogCast/" + md.title(true) + " ⟪WikiBook⟫.mp4";
    md.setName(sl.last());

    QEventLoop convertEvent;
    m_Convert.setReadChannelMode(QProcess::MergedChannels);
    connect(&m_Convert, SIGNAL(readyRead()), this, SLOT(convert()));
    connect(this, SIGNAL(converted()), &convertEvent, SLOT(quit()));
    tt.process("Converting Video File");
    for (int i=0; i < sl.length(); i++) {
        QTextStream(stdout) << "\t" << sl.at(i) << endl;
    }
    if (QFile("/home/akiva/FrogCast/Cereproc/ffmpeg").exists()) {
        m_Convert.start("/home/akiva/FrogCast/Cereproc/ffmpeg", sl);
    } else {
        m_Convert.start("ffmpeg", sl);
    }
    convertEvent.exec();
    disconnect(&m_Convert, SIGNAL(finished(int)), this, SLOT(convert()));
    disconnect(this, SIGNAL(converted()), &convertEvent, SLOT(quit()));
    m_Convert.waitForFinished();
}