All,

I'm sure this has been asked many times before, but nonetheless i
couldn't find an answer to my problem.

In my app I have a need to calculate the PTS corresponding to the
frame closest to a particular time. For example, I might need to grab
the frame from a video that equates to 52.731 seconds into the stream.
I thought I had this working (I'd previously built against an svn from
about march 2009), but another part of my app have me cause to update
to the latest SVN and this seems to have changed things.

Basically, I need to understand how the time_base in the stream and
the codec context can be used, along with the stream start_time, to
calculate pts.

Previously, my logic was roughly like this:-

Firstly, my MPEG2 source video (which is a nominal 25fps) has a
time_base in codec context of 1/50, but has ticks_per_frame of 2. My
logic up to now has been to combine these two into a single rational:-

AVRational frame_rate = m_pVideoCodecContext->time_base;
frame_rate.num *= m_pVideoCodecContext->ticks_per_frame;

then i can use that frame_rate to calculate the frame number:-

float frameTime = 52.731;
int64_t frame = (int64_t)((frameTime * 1000) * frame_rate.den / (1000
* frame_rate.num));

then, combining frame_rate and the stram time_base to get the pts:-

int64_t pts =  m_pVideoStream->start_time + (frame * ((frame_rate.num
* m_pVideoStream->time_base.den) / (frame_rate.den *
m_pVideoStream->time_base.num)));

As I said, this previously working fine (at least with all the videos
I tried it with (various MPEG2 and h264 MP4). However, since I updated
to newer ffmpeg something has changed and the logic no longer works.

My MP4 file under the new version of ffmpeg comes out as having a
codec context timebase of 1001/50000 and ticks per frame of 2. The
stream time_base is 1/3000. Following through the math, the results I
get don't correspond to actual pts that are in the stream. I can see
in the debugger that the PTS for this video increments in steps of
1200, whereas before it incremented in steps of 1.

I'm definitely missing a link somewhere. Somehow I need to know what
the increment is in PTS between frames, which for this MP4 seems to be
1200. There must be some other AVRational value which relates the PTS
time_base with the increment. What is that rational?

Thanks in advance for any guidance

Jon
_______________________________________________
libav-user mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/libav-user

Reply via email to