diff --git a/src/media/video/video_sender.cpp b/src/media/video/video_sender.cpp
index 087d1427917b3ad6bc80c41bb4a149f21da63f04..e8e332fb0b960bdc3e86eaa186fa2eaae49b1d25 100644
--- a/src/media/video/video_sender.cpp
+++ b/src/media/video/video_sender.cpp
@@ -50,6 +50,7 @@ VideoSender::VideoSender(const std::string& dest, const DeviceParams& dev,
     , videoEncoder_(new MediaEncoder)
 {
     videoEncoder_->setDeviceOptions(dev);
+    keyFrameFreq_ = dev.framerate.numerator() * KEY_FRAME_PERIOD;
     videoEncoder_->openOutput(dest.c_str(), args);
     videoEncoder_->setInitSeqVal(seqVal);
     videoEncoder_->setIOContext(muxContext_);
@@ -66,10 +67,13 @@ VideoSender::~VideoSender()
 
 void VideoSender::encodeAndSendVideo(VideoFrame& input_frame)
 {
-    bool is_keyframe = forceKeyFrame_ > 0;
+    bool is_keyframe = forceKeyFrame_ > 0 \
+        or (keyFrameFreq_ > 0 and (frameNumber_ % keyFrameFreq_) == 0);
 
-    if (is_keyframe)
+    if (is_keyframe) {
+        RING_DBG("keyframe requested");
         --forceKeyFrame_;
+    }
 
     if (videoEncoder_->encode(input_frame, is_keyframe, frameNumber_++) < 0)
         RING_ERR("encoding failed");
diff --git a/src/media/video/video_sender.h b/src/media/video/video_sender.h
index cac8f30d8535ac9022cbb9f17c0e61ec13c889e0..d1d1fd64521d1695dc71f9c03314e51c097aef50 100644
--- a/src/media/video/video_sender.h
+++ b/src/media/video/video_sender.h
@@ -74,6 +74,9 @@ public:
     bool useCodec(const AccountVideoCodecInfo* codec) const;
 
 private:
+    static constexpr int KEYFRAMES_AT_START {3}; // Number of keyframes to enforce at stream startup
+    static constexpr unsigned KEY_FRAME_PERIOD {5}; // seconds before forcing a keyframe
+
     NON_COPYABLE(VideoSender);
 
     void encodeAndSendVideo(VideoFrame&);
@@ -82,8 +85,8 @@ private:
     std::unique_ptr<MediaIOHandle> muxContext_ = nullptr;
     std::unique_ptr<MediaEncoder> videoEncoder_ = nullptr;
 
-    static constexpr int KEYFRAMES_AT_START {3}; // Number of keyframes to enforce at stream startup
     std::atomic<int> forceKeyFrame_ {KEYFRAMES_AT_START};
+    int keyFrameFreq_ {0}; // Set keyframe rate, 0 to disable auto-keyframe. Computed in constructor
     int64_t frameNumber_ = 0;
     std::string sdp_ = "";
 };