[FFmpeg-devel] [PATCH] avformat/utils: improve get duration

平凯 pingkai010 at gmail.com
Fri May 31 16:59:31 CEST 2013


My purpose is not to obtain an average bit rate,I know it will be
overewritten. And it a temporary number. And now there is no duration very
likely,and it will be used  to calculate the duration next in this
function. My purose is duration,not the bit rate , As you know, As a player
the duration is more important than bit rate.

If not do this, the function will to caculate the duration use a random bit
rate,lead to produce is wrong duration when the bit rate is changing.

I have test a acc file the bit rate is changing from 120K to 180K,and in
this function, it use a random value 166 (the last value) to calculate the
duration ,the duration is 2:40,but the actual  value is 3:28,and use my way
the duration is 3:27.

you can get the file here
click
http://pan.baidu.com/share/link?shareid=574906&uk=1677986196
 and click 下载(3.19M) button to download it




2013/5/31 Michael Niedermayer <michaelni at gmx.at>

> On Fri, May 31, 2013 at 12:46:51AM +0800, Ping Kai wrote:
> > improve the accuracy of getting
> > duration from bit rate.
> >
> > Signed-off-by: Ping Kai <pingkai010 at gmail.com>
> > ---
> >  libavformat/utils.c |   15 +++++++++++++++
> >  1 file changed, 15 insertions(+)
> >
> > diff --git a/libavformat/utils.c b/libavformat/utils.c
> > index baa7177..9070b85 100644
> > --- a/libavformat/utils.c
> > +++ b/libavformat/utils.c
> > @@ -2775,7 +2775,11 @@ int avformat_find_stream_info(AVFormatContext
> *ic, AVDictionary **options)
> >      int64_t old_offset = avio_tell(ic->pb);
> >      int orig_nb_streams = ic->nb_streams;        // new streams might
> appear, no options for those
> >      int flush_codecs = ic->probesize > 0;
> > +    int64_t *sample_bit_rate_sum = av_mallocz(ic->nb_streams *
> sizeof(int64_t));
> > +    int *sample_count = av_mallocz(ic->nb_streams * sizeof(int));
> >
> > +    if (sample_bit_rate_sum == NULL || sample_count == NULL)
> > +        return AVERROR(ENOMEM);
> >      if(ic->pb)
> >          av_log(ic, AV_LOG_DEBUG, "File position before
> avformat_find_stream_info() is %"PRId64"\n", avio_tell(ic->pb));
> >
> > @@ -2910,6 +2914,11 @@ int avformat_find_stream_info(AVFormatContext
> *ic, AVDictionary **options)
> >              break;
> >          }
> >
> > +        if (pkt1.stream_index < orig_nb_streams
> > +            &&ic->streams[pkt1.stream_index]->codec->bit_rate > 0){
> > +            sample_bit_rate_sum +=
> ic->streams[pkt1.stream_index]->codec->bit_rate;
> > +            sample_count ++;
> > +        }
> >          if (ic->flags & AVFMT_FLAG_NOBUFFER) {
> >              pkt = &pkt1;
> >          } else {
> > @@ -3030,6 +3039,10 @@ int avformat_find_stream_info(AVFormatContext
> *ic, AVDictionary **options)
> >          count++;
> >      }
> >
> > +    for(i=0;i<orig_nb_streams;i++){
> > +        if (sample_count[i] > 0)
> > +            ic->streams[i]->codec->bit_rate =
> (int)(sample_bit_rate_sum[i] / sample_count[i]);
> > +    }
>
> _if_ a codec or muxer keeps changing and updating bit_rate it will
> continue to do so after avformat_find_stream_info() and the average
> calculated here will be overwritten
> OTOH, if the bit_rate field never changes the average will also be the
> same.
> also the way you average is wrong, the global bitrate is bits/duration
> not neccesarily the average of the indicated bitrates
>
> [...]
> --
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> it is not once nor twice but times without number that the same ideas make
> their appearance in the world. -- Aristotle
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
>


-- 
――――――――――――――――――――――――
平凯
e-mail:pingkai010 at gmail.com
msn:pingkai010 at hotmail.com
tel:15101537133
qq:306978600


More information about the ffmpeg-devel mailing list