Use AVSEEK_FLAG_BACKWARD <http://ffmpeg.org/doxygen/trunk/avformat_8h.html#ac736f8f4afc930ca1cda0b43638cc678> to seek to the closest *keyframe* having a smaller pts than the one you are seeking. You must then iterate through reading frames until you reach your desired position (if you are not seeking to a keyframe).
--michael On Wed, May 8, 2019 at 10:53 AM Mark McKay <[email protected]> wrote: > I'm trying to create a video player with the ability to seek whereever I > want. I'm having some trouble with av_seek_frame(), which seems to keep > returning the first keyframe after the timestamp I'm looking for: > > > int timestamp = av_rescale_q(timeMs, AV_TIME_BASE_Q, > > pFormatCtx->streams[videoStream]->time_base); > > int err = av_seek_frame(pFormatCtx, videoStream, timestamp, 0); > > Unfortunately, if it puts me at a position /after/ the frame where I'm > seeking, I have already passed the frame I want and can't scan forward to > find it. I've also tried seeking with AVSEEK_FLAG_ANY, but this it not > returning frames with valid data. I'm guessing that you need to jump to > the correct keyframe and then scan forward so that the frame buffers are > built correctly. > > I'm also considering scanning the entire video when I first load it to > build an index of packet information. AVSEEK_FLAG_BYTE looks like it > could be useful to jump directly to the packet I want - however, I don't > know where to find the byte value I would need to pass to the seek function. > > How can I scan to the frame that I want? > > Cheers, > Mark > > ---http://www.kitfox.com > > _______________________________________________ > Libav-user mailing list > [email protected] > https://ffmpeg.org/mailman/listinfo/libav-user > > To unsubscribe, visit link above, or email > [email protected] with subject "unsubscribe".
_______________________________________________ Libav-user mailing list [email protected] https://ffmpeg.org/mailman/listinfo/libav-user To unsubscribe, visit link above, or email [email protected] with subject "unsubscribe".
