• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

marble

  • sources
  • kde-4.14
  • kdeedu
  • marble
  • src
  • lib
  • marble
MovieCapture.cpp
Go to the documentation of this file.
1 //
2 // This file is part of the Marble Virtual Globe.
3 //
4 // This program is free software licensed under the GNU LGPL. You can
5 // find a copy of this license in LICENSE.txt in the top directory of
6 // the source code.
7 //
8 // Copyright 2013 Illya Kovalevskyy <illya.kovalevskyy@gmail.com>
9 //
10 
11 #include <QDir>
12 #include <QDateTime>
13 #include <QProcess>
14 #include <QThread>
15 #include <QElapsedTimer>
16 
17 #include "MovieCapture.h"
18 #include "MarbleWidget.h"
19 #include "MarbleDebug.h"
20 
21 namespace Marble
22 {
23 
24 class MovieCapturePrivate
25 {
26 public:
27  MovieCapturePrivate(MarbleWidget *widget) :
28  marbleWidget(widget),
29  frameCount(0),
30  sessionId(0)
31  {}
32 
33  QTimer frameTimer;
34  MarbleWidget *marbleWidget;
35  int frameCount;
36  QDir tempDir;
37  QString encoderExec;
38  QString destinationFile;
39  int sessionId;
40 };
41 
42 MovieCapture::MovieCapture(MarbleWidget *widget, QObject *parent) :
43  QObject(parent),
44  d_ptr(new MovieCapturePrivate(widget))
45 {
46  Q_D(MovieCapture);
47  d->frameTimer.setInterval(1000/30); // fps = 30 (default)
48  connect(&d->frameTimer, SIGNAL(timeout()), this, SLOT(recordFrame()));
49 }
50 
51 MovieCapture::~MovieCapture()
52 {
53  delete d_ptr;
54 }
55 
56 void MovieCapture::setFps(int fps)
57 {
58  Q_D(MovieCapture);
59  d->frameTimer.setInterval(1000/fps);
60 }
61 
62 void MovieCapture::setDestination(const QString &path)
63 {
64  Q_D(MovieCapture);
65  d->destinationFile = path;
66 }
67 
68 int MovieCapture::fps() const
69 {
70  Q_D(const MovieCapture);
71  return 1000/d->frameTimer.interval();
72 }
73 
74 QString MovieCapture::destination() const
75 {
76  Q_D(const MovieCapture);
77  return d->destinationFile;
78 }
79 
80 void MovieCapture::recordFrame()
81 {
82  Q_D(MovieCapture);
83 
84  QString numFormat = QString("%1").arg(d->frameCount, 6, 10, QChar('0'));
85  QString fileFormat = QString("marble-%1-frame-%2.bmp").arg(d->sessionId).arg(numFormat);
86  QString path = d->tempDir.absoluteFilePath(fileFormat);
87 
88  d->marbleWidget->mapScreenShot().save(path, "BMP");
89  d->frameCount++;
90 }
91 
92 void MovieCapture::startRecording()
93 {
94  Q_D(MovieCapture);
95 
96  static bool toolsAvailable = false;
97  if (toolsAvailable == false) {
98  QProcess encoder(this);
99  encoder.start("avconv -version");
100  encoder.waitForFinished();
101  if ( !encoder.readAll().isEmpty() ) { // avconv have output when it's here
102  d->encoderExec = "avconv";
103  } else {
104  encoder.start("ffmpeg -version");
105  encoder.waitForFinished();
106  if ( !encoder.readAll().isEmpty() ) {
107  d->encoderExec = "ffmpeg";
108  } else {
109  return;
110  }
111  }
112  }
113 
114  d->sessionId = qAbs(QDateTime::currentMSecsSinceEpoch());
115 
116  d->tempDir = QDir::temp();
117  d->tempDir.mkdir(QString::number(d->sessionId));
118  d->tempDir.cd(QString::number(d->sessionId));
119 
120  d->frameTimer.start();
121  recordFrame();
122 }
123 
124 void MovieCapture::stopRecording()
125 {
126  Q_D(MovieCapture);
127 
128  d->frameTimer.stop();
129  d->frameCount = 0;
130 
131  QProcess *avconv = new QProcess(this);
132  QString input = QString("%1/marble-%2-frame-%06d.bmp")
133  .arg(d->tempDir.path()).arg(d->sessionId);
134  QString output = d->destinationFile;
135  QString argv = QString("-i %1 -r %2 -b 2000k -y %3")
136  .arg(input).arg(fps()).arg(output);
137 
138  connect(avconv, SIGNAL(finished(int)), this, SLOT(processWrittenMovie(int)));
139  avconv->start(d->encoderExec+' '+argv);
140 }
141 
142 void MovieCapture::processWrittenMovie(int exitCode)
143 {
144  if (exitCode != 0)
145  mDebug() << "[*] avconv finished with" << exitCode;
146 
147  Q_D(MovieCapture);
148  foreach(const QString &bmp,
149  d->tempDir.entryList(QStringList() << "*.bmp", QDir::Files)) {
150  d->tempDir.remove(bmp);
151  }
152  d->tempDir.cdUp();
153  d->tempDir.rmdir(QString::number(d->sessionId));
154 }
155 
156 } // namespace Marble
157 
158 #include "MovieCapture.moc"
Marble::MovieCapture::fps
int fps() const
Definition: MovieCapture.cpp:68
QChar
QByteArray::isEmpty
bool isEmpty() const
MovieCapture.h
Marble::MovieCapture::d_ptr
MovieCapturePrivate *const d_ptr
Definition: MovieCapture.h:50
MarbleDebug.h
Marble::MarbleWidget
A widget class that displays a view of the earth.
Definition: MarbleWidget.h:104
QDateTime::currentMSecsSinceEpoch
qint64 currentMSecsSinceEpoch()
QString::number
QString number(int n, int base)
QTimer
QProcess
QObject
QDir::temp
QDir temp()
QIODevice::readAll
QByteArray readAll()
Marble::MovieCapture::startRecording
void startRecording()
Definition: MovieCapture.cpp:92
Marble::MovieCapture::stopRecording
void stopRecording()
Definition: MovieCapture.cpp:124
QString
Marble::MovieCapture::setFps
void setFps(int fps)
Definition: MovieCapture.cpp:56
QStringList
Marble::MovieCapture
Definition: MovieCapture.h:26
Marble::MovieCapture::MovieCapture
MovieCapture(MarbleWidget *widget, QObject *parent)
Definition: MovieCapture.cpp:42
QDir
Marble::MovieCapture::~MovieCapture
~MovieCapture()
Definition: MovieCapture.cpp:51
MarbleWidget.h
This file contains the headers for MarbleWidget.
Marble::MovieCapture::setDestination
void setDestination(const QString &path)
Definition: MovieCapture.cpp:62
MarbleWidget
Wraps a Marble::MarbleWidget, providing access to important properties and methods.
Definition: MarbleDeclarativeWidget.h:50
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QString::arg
QString arg(qlonglong a, int fieldWidth, int base, const QChar &fillChar) const
Marble::mDebug
QDebug mDebug()
a function to replace qDebug() in Marble library code
Definition: MarbleDebug.cpp:36
QProcess::start
void start(const QString &program, const QStringList &arguments, QFlags< QIODevice::OpenModeFlag > mode)
Marble::MovieCapture::destination
QString destination() const
Definition: MovieCapture.cpp:74
QProcess::waitForFinished
bool waitForFinished(int msecs)
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:13:41 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

marble

Skip menu "marble"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal