[Ffmpeg-devel] Seeking and keyframes

Ronald S. Bultje rbultje
Sat Jun 18 09:39:12 CEST 2005

On Sat, 2005-06-18 at 02:47, Steve Willis wrote:
> video does not have to be "played" in real-time, just stepped through
> frame by frame.
> I've been looking at the documentation for av_seek_frame(), and I see
> that it seeks to the first keyframe before the given timestamp by
> default. Is there a simple way to change this behavior so it finds the
> previous keyframe and then regenerates the forward intra-frame to
> exactly match the timestamp?

One reason is that this behaviour can easily be mimmiced based on the
current behaviour. For example, in quasi-code:

void my_seek (time)
  av_seek (time);
  flag_set (WAIT_FOR_TIME);
  me->last_time = time;

data my_get_frame ()
  do {
    data = av_decode_video();
  } while (flag_is_set (WAIT_FOR_TIME) &&
           data->time < me->last_time);

  return data;

Which you could optimize better by only decoding certain types of frames
(e.g. by using hurry_up) while seeking.

> A final (very beginner) question: why is seeking only to keyframes the 
> default? Is it very inefficient to actually generate the exact frame for 
>   a given timestamp each time a user seeks?

See above; yes. I've played with this in a player (ultimately, this is
useful for video editing purposes), and although it's not long (a few
tenth of a second at worst for normal videos with a keyframe every, say,
5 seconds), it is noticeable to the user.


Ronald S. Bultje <rbultje at ronald.bitfreak.net>

More information about the ffmpeg-devel mailing list