65 const QString exportDimensions =
67 .append(QString::number(options.
width))
69 .append(QString::number(options.
height))
75 const QFileInfo resultFileInfo(resultFile);
76 const QDir videoDir(resultFileInfo.absolutePath());
78 const QString suffix = resultFileInfo.suffix().toLower();
79 const QString palettePath = videoDir.filePath(
"KritaTempPalettegen_\%06d.png");
92 <<
"-r" << QString::number(options.
frameRate)
93 <<
"-start_number" << QString::number(sequenceStart) <<
"-start_number_range" <<
"1"
94 <<
"-i" << savedFilesMask;
96 const int lavfiOptionsIndex = additionalOptionsList.indexOf(
"-lavfi");
98 if ( lavfiOptionsIndex != -1 ) {
99 complexFilterArgs << additionalOptionsList.takeAt(lavfiOptionsIndex + 1);
101 additionalOptionsList.removeAt( lavfiOptionsIndex );
105 paletteArgs <<
"-r" << QString::number(options.
frameRate)
106 <<
"-start_number" << QString::number(sequenceStart) <<
"-start_number_range" <<
"1"
107 <<
"-i" << savedFilesMask;
109 const int paletteOptionsIndex = additionalOptionsList.indexOf(
"-palettegen");
110 QString palettegenString =
"palettegen";
112 if ( paletteOptionsIndex != -1 ) {
113 palettegenString = additionalOptionsList.takeAt(paletteOptionsIndex + 1);
115 additionalOptionsList.removeAt( paletteOptionsIndex );
119 paletteArgs <<
"-vf" << (exportDimensions +
"," + palettegenString );
121 paletteArgs <<
"-vf" << palettegenString;
124 paletteArgs <<
"-y" << palettePath;
127 ffmpegArgs <<
"-v" <<
"debug"
131 ffmpegSettings.
args = ffmpegArgs;
135 ffmpegSettings.
progressMessage = i18nc(
"Animation export dialog for palette exporting. arg1: file-suffix",
136 "Creating palette for %1 file format.",
"[suffix]");
137 ffmpegSettings.
logPath = QDir::tempPath() + QDir::separator() +
"krita" + QDir::separator() +
"ffmpeg.log";
141 if (!result.
isOk()) {
145 if (lavfiOptionsIndex == -1) {
146 complexFilterArgs <<
"[0:v][1:v] paletteuse";
149 args <<
"-i" << palettePath;
152 ffmpegWrapper->reset();
156 if (options.
includeAudio && audioFiles.count() > 0 && audioFiles.first().exists()) {
157 QFileInfo audioFileInfo = audioFiles.first();
158 const int msecPerFrame = (1000 / animation->
framerate());
159 const int msecStart = msecPerFrame * clipRange.
start();
160 const int msecDuration = msecPerFrame * clipRange.
duration();
162 const QTime startTime = QTime::fromMSecsSinceStartOfDay(msecStart);
163 const QTime durationTime = QTime::fromMSecsSinceStartOfDay(msecDuration);
164 const QString ffmpegTimeFormat = QStringLiteral(
"H:m:s.zzz");
166 args <<
"-ss" << QLocale::c().toString(startTime, ffmpegTimeFormat);
167 args <<
"-t" << QLocale::c().toString(durationTime, ffmpegTimeFormat);
168 args <<
"-i" << audioFileInfo.absoluteFilePath();
174 simpleFilterArgs << exportDimensions;
177 if ( !complexFilterArgs.isEmpty() ) {
178 args <<
"-lavfi" << (!simpleFilterArgs.isEmpty() ? simpleFilterArgs.join(
",").append(
"[0:v];"):
"") + complexFilterArgs.join(
";");
179 }
else if ( !simpleFilterArgs.isEmpty() ) {
180 args <<
"-vf" << simpleFilterArgs.join(
",");
183 args << additionalOptionsList;
185 dbgFile <<
"savedFilesMask" << savedFilesMask
186 <<
"save files offset" << sequenceStart
187 <<
"start" << QString::number(clipRange.
start())
188 <<
"duration" << clipRange.
duration();
193 ffmpegSettings.
args = args;
196 ffmpegSettings.
logPath = QDir::tempPath() + QDir::separator() +
"krita" + QDir::separator() +
"ffmpeg.log";
197 ffmpegSettings.
progressMessage = i18nc(
"Animation export dialog for tracking ffmpeg progress. arg1: file-suffix, arg2: progress frame number, arg3: totalFrameCount.",
198 "Creating desired %1 file: %2/%3 frames.",
"[suffix]",
"[progress]",
"[framecount]");
200 resultOuter = ffmpegWrapper->start(ffmpegSettings);
KisImportExportErrorCode encode(const QString &savedFilesMask, const KisAnimationRenderingOptions &options)
encode the main encoding function. This in turn calls runFFMpeg, which is a private function inside t...