[FFmpeg-devel] Fixing av_seek
Don Moir
donmoir at comcast.net
Mon Jan 30 21:53:35 CET 2012
For the most part, I have seeking in my app working really well. I have
flags for exact time seeking or key frame seeking. When doing exact time
seeking, I have a seek slop factor that currently ranges from 0 to 1/2
second. I compute this depending on the file and it just governs how close
you want it to the timestamp of interest. In the odd case where the actual
seeked to time is far off from the requested timestamp, it could go back to
keyframe seeking and this could be controlled with flags at a users
degression. This is a pretty rare event though considering that large files
generally have an adequate supply of keyframes and with low res or short
files, it's quick enough to do it.
Most of the work has been in over coming a few problems with
avformat_seek_file and the related decoders.
The problem is you cannot have avformat_seek_file failing when it should not
and even if it succeeds it must be doing the right thing.
Some cases when avformat_seek_file fails or fails to do the right thing:
o - No frames are marked as keyframes. avformat_seek_file returns -1. I
think I only have one file like this so we could say this is a rare case. I
just make sure I at least seek to the first frame. In order to keep
avformat_seek_file from failing, you have to mark the first frame as a key
frame and I do this. The one file I have like this is filecopy.avi and it
can be found here: https://ffmpeg.org/trac/ffmpeg/ticket/504
o - The ogg decoder read_seek function is weak. It does not make an attempt
to create it's index_entries and without these seeking is going to be bad.
This is outlined here: https://ffmpeg.org/trac/ffmpeg/ticket/941
o - The matroska decoder read_seek function has a couple bugs that effects
at least one file I have and that is outlined here:
https://ffmpeg.org/trac/ffmpeg/ticket/958
With the above changes, things work very well but there are a few odd cases
still. These cases don't effect things too much. Mostly just a lag after
seeking is done and before the next frame can be displayed. This happens
only on a few ogg files and matroska files that I know of. It could be
because of improper timestamps, improper index_entries, or even just a bad
file. Not sure.
I have a case with WMV2 where after seeking is done, audio is far behind.
This was easy for me to deal with and I have not investigated it further at
present.
I tested about 200 files of varing sizes, formats, etc and it works pretty
good when the above fixes are applied. For most file formats, I don't have
to do much and they just work.
More information about the ffmpeg-devel
mailing list