Super User Asked by Link-akro on January 4, 2021
What i seem to understand about PTS (Presentation Time Stamp) is that it is always coded in integer units of a time_base which is a fraction of time in seconds.
We have the relationship time=PTS*time_base
.
In contrast we have the frame index, usually noted "N" or "POS" in filter expression variables.
When we assume a constant frame rate, we usually exploit the relationship N=time*frame_rate=PTS*time_base*frame_rate
.
This is what we observe pretty much everywhere in ffmpeg, and especially in output of FFPROBE and showinfo filter, and the variables of setpts filter. All of the aforementionned modules make the clear distinction and naming between time,pts,n,position,frame_rate,time_base.
Well i admit that the drawtext filter prints the time when we access the "pts" function but i think it is an exceptional bad name.
Then i try a command like the following to extract all frames and try to identify them with frame PTS in the filename output of image2 muxer to compare them with the output of FFPROBE easily. SS skips the first second so we may confirm that it is not an index from zero, copyts keeps the source time stamps and vsync=0 guarantees that we output the frames exactly at the time of the source frames without losing or duplicating any.
ffmpeg -ss 1 -copyts -i input.mp4 -vsync 0 -f image2 -frame_pts 1 output_%05d.jpg
When i use this command upon a file with frame_rate 25 fps, time_base 1/12800 second, and skip the first second like above, the first file is "output_025.jpg" while ffprobe shows that time 1 second is 12800 PTS.
It confirms that PTS=N/frame_rate/time_base=25/25*12800=12800
. Same calculus for any probed frame, just different set of PTS, time and position/index.
We should expect -FRAME_PTS
to produce a PTS but we instead get the frame index in the filename.
This is also explicitly written in the documentations.
frame_pts If set to 1, expand the filename with pts from pkt->pts. Default value is 0.
int64_t pts Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will be presented to the user.
Why is image2 muxer’s -frame_pts
incoherent like this ? Is it, that it is badly named, or is it, that the behaviour is incorrect ? Am I misunderstanding something ?
Is there a trick to get the PTS anyway in filename ? I do not need help to use an external tool to parse and rename the output but I would rather a much simpler method.
So far i only found this workaround by Gyan and another confused answer.
Gyan https://superuser.com/a/1421195/549957
SuperNoobieAU4000 https://superuser.com/a/1479491/549957
With Gyan answer linked above my trouble is
-r
option does not contradict -vsync 0
in a breaking way even though the documentation pretty much reads the opposite of each other, with -r one enabling to duplicate/remove frames and vsync 0 other disabling it
The image2 muxer, by default, will set the time base of the output stream to be the inverse of the output frame rate. This is why I set -r 1000
with -vsync 0
, to get an index equivalent to the milliseconds' value.
To keep the input stream time base, add -enc_time_base -1
as an output option.
Correct answer by Gyan on January 4, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP