Qt:如何从多个 QImages 创建视频
Qt : How to create a video from multiple QImages
如何在 Qt 应用程序中用多个 QImage 视频创建一个 .mp4
视频。
看QMediaRecorder个例子,它只知道如何从相机中抓取帧。似乎没有办法将多个 QImage
或其他一些图像数据类型传递到 QMediaRecorder
中,只是为了 制作视频 与相机无关.
开发环境:
在 Android、iOS[=32 上使用 Qt 5.9.1 商业版应用程序=] & OSX.
很难确定您在这里需要做什么,因为不清楚您正在处理多少图像。
也就是说,如果您使用 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();
}
如何在 Qt 应用程序中用多个 QImage 视频创建一个 .mp4
视频。
看QMediaRecorder个例子,它只知道如何从相机中抓取帧。似乎没有办法将多个 QImage
或其他一些图像数据类型传递到 QMediaRecorder
中,只是为了 制作视频 与相机无关.
开发环境:
在 Android、iOS[=32 上使用 Qt 5.9.1 商业版应用程序=] & OSX.
很难确定您在这里需要做什么,因为不清楚您正在处理多少图像。
也就是说,如果您使用 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();
}