-/***************************************************************************
- * Copyright (C) 2012 by Simon Andreas Eugster (simon.eu@gmail.com) *
- * This file is part of kdenlive. See www.kdenlive.org. *
- * *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- ***************************************************************************/
+/*
+Copyright (C) 2012 Simon A. Eugster (Granjow) <simon.eu@gmail.com>
+This file is part of kdenlive. See www.kdenlive.org.
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+*/
#include <QMap>
#include <QFile>
<< "how much B needs to be shifted in order to be synchronized with A." << std::endl << std::endl
<< path << " <main audio file> <second audio file>" << std::endl
<< "\t-h, --help\n\t\tDisplay this help" << std::endl
+ << "\t--fft\n\t\tUse Fourier Transform (FFT) to calculate the offset. This only takes" << std::endl
+ << "\t\tO(n log n) time compared to O(n²) when using normal correlation and should be " << std::endl
+ << "\t\tfaster for large data (several minutes)." << std::endl
<< "\t--profile=<profile>\n\t\tUse the given profile for calculation (run: melt -query profiles)" << std::endl
<< "\t--no-images\n\t\tDo not save envelope and correlation images" << std::endl
;
std::string profile = "atsc_1080p_24";
bool saveImages = true;
+ bool useFFT = false;
// Load arguments
- foreach (QString str, args) {
+ foreach (const QString &str, args) {
if (str.startsWith("--profile=")) {
QString s = str;
} else if (str == "--no-images") {
saveImages = false;
args.removeOne(str);
+
+ } else if (str == "--fft") {
+ useFFT = true;
+ args.removeOne(str);
}
}
<< "\n, result will indicate by how much (2) has to be moved." << std::endl
<< "Profile used: " << profile << std::endl
;
+ if (useFFT) {
+ std::cout << "Will use FFT based correlation." << std::endl;
+ }
// Initialize MLT
// Build the audio envelopes for the correlation
- AudioEnvelope envelopeMain(&prodMain);
- envelopeMain.loadEnvelope();
- envelopeMain.loadStdDev();
- envelopeMain.dumpInfo();
-
- AudioEnvelope envelopeSub(&prodSub);
- envelopeSub.loadEnvelope();
- envelopeSub.loadStdDev();
- envelopeSub.dumpInfo();
-
-
-
-
+ AudioEnvelope *envelopeMain = new AudioEnvelope(fileMain.c_str(), &prodMain);
+ envelopeMain->loadEnvelope();
+ envelopeMain->loadStdDev();
+ envelopeMain->dumpInfo();
+ AudioEnvelope *envelopeSub = new AudioEnvelope(fileSub.c_str(), &prodSub);
+ envelopeSub->loadEnvelope();
+ envelopeSub->loadStdDev();
+ envelopeSub->dumpInfo();
// Calculate the correlation and hereby the audio shift
- AudioCorrelation corr(&envelopeMain);
- int index = corr.addChild(&envelopeSub);
+ AudioCorrelation corr(envelopeMain);
+ int index = corr.addChild(envelopeSub, useFFT);
int shift = corr.getShift(index);
- std::cout << fileSub << " should be shifted by " << shift << " frames" << std::endl
+ std::cout << " Should be shifted by " << shift << " frames: " << fileSub << std::endl
<< "\trelative to " << fileMain << std::endl
- << "\tin a " << prodMain.get_fps() << " fps profile (" << profile << ")." << std::endl
- ;
+ << "\tin a " << prodMain.get_fps() << " fps profile (" << profile << ")." << std::endl;
if (saveImages) {
- QString outImg;
- outImg = QString("envelope-main-%1.png")
+ QString outImg = QString::fromLatin1("envelope-main-%1.png")
.arg(QDateTime::currentDateTime().toString("yyyy-MM-dd-hh:mm:ss"));
- envelopeMain.drawEnvelope().save(outImg);
+ envelopeMain->drawEnvelope().save(outImg);
std::cout << "Saved volume envelope as "
<< QFileInfo(outImg).absoluteFilePath().toStdString()
<< std::endl;
- outImg = QString("envelope-sub-%1.png")
+ outImg = QString::fromLatin1("envelope-sub-%1.png")
.arg(QDateTime::currentDateTime().toString("yyyy-MM-dd-hh:mm:ss"));
- envelopeSub.drawEnvelope().save(outImg);
+ envelopeSub->drawEnvelope().save(outImg);
std::cout << "Saved volume envelope as "
<< QFileInfo(outImg).absoluteFilePath().toStdString()
<< std::endl;
- outImg = QString("correlation-%1.png")
+ outImg = QString::fromLatin1("correlation-%1.png")
.arg(QDateTime::currentDateTime().toString("yyyy-MM-dd-hh:mm:ss"));
corr.info(index)->toImage().save(outImg);
std::cout << "Saved correlation image as "
}
+ // Mlt::Factory::close();
+
+
return 0;
}