Hi, For mpeg program streams (VOB) or transport streams, counting frames is really the only way to go.
There is an alternative, which is to look at the video PTS for the first and last frame, and do the calculations from there. The problems are that: - You have to take care of the PTS roll over. The PTS is a 33 bit unsigned integer counter running at 90000KHz. which means it will roll over every 26 hours or so. - If there is a discontinuity on the PTS. Which is valid, but not very likely. Then there is no way really to know, other than counting frames. t = (PTSlast - PTSfirst) / 90000.0 The problem with counting frames is the processing time. For VOB.s 25 seconds is not as bad, but when talking about HD then it starts becoming a problem. -- Jose On Mon, Mar 16, 2009 at 5:29 AM, Clive Taylor <[email protected]> wrote: > Tom, > > Hopefully this reply will prompt someone to tell us the best method. > > For some formats (for example, MPG) the duration is not available from > the file header. So opening the file is not the only thing you need to > do to get the duration. What I do, which is probably not the most > efficient way but is quite simple, is to read all of the frames but not > process them. That gives me the frame count, which I then multiply by > the inverse of the frame rate to get the duration in mS. For my > applicatiooon, this is not too much of a handicap because I'm do another > "pre-pass" over the file to build a frame index (modified FFMPEG-FAS) > and do some other processing that I need to do. > > I find that for a 1 hour file - like a 1GB VOB file, for example, I can > get the duration in about 20-25 seconds. If that is too slow, then you > could always use a second thread to compute the duration while the main > thread is displaying the video or whatever it is you're doing. > > Clive > > -----Original Message----- > From: [email protected] > [mailto:[email protected]] On Behalf Of Tom Handal > Sent: 16 March 2009 05:46 > To: [email protected] > Subject: [libav-user] av_open_input_stream not getting duration > > Sorry to send this again, but I really need to find a way to do this... > Please see my forwarded e-mail... > > Thanks in advance... > Tom > > ---------- Forwarded message ---------- > From: Tom Handal <[email protected]> > Date: Fri, Mar 13, 2009 at 11:15 AM > Subject: [libav-user] av_open_input_stream not getting duration > To: [email protected] > > > Hi all, > > I am trying to use av_open_input_stream to open the stream, which > works > great. The problem I am having is that the duration entry in the format > context is not getting set to a proper value. This is on Mac OS X > (Leopard). > > What am I doing wrong here? > > code: > > AVProbeData pd; > > av_register_all(); > > pd.filename = m_URI; // This is just a regular local filename > pd.buf = (unsigned char *) av_malloc(188 * 50); > pd.buf_size = 188 * 50; > > m_pByteDataPtr = pd.buf; > > m_pFormatContext = NULL; > > // Read small amount of data to determine format > > m_pFileReader->Read((char *) pd.buf, pd.buf_size); > > init_put_byte(&m_ByteIOContext, m_pByteDataPtr, pd.buf_size, 0, > this, > ReadData, NULL, SeekFile); > > // ReadData and SeekFile are functions that just use my FileReader class > to > read and seek into file ... this is standard posix stuff > > m_pInputFormat = av_probe_input_format(&pd, 1); > > m_ByteIOContext.is_streamed = 0; > av_open_input_stream(&m_pFormatContext, &m_ByteIOContext, m_URI, > m_pInputFormat, NULL); > > av_find_stream_info(m_pFormatContext); > > dump_format(m_pFormatContext, 0, "", false); > > When the dump format happens, it says that the duration is N/A, so I am > assuming it is AV_NOPTS_VALUE or whatever... > When i look at the m_pFormatContext in the debugger, the value is > obiously > wrong... its like -9223372036854775808 > > Any ideas as to why it is not getting the duration of the file for me? > > Thanks in advance!! > Tom > _______________________________________________ > libav-user mailing list > [email protected] > https://lists.mplayerhq.hu/mailman/listinfo/libav-user > > > _______________________________________________ > libav-user mailing list > [email protected] > https://lists.mplayerhq.hu/mailman/listinfo/libav-user > _______________________________________________ libav-user mailing list [email protected] https://lists.mplayerhq.hu/mailman/listinfo/libav-user
