diff --git a/src/media/audio/audio_input.cpp b/src/media/audio/audio_input.cpp
index 592268544390e17edc16277f3eaa6fa2730bbaec..f0e2e63f0e58aca1fd40e5e1388af16086aae01c 100644
--- a/src/media/audio/audio_input.cpp
+++ b/src/media/audio/audio_input.cpp
@@ -188,4 +188,12 @@ AudioInput::setMuted(bool isMuted)
     muteState_ = isMuted;
 }
 
+MediaStream
+AudioInput::getInfo() const
+{
+    std::lock_guard<std::mutex> lk(fmtMutex_);
+    auto ms = MediaStream("a:local", format_, sent_samples);
+    return ms;
+}
+
 } // namespace ring
diff --git a/src/media/audio/audio_input.h b/src/media/audio/audio_input.h
index efdd1274598392e729793d27354638e402079986..8baecb17317ec67d69dd728fceb6d508fe1dd863 100644
--- a/src/media/audio/audio_input.h
+++ b/src/media/audio/audio_input.h
@@ -33,6 +33,7 @@
 
 namespace ring {
 
+struct MediaStream;
 class Resampler;
 
 class AudioInput : public Observable<std::shared_ptr<AudioFrame>>
@@ -46,6 +47,7 @@ public:
     bool isCapturing() const { return loop_.isRunning(); }
     void setFormat(const AudioFormat& fmt);
     void setMuted(bool isMuted);
+    MediaStream getInfo() const;
 
 private:
     bool nextFromDevice(AudioFrame& frame);
@@ -55,7 +57,7 @@ private:
     AudioBuffer micData_;
     bool muteState_ = false;
     uint64_t sent_samples = 0;
-    std::mutex fmtMutex_ {};
+    mutable std::mutex fmtMutex_ {};
     AudioFormat format_;
 
     std::unique_ptr<Resampler> resampler_;
diff --git a/src/media/audio/audio_receive_thread.cpp b/src/media/audio/audio_receive_thread.cpp
index b01d9f73d4f9daa869ab5919aa0220aae7c0b7ff..bfd12b56d2bdeca0c9bf1ae959a6b8ae4d8378df 100644
--- a/src/media/audio/audio_receive_thread.cpp
+++ b/src/media/audio/audio_receive_thread.cpp
@@ -150,6 +150,12 @@ AudioReceiveThread::addIOContext(SocketPair& socketPair)
     demuxContext_.reset(socketPair.createIOContext(mtu_));
 }
 
+MediaStream
+AudioReceiveThread::getInfo() const
+{
+    return audioDecoder_->getStream("a:remote");
+}
+
 void
 AudioReceiveThread::startLoop()
 {
diff --git a/src/media/audio/audio_receive_thread.h b/src/media/audio/audio_receive_thread.h
index 8ee6b6a93b5bb0b0749dad1a655c4d8b960fd702..11f3068c043206beed9e956accdbf10a118d0275 100644
--- a/src/media/audio/audio_receive_thread.h
+++ b/src/media/audio/audio_receive_thread.h
@@ -33,6 +33,7 @@ namespace ring {
 
 class MediaDecoder;
 class MediaIOHandle;
+struct MediaStream;
 class RingBuffer;
 
 class AudioReceiveThread : public Observable<std::shared_ptr<AudioFrame>>
@@ -43,6 +44,9 @@ public:
                        const std::string& sdp,
                        const uint16_t mtu);
     ~AudioReceiveThread();
+
+    MediaStream getInfo() const;
+
     void addIOContext(SocketPair &socketPair);
     void startLoop();
 
diff --git a/src/media/media_recorder.cpp b/src/media/media_recorder.cpp
index 589fc74a2ed3c67118c71ab8456c007de0dc095b..54c1550e794dcfd4a88a5df961b0e39b2261b1b4 100644
--- a/src/media/media_recorder.cpp
+++ b/src/media/media_recorder.cpp
@@ -201,9 +201,9 @@ void MediaRecorder::update(Observable<std::shared_ptr<VideoFrame>>* ob, const st
 {
     MediaStream ms;
     if (auto receiver = dynamic_cast<video::VideoReceiveThread*>(ob)) {
-        ms = receiver->getStream();
+        ms = receiver->getInfo();
     } else if (auto input = dynamic_cast<video::VideoInput*>(ob)) {
-        ms = input->getStream();
+        ms = input->getInfo();
     }
     ms.firstTimestamp = v->pointer()->pts;
     recordData(v->pointer(), ms);
diff --git a/src/media/video/video_input.cpp b/src/media/video/video_input.cpp
index 61ace8c1ff298d1ab51d045d6eb629216cecf20a..620f490cbee0ebfa3f3184a92c083814bf7f6a2b 100644
--- a/src/media/video/video_input.cpp
+++ b/src/media/video/video_input.cpp
@@ -607,7 +607,7 @@ DeviceParams VideoInput::getParams() const
 { return decOpts_; }
 
 MediaStream
-VideoInput::getStream() const
+VideoInput::getInfo() const
 {
     return decoder_->getStream("v:local");
 }
diff --git a/src/media/video/video_input.h b/src/media/video/video_input.h
index 1ccfc544f81c28f11c1996ad8790fcc2ce71d3d9..ada09a26b21f5d0aeed23c56eb1b0098424206df 100644
--- a/src/media/video/video_input.h
+++ b/src/media/video/video_input.h
@@ -78,7 +78,7 @@ public:
     int getHeight() const;
     int getPixelFormat() const;
     DeviceParams getParams() const;
-    MediaStream getStream() const;
+    MediaStream getInfo() const;
 
     std::shared_future<DeviceParams> switchInput(const std::string& resource);
 #if defined(__ANDROID__) || defined(RING_UWP) || (defined(TARGET_OS_IOS) && TARGET_OS_IOS)
diff --git a/src/media/video/video_receive_thread.cpp b/src/media/video/video_receive_thread.cpp
index 174fc09274a5b7cac15afbf76047dc7c02a788b7..389215949dfcc734ce12c58a5ce5a7855772e015 100644
--- a/src/media/video/video_receive_thread.cpp
+++ b/src/media/video/video_receive_thread.cpp
@@ -247,7 +247,7 @@ int VideoReceiveThread::getPixelFormat() const
 { return videoDecoder_->getPixelFormat(); }
 
 MediaStream
-VideoReceiveThread::getStream() const
+VideoReceiveThread::getInfo() const
 {
     return videoDecoder_->getStream("v:remote");
 }
diff --git a/src/media/video/video_receive_thread.h b/src/media/video/video_receive_thread.h
index 7641f4627cfd6b6c20d0c60f8b30970bb93eb86d..1eda2d3912778c481857ae7d7970ad3eff950a85 100644
--- a/src/media/video/video_receive_thread.h
+++ b/src/media/video/video_receive_thread.h
@@ -60,7 +60,7 @@ public:
     int getWidth() const;
     int getHeight() const;
     int getPixelFormat() const;
-    MediaStream getStream() const;
+    MediaStream getInfo() const;
     void triggerKeyFrameRequest();
 
 private: