[Libav-user] Libavformat - Guranteed seeking before keyframe
canilkerkaya at gmail.com
Sun Mar 7 16:10:41 EET 2021
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>
> 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>
>>>> 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
>>>> "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
>> 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):
> 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
> To unsubscribe, visit link above, or email
> libav-user-request at ffmpeg.org with subject "unsubscribe".
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Libav-user