diff --git a/src/media/media_encoder.cpp b/src/media/media_encoder.cpp index 7d3a9be176577371a4bb92ee5c52b5bb197b4c5b..22bce401d98b30e698ffaad0e4767e412ab743a7 100644 --- a/src/media/media_encoder.cpp +++ b/src/media/media_encoder.cpp @@ -463,7 +463,7 @@ MediaEncoder::encode(AVFrame* frame, int streamIdx) // Initialize on first video frame, or first audio frame if no video stream bool isVideo = (frame->width > 0 && frame->height > 0); if (isVideo or not videoOpts_.isValid()) { - initStream(videoCodec_, frame->hw_frames_ctx); + streamIdx = initStream(videoCodec_, frame->hw_frames_ctx); startIO(); } else { return 0; @@ -502,16 +502,22 @@ MediaEncoder::encode(AVFrame* frame, int streamIdx) bool MediaEncoder::send(AVPacket& pkt, int streamIdx) { + if (!initialized_) { + streamIdx = initStream(videoCodec_, nullptr); + startIO(); + } 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, encoderCtx->time_base, - outputCtx_->streams[streamIdx]->time_base); - if (pkt.dts != AV_NOPTS_VALUE) - pkt.dts = av_rescale_q(pkt.dts, encoderCtx->time_base, - outputCtx_->streams[streamIdx]->time_base); + if (streamIdx >= 0 and streamIdx < encoders_.size()) { + auto encoderCtx = encoders_[streamIdx]; + pkt.stream_index = streamIdx; + if (pkt.pts != AV_NOPTS_VALUE) + 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, encoderCtx->time_base, + outputCtx_->streams[streamIdx]->time_base); + } // write the compressed frame auto ret = av_write_frame(outputCtx_, &pkt); if (ret < 0) {