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);