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".

Reply via email to