It is possible that the actual audio data only occupy part of the last audio frame. This can be signaled by duration in the "trun" atom. We should respect the metadata of file and set the duration correctly. --- libavformat/mov.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/libavformat/mov.c b/libavformat/mov.c index 45eca74d1d..caea36b495 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -5700,11 +5700,16 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom) sc->ctts_data[index_entry_pos].count = 1; sc->ctts_data[index_entry_pos].duration = ctts_duration; + if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) { + sc->ctts_data[index_entry_pos].duration = sample_duration; + } else { + sc->ctts_data[index_entry_pos].duration = ctts_duration; + } index_entry_pos++; av_log(c->fc, AV_LOG_TRACE, "AVIndex stream %d, sample %d, offset %"PRIx64", dts %"PRId64", " - "size %u, distance %d, keyframe %d\n", st->index, - index_entry_pos, offset, dts, sample_size, distance, keyframe); + "size %u, distance %d, keyframe %d duration %d\n", st->index, + index_entry_pos, offset, dts, sample_size, distance, keyframe, sc->ctts_data[index_entry_pos-1].duration); distance++; if (av_sat_add64(dts, sample_duration) != dts + (uint64_t)sample_duration) return AVERROR_INVALIDDATA; @@ -9894,6 +9899,9 @@ static int mov_finalize_packet(AVFormatContext *s, AVStream *st, AVIndexEntry *s } if (sc->ctts_data && sc->ctts_index < sc->ctts_count) { pkt->pts = av_sat_add64(pkt->dts, av_sat_add64(sc->dts_shift, sc->ctts_data[sc->ctts_index].duration)); + if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) { + pkt->duration = sc->ctts_data[sc->ctts_index].duration; + } /* update ctts context */ sc->ctts_sample++; if (sc->ctts_index < sc->ctts_count && -- 2.45.1.288.g0e0cd299f1-goog _______________________________________________ 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".