[Ffmpeg-devel] av_seek_frame() units

Steve Willis steve
Wed Jul 6 07:38:27 CEST 2005


Hi Ian,

I think what Rich is saying is that there is no formula for accurately 
mapping a time to a frame number for all formats, because some formats 
do not have a constant frame rate. I ran into this issue myself using 
the Java Media Framework (JMF), which I'm much more familiar with. It is 
better to refer to timestamps rather than frames, because there is 
always a frame to fetch for a given timestamp. If you try to fetch a 
frame by sequence number, you have to count from the beginning to be 
sure its correct for all formats, and that gets messy if you need to seek.

With this in mind, I am looking for the "best practice" way to do just 
that...fetch a frame for a given time. This is proving difficult for me, 
because the library can only seek to the nearest keyframe. I need the 
exact frame for a given time...not just the nearest key frame. I'm 
trying out the suggestions I've been given on this list, and I'll post 
my progress if that helps you. It could be another week, though. I'm a 
Java programmer, and I'm struggling to understand both the 
avformat/avcodec library and also C/C++ at large. Oh yeah, I'm also 
using Windows! So far, I'm successfully fetching one frame at a time in 
sequence as an RGB image (which is what I need), so I just have to 
figure out an efficient way of random-access into the stream.

By the way, if you are certain that all the formats you will use will be 
constant frame rate, the timestamp method can still help you:

frame_number = frame_rate * time

...where frame_number and time are in the same units, such as seconds or ms.

Best regards,

Steve


Ian Gowen wrote:
> While providing lots of useful info, this still doesn't address my original 
> question: given the frame number, what is the formula to find the correct 
> timestamp for a particular stream? (i.e. in AVStream.time_base units, not 
> AV_TIME_BASE).
> 
> --Ian
> 
> On 7/5/05, Michael Niedermayer <michaelni at gmx.at> wrote:
> 
>>Hi
>>
>>On Tuesday 05 July 2005 12:36, Andy Parkins wrote:
>>
>>>On Tuesday 2005 July 05 10:14, Michael Niedermayer wrote:
>>>
>>>>>av_seek_frame( fmtCtx, -1, TARGET_PTS, AVSEEK_FLAG_BACKWARD );
>>>>>CodecCtx->hurry_up = 1;
>>>>>do {
>>>>>    av_read_frame( fmtCtx, &Packet );
>>>>>    // should really be checking that this is a video packet
>>>>>    MyPts = Packet.pts / Packet.duration *
>>>>>  AV_TIME_BASE / av_q2d( Stream->r_frame_rate);
>>>>
>>>>this is completely wrong, the division by Packet.duration makes no sens
>>>>and its 1/Stream.time_base not Stream->r_frame_rate which should be used
>>>
>>>How's this?
>>>
>>>   MyPts = av_rescale( Packet.pts,
>>>        AV_TIME_BASE * (int64_t) Stream->time_base.num,
>>>        Stream->time_base.den );
>>
>>looks good
>>
>>[...]
>>--
>>Michael
>>
>>_______________________________________________
>>ffmpeg-devel mailing list
>>ffmpeg-devel at mplayerhq.hu
>>http://mplayerhq.hu/mailman/listinfo/ffmpeg-devel
>>
> 
> 
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at mplayerhq.hu
> http://mplayerhq.hu/mailman/listinfo/ffmpeg-devel





More information about the ffmpeg-devel mailing list