diff --git a/src/media/media_recorder.cpp b/src/media/media_recorder.cpp
index 58a0c0f8081a07a027dc6d80e1f447c110123736..34c8eada2eaa6ecf578779720fdedb3ac2f02dbe 100644
--- a/src/media/media_recorder.cpp
+++ b/src/media/media_recorder.cpp
@@ -176,14 +176,11 @@ MediaRecorder::stopRecording()
 {
     if (isRecording_) {
         RING_DBG() << "Stop recording '" << getPath() << "'";
+        isRecording_ = false;
+        loop_.join();
         flush();
     }
-    isRecording_ = false;
-    if (loop_.isRunning())
-        loop_.join();
-    videoFilter_.reset();
-    audioFilter_.reset();
-    encoder_.reset();
+    resetToDefaults();
 }
 
 int
@@ -215,7 +212,9 @@ MediaRecorder::addStream(bool isVideo, bool fromPeer, MediaStream ms)
 int
 MediaRecorder::recordData(AVFrame* frame, bool isVideo, bool fromPeer)
 {
-    if (!isRecording_ || !isReady_)
+    // recorder may be recording, but not ready for the first frames
+    // return if thread is not running
+    if (!isRecording_ || !isReady_ || !loop_.isRunning())
         return 0;
 
     // save a copy of the frame, will be filtered/encoded in another thread
@@ -486,15 +485,32 @@ MediaRecorder::flush()
     return 0;
 }
 
+void
+MediaRecorder::resetToDefaults()
+{
+    streams_.clear();
+    videoIdx_ = audioIdx_ = -1;
+    nbExpectedStreams_ = 0;
+    nbReceivedVideoStreams_ = nbReceivedAudioStreams_ = 0;
+    isRecording_ = false;
+    isReady_ = false;
+    audioOnly_ = false;
+    videoFilter_.reset();
+    audioFilter_.reset();
+    encoder_.reset();
+}
+
 void
 MediaRecorder::process()
 {
-    if (!loop_.wait_for(FRAME_DEQUEUE_INTERVAL, [this]{ return !frames_.empty(); }))
-        return;
+    // wait until frames_ is not empty or until we are no longer recording
+    loop_.wait([this]{ return !frames_.empty(); });
 
-    if (loop_.isStopping() || !isRecording_ || !isReady_)
+    // if we exited because we stopped recording, stop our thread
+    if (loop_.isStopping())
         return;
 
+    // else encode a frame
     RecordFrame recframe;
     {
         std::lock_guard<std::mutex> q(qLock_);
diff --git a/src/media/media_recorder.h b/src/media/media_recorder.h
index eee2288e14acb11ea180ba1d32abf237781018c3..87bf1e10875e3a6e7bbbc2bc3946aa03fa911be8 100644
--- a/src/media/media_recorder.h
+++ b/src/media/media_recorder.h
@@ -84,6 +84,7 @@ class MediaRecorder {
         void emptyFilterGraph();
         int sendToEncoder(AVFrame* frame, int streamIdx);
         int flush();
+        void resetToDefaults(); // clear saved data for next recording
 
         std::unique_ptr<MediaEncoder> encoder_;
         std::unique_ptr<MediaFilter> videoFilter_;