[Libav-user] Libavformat - Guranteed seeking before keyframe

ilkercan Kaya canilkerkaya at gmail.com
Sun Mar 7 16:10:41 EET 2021


Hi James,

Thank you for your help!

I tried your code and sadly the issue still persists. I am trying to seek
an ogg audio file. Maybe my code is faulty even though I debugged and the
first frame's timestamp is greater than my target ts.

On Sat, Mar 6, 2021 at 11:42 PM James Crisafulli <james2048 at gmail.com>
wrote:

>
> On Sat, 6 Mar 2021 at 00:52, ilkercan Kaya <canilkerkaya at gmail.com> wrote:
>
>> Hi Everyone,
>>
>> Anyone kindly wanting to help me on this matter? I am really stuck. In
>> case of my question being vague, I can reword it. Please let me know.
>>
>> Kind regards.
>>
>>
>> On Wed, Mar 3, 2021, 19:31 ilkercan Kaya <canilkerkaya at gmail.com> wrote:
>>
>>> In case this got lost, I'm kindly replying to this thread.
>>>
>>> On Sun, Feb 21, 2021, 04:20 ilkercan Kaya <canilkerkaya at gmail.com>
>>> wrote:
>>>
>>>> Hello Everyone,
>>>>
>>>> I am trying to seek my audio ogg file with the following:
>>>>
>>>> int64_t targetPts = av_rescale_q(seekTimeMicro, AV_TIME_BASE_Q, streamTimeBase);
>>>>
>>>> av_seek_frame(avFormatContext, streamInfoIndex, targetPts, AVSEEK_FLAG_BACKWARD);
>>>>
>>>>
>>>> This works all fine. Most of the time AVSEEK_FLAG_BACKWARD makes sure
>>>> that the stream is seeked to a time before targetPts. However, there are
>>>> times the opposite happens, seeking a time after targetPts. I can see this
>>>> with the first frame I request from avcodec_receive_frame() having pts
>>>> (avFrame->pts) greater than my targetPts. I need to ensure that the first
>>>> frame I receive is always smaller than my targetPts. (it's an overhead in
>>>> my system, long story).
>>>>
>>>> I read it that here
>>>> <https://stackoverflow.com/questions/20734814/ffmpeg-av-seek-frame-with-avseek-flag-any-causes-grey-screen>:
>>>> "It appears that, for some reason, av_seek_frame() using
>>>> AVSEEK_FLAG_BACKWARD returns the next keyframe when the frame that I am
>>>> seeking is the one directly before this keyframe. Otherwise it returns the
>>>> previous keyframe (which is what I want).". I suspect that this is the
>>>> case. However, this post is too old so it might be outdated.
>>>>
>>>> Could you help me?
>>>> Thank you!
>>>>
>>>>
>>>> _______________________________________________
>> 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".
>
>
>
> Hi Ilkercan,
>
> I wanted to share what I used to seek so that the timestamp will be behind
> the one you ask for.
> I used this to implement a video player where when you seek, the timestamp
> will be behind what you're looking for, then I can loop decode until the
> requested PTS precisely.
> Caveat: this worked for me for video, but may not work for you for audio.
> In my use case I discarded the audio packets.
> I used this API which is currently discouraged (not sure when it will be
> completed, it has been saying that comment since 2.8 or even before):
> https://github.com/FFmpeg/FFmpeg/blob/master/libavformat/avformat.h#L2362.
> I couldn't get the same results with av_seek_frame.
>
> The code:
>
> int64_t streamTimestamp = YOUR_STREAM_TIMESTAMP_TO_SEEK_TO;
> int flags = 0;
> // The idea is that we ask to get the low bound keyframe. This way we
> always get the keyframe before our desired one.
> // Set min_ts to 0, max to your ts, ts to your ts.
> int ret = avformat_seek_file(formatCtx, YOUR_STREAM_INDEX, 0,
> streamTimestamp, streamTimestamp, flags);
>
> Hope it is useful.
> - James
> _______________________________________________
> 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".
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://ffmpeg.org/pipermail/libav-user/attachments/20210307/97608171/attachment.html>


More information about the Libav-user mailing list