ping > 2022年9月1日 18:22,1035567...@qq.com 写道: > > From: Wang Yaqiang <wangyaqian...@kuaishou.com> > > In the format of mp4 segment, the bitrate calculation of > stream depends on the sample_size in moof->traf->trun box. > In the original logic, when the last sidx box is read, > it is not parsed backwards, and the total sample_size calculation is smaller. > As a result, the bitrate displayed by ffprobe is also smaller than the actual. > Increasing the moof_count variable ensures that the last moof is parsed. > > Test method: You can use -c copy remux a fmp4 file as mp4 > and ffprobe the two files will find that the bitrate is inconsistent > Befor patch: > Stream #0:1[0x2](und): Audio: aac (HE-AAC) (mp4a / 0x6134706D), 44100 Hz, > stereo, fltp, 59 kb/s > After patch: > Stream #0:1[0x2](und): Audio: aac (HE-AAC) (mp4a / 0x6134706D), 44100 Hz, > stereo, fltp, 96 kb/s (default) > > Signed-off-by: Wang Yaqiang <wangyaqian...@kuaishou.com> > --- > libavformat/isom.h | 1 + > libavformat/mov.c | 8 +++++++- > 2 files changed, 8 insertions(+), 1 deletion(-) > > diff --git a/libavformat/isom.h b/libavformat/isom.h > index f05c2d9c28..183a3c486b 100644 > --- a/libavformat/isom.h > +++ b/libavformat/isom.h > @@ -296,6 +296,7 @@ typedef struct MOVContext { > int has_looked_for_mfra; > int use_tfdt; > MOVFragmentIndex frag_index; > + int moof_count; //ensure last fragment parse moof box > int atom_depth; > unsigned int aax_mode; ///< 'aax' file has been detected > uint8_t file_key[20]; > diff --git a/libavformat/mov.c b/libavformat/mov.c > index 14550e6456..396658e342 100644 > --- a/libavformat/mov.c > +++ b/libavformat/mov.c > @@ -7784,12 +7784,15 @@ static int mov_read_default(MOVContext *c, > AVIOContext *pb, MOVAtom atom) > int64_t start_pos = avio_tell(pb); > int64_t left; > int err = parse(c, pb, a); > + if (a.type == MKTAG('m','o','o','f')) { > + c->moof_count ++; > + } > if (err < 0) { > c->atom_depth --; > return err; > } > if (c->found_moov && c->found_mdat && a.size <= INT64_MAX - > start_pos && > - ((!(pb->seekable & AVIO_SEEKABLE_NORMAL) || c->fc->flags & > AVFMT_FLAG_IGNIDX || c->frag_index.complete) || > + ((!(pb->seekable & AVIO_SEEKABLE_NORMAL) || c->fc->flags & > AVFMT_FLAG_IGNIDX || (c->frag_index.complete && c->moof_count >= > c->frag_index.nb_items)) || > start_pos + a.size == avio_size(pb))) { > if (!(pb->seekable & AVIO_SEEKABLE_NORMAL) || c->fc->flags & > AVFMT_FLAG_IGNIDX || c->frag_index.complete) > c->next_root_atom = start_pos + a.size; > @@ -8361,6 +8364,9 @@ static int mov_read_header(AVFormatContext *s) > av_log(s, AV_LOG_ERROR, "moov atom not found\n"); > return AVERROR_INVALIDDATA; > } > + if (mov->frag_index.nb_items > mov->moof_count) { > + av_log(s, AV_LOG_WARNING, "the number of moof is less then fragment > count\n"); > + } > av_log(mov->fc, AV_LOG_TRACE, "on_parse_exit_offset=%"PRId64"\n", > avio_tell(pb)); > > if (pb->seekable & AVIO_SEEKABLE_NORMAL) { > -- > 2.33.0 >
_______________________________________________ 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".