diff --git a/include/AudioReaderSource.h b/include/AudioReaderSource.h
index 9b69f7ed..e5756afb 100644
--- a/include/AudioReaderSource.h
+++ b/include/AudioReaderSource.h
@@ -112,6 +112,8 @@ namespace openshot
const ReaderInfo & getReaderInfo() const { return reader->info; }
tr1::shared_ptr getFrame() const { return frame; }
+ int getFramePosition() const { return frame_position; }
+ int getEstimatedFrame() const { return int(estimated_frame); }
};
}
diff --git a/src/Qt/AudioPlaybackThread.cpp b/src/Qt/AudioPlaybackThread.cpp
index a30d6858..6e1bbd27 100644
--- a/src/Qt/AudioPlaybackThread.cpp
+++ b/src/Qt/AudioPlaybackThread.cpp
@@ -73,6 +73,11 @@ namespace openshot
return tr1::shared_ptr();
}
+ int AudioPlaybackThread::getCurrentFramePosition()
+ {
+ return source ? source->getEstimatedFrame() : 0;
+ }
+
void AudioPlaybackThread::run()
{
// Init audio device
diff --git a/src/Qt/AudioPlaybackThread.h b/src/Qt/AudioPlaybackThread.h
index fb35b1ee..864aa167 100644
--- a/src/Qt/AudioPlaybackThread.h
+++ b/src/Qt/AudioPlaybackThread.h
@@ -51,6 +51,7 @@ namespace openshot
void setReader(ReaderBase *reader);
tr1::shared_ptr getFrame();
+ int getCurrentFramePosition();
void run();
diff --git a/src/Qt/PlayerPrivate.cpp b/src/Qt/PlayerPrivate.cpp
index 7ff89e8f..42f883b7 100644
--- a/src/Qt/PlayerPrivate.cpp
+++ b/src/Qt/PlayerPrivate.cpp
@@ -72,15 +72,23 @@ namespace openshot
videoPlayback->frame = frame;
videoPlayback->render.signal();
+ position = audioPlayback->getCurrentFramePosition();
frame = getFrame();
videoPlayback->rendered.wait();
+ int fd = position - audioPlayback->getCurrentFramePosition();
+
const Time t2 = Time::getCurrentTime();
double ft = (1000.0 / reader->info.fps.ToDouble());
int64 d = t2.toMilliseconds() - t1.toMilliseconds();
int st = int(ft - d + 0.5);
- if (0 < ft - d) sleep(st);
+
+ st += fd * reader->info.fps.ToDouble();
+
+ if (0 < st) sleep(st);
+
//std::cout << "frametime: " << ft << " - " << d << " = " << st << std::endl;
+ std::cout << "drift: " << fd << std::endl;
}
if (videoPlayback->isThreadRunning()) videoPlayback->stopThread(-1);