diff --git a/src/media/media_encoder.cpp b/src/media/media_encoder.cpp
index 1ad3182f8a78a53b42847bdcd3c1db5e4b28928c..a7dd59611d30b7d7a15be9a433b4c896a244a903 100644
--- a/src/media/media_encoder.cpp
+++ b/src/media/media_encoder.cpp
@@ -419,7 +419,7 @@ MediaEncoder::encode(AVFrame* frame, int streamIdx)
         }
 
         if (pkt.size) {
-            if (send(pkt))
+            if (send(pkt, streamIdx))
                 break;
         }
     }
@@ -429,15 +429,17 @@ MediaEncoder::encode(AVFrame* frame, int streamIdx)
 }
 
 bool
-MediaEncoder::send(AVPacket& pkt)
+MediaEncoder::send(AVPacket& pkt, int streamIdx)
 {
-    auto streamIdx = currentStreamIdx_;
+    if (streamIdx < 0)
+        streamIdx = currentStreamIdx_;
+    auto encoderCtx = encoders_[streamIdx];
     pkt.stream_index = streamIdx;
     if (pkt.pts != AV_NOPTS_VALUE)
-        pkt.pts = av_rescale_q(pkt.pts, AVRational{1, 20},
+        pkt.pts = av_rescale_q(pkt.pts, encoderCtx->time_base,
                                outputCtx_->streams[streamIdx]->time_base);
     if (pkt.dts != AV_NOPTS_VALUE)
-        pkt.dts = av_rescale_q(pkt.dts, AVRational{1, 20},
+        pkt.dts = av_rescale_q(pkt.dts, encoderCtx->time_base,
                                outputCtx_->streams[streamIdx]->time_base);
     // write the compressed frame
     auto ret = av_write_frame(outputCtx_, &pkt);
diff --git a/src/media/media_encoder.h b/src/media/media_encoder.h
index a7b11dde2e1eae11df57628ffe0ee1208f0e9779..6832b64944aa935656904402716f959dbae572aa 100644
--- a/src/media/media_encoder.h
+++ b/src/media/media_encoder.h
@@ -73,7 +73,7 @@ public:
     void startIO();
     void setIOContext(const std::unique_ptr<MediaIOHandle> &ioctx);
 
-    bool send(AVPacket& packet);
+    bool send(AVPacket& packet, int streamIdx = -1);
 
 #ifdef RING_VIDEO
     int encode(VideoFrame &input, bool is_keyframe, int64_t frame_number);