Hello. I found one better method to fix this issue. Firstly, i think the problem caused by incorrectly setting enc_ctx->time_base, so i refer to the implementation in avcodec_open2()
361 #if FF_API_AVCTX_TIMEBASE 362 if (avctx->framerate.num > 0 && avctx->framerate.den > 0) 363 avctx->time_base = av_inv_q(av_mul_q(avctx->framerate, (AVRational){avctx->ticks_per_frame, 1})); 364 #endif this is new version code and i submit it in new mail, it can be reviewed in https://patchwork.ffmpeg.org/project/ffmpeg/patch/tencent_7adfe69819d49d96fa8bc2c9e688ccec2...@qq.com/ - enc_ctx->time_base = av_inv_q(dec_ctx->framerate); + enc_ctx->time_base = av_inv_q(av_mul_q(dec_ctx->framerate, (AVRational){dec_ctx->ticks_per_frame, 1})); - enc_ctx->time_base = (AVRational){1, enc_ctx->sample_rate}; + enc_ctx->time_base = (AVRational){1, dec_ctx->sample_rate}; but there is new issue in andriy/configure_x86 check: error: Failed to merge in the changes. i think it's maybe the mistake of branch? this patch is for release/5.1 branch rather than master branch. Could any one give me some advice please so that i can fix it? On Wed, Feb 5, 2025 at 11:25 AM Jack Lau <jacklau122...@gmail.com> wrote: > To be clear, i want to give an example, i use a 10s duration, 30fps video. > The ifmt_ctx->streams[stream_index]->time_base is same as > ofmt_ctx->streams[stream_index]->time_base after initializing. > The stream->dec_ctx->time_base is default 0,60 but > stream->enc_ctx->time_base is set to av_inv_q(dec_ctx->framerate) so it's > 0,30 > > 174 /* video time_base can be set to whatever is handy and > supported by encoder */ > 175 enc_ctx->time_base = av_inv_q(dec_ctx->framerate); > > so the twice rescale is this: > input pkt in_tb: 15360 out_tb: 60 > output pkt in_tb: 30 out_tb: 15360 > > so i get one 20s duration and 15fps video(audio duration is normal because > the input's audio sample ratio is 44100) > > So i think the problem is that the enc_ctx->time_base shouldn't set to > av_inv_q(dec_ctx->framerate) > > On Wed, Feb 5, 2025 at 10:29 AM Jack Lau <jacklau122...@gmail.com> wrote: > >> >> AVCodecContext.time_base is not used for decoding. >> >> >> >> Thank you for your reply. I understand that time_base is not used during >> decoding, but the transcoding code calls av_packet_rescale_ts twice, >> once before decoding and once after encoding, as shown below: >> >> 540 if (filter_ctx[stream_index].filter_graph) { >> 541 StreamContext *stream = &stream_ctx[stream_index]; >> 542 >> 543 av_log(NULL, AV_LOG_DEBUG, "Going to reencode&filter the >> frame\n"); >> 544 >> 545 av_packet_rescale_ts(packet, >> >> >> 546 >> ifmt_ctx->streams[stream_index]->time_base, >> 547 stream->dec_ctx->time_base); >> 548 ret = avcodec_send_packet(stream->dec_ctx, packet); >> >> 448 /* prepare packet for muxing */ >> >> >> 449 enc_pkt->stream_index = stream_index; >> 450 av_packet_rescale_ts(enc_pkt, >> 451 stream->enc_ctx->time_base, >> 452 >> ofmt_ctx->streams[stream_index]->time_base); >> 453 >> 454 av_log(NULL, AV_LOG_DEBUG, "Muxing frame\n"); >> 455 /* mux encoded frame */ >> 456 ret = av_interleaved_write_frame(ofmt_ctx, enc_pkt); >> >> If dec_ctx->time_base and enc_ctx->time_base are not consistent, it can >> lead to incorrect packet duration, which in turn causes issues with the >> output file's duration. >> > _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".