[Libav-user] Why does av_seek_frame() not seek to a keyframe?

Don Moir donmoir at comcast.net
Fri Jul 20 23:35:39 CEST 2012


> Afair, Reimar believes the seek function should not try hard to find
> a keyframe because seeking faster is more important.

This most important thing is consistency. In my case (and anyone really), 
that means when I do a seek, the first returned packet should be a key frame 
packet and the time of that packet should be less than or equal to my 
requested seek time.

Testing with the sample provided by Michael Bradshaw at (785mb):

https://doc-04-50-docs.googleusercontent.com/docs/securesc/ha0ro937gcuc7l7deffksulhg5h7mbp1/t0csnri6mmjsd3mqbnb8qdv7b1tiq1e8/1342713600000/11977383638970716307/*/0BxWx_dIBnyRoZDNDeDVud3NNcEE?e=download

So as Michael and others have stated, seeking on the above file seeks to a 
non key packet and so there can be a pause before the next frame can be 
displayed.

The following is sort if generalized to make it simpler and assumes you know 
packet times, display times, and how they relate to your requested seek 
time.

1) The first thing is to determine is when it going to be a problem. (for 
what codecs)

2) The next thing would be how far back in time to you have to go to 
guarantee you are going to get a key packet who's time is less than what you 
requested. The how far back number seems to be guess work but there may be a 
way to get an accurate number.

3) after the seek, read and store packets up to your requested seek time 
(don't decode). Flush the stored packets whenever you hit a key packet.

4) When you are finished reading and storing your packets and if your packet 
queue contains more than one packet, read the queue and decode packet until 
you have 1 packet left in queue.

For the above file I subtracted 2 seconds from my requested seek time. The 
main thing is don't start decoding until you know you have the key packet 
that is closest to your requested time. Reading the extra packets as long as 
they are not decoded does not impact things very much.

The seek is now dead on and quick for the above file.

The main unknown is how far back in time you have to go to gaurantee success 
on a general basis.

The above was easy enough for me to do (outside of unknown subtract time) 
but of course we should not have to do it. The nature of my projects means I 
need to be as accurate as possible. We all want accuracy but if I don't at 
lease make it happen to the best of my ability I will get complaints 
quickly. 



More information about the Libav-user mailing list