[Libav-user] How to seek to a given frame?

Mark McKay mark at kitfox.com
Thu May 9 20:16:39 EEST 2019


 How am I supposed to know if I need to seek backwards then?  Can I read 
 the current timestamp the stream is at somewhere?

 Mark


 On Thu, 9 May 2019 09:00:13 -0400, Philippe Gorley 
 <philippe.gorley at savoirfairelinux.com> wrote:
> On 2019-05-08 10:27 p.m., Mark McKay wrote:
>> The docs in the header file say that the AVSEEK_FLAG_BACKWARD is 
>> ignored, and the tests I've run seem to work even when I leave it out.
>
> AVSEEK_FLAG_BACKWARD is ignored in avformat_seek_file, not in 
> av_seek_frame.
>
>> Mark
>>
>> 
>> ------------------------------------------------------------------------
>> *Subject:* Re: [Libav-user] How to seek to a given frame?
>> *Date:* Wed, 8 May 2019 13:20:17 -0700
>> *From:* Michael Armes <michael.armes at gmail.com>
>> *To:* "This list is about using libavcodec, libavformat, libavutil, 
>> libavdevice and libavfilter." <libav-user at ffmpeg.org>
>> *Reply-To:* "This list is about using libavcodec, libavformat, 
>> libavutil, libavdevice and libavfilter." <libav-user at ffmpeg.org>
>> 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 <mark at kitfox.com 
>> <mailto:mark at kitfox.com>> 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
>>     Libav-user at ffmpeg.org <mailto:Libav-user at ffmpeg.org>
>>     https://ffmpeg.org/mailman/listinfo/libav-user
>> To unsubscribe, visit link above, or email
>>     libav-user-request at ffmpeg.org 
>> <mailto:libav-user-request at ffmpeg.org>
>>     with subject "unsubscribe".
>> ---
>> http://www.kitfox.com
>>
>> _______________________________________________
>> Libav-user mailing list
>> Libav-user at ffmpeg.org
>> https://ffmpeg.org/mailman/listinfo/libav-user
>> To unsubscribe, visit link above, or email
>> libav-user-request at ffmpeg.org with subject "unsubscribe".
>>

 ---
 http://www.kitfox.com


More information about the Libav-user mailing list