【发布时间】:2021-08-07 16:02:41
【问题描述】:
我正在构建一个库来记录 X11 窗口。为了保持稳定的帧速率,我测量帧之间的经过时间并根据需要等待。当编码过程比预期的帧速率快时它工作得很好,但如果编码较慢并且它无法跟上帧速率,就会发生奇怪的事情:录制的视频看起来“加速”了。
那是因为,10秒的时间跨度和60fps的帧率,应该有600帧,但是电脑太慢,只能录300帧,所以@987654321上应该出现的帧@ 最终出现在 t = x/2,因为我是根据帧数计算 PTS,而不是从开始经过的时间。
我最初使用以下方法计算时基:
int outputFrameRate = 60;
double outputFramePeriod = 1.0 / outputFrameRate * 1000;
AVRational timeBase = { 1, outputFrameRate };
然后我在AVCodecContext 实例中使用它:
pCodecCtx->time_base = timeBase;
然后,我有一个递增的 framecnt 计数器,用于计算每个输出帧的 pts,如下所示:
pOutputFrame->pts = av_rescale_q(framecnt, pCodecCtx->time_base, pVideoStream->time_base);
我现在有一个 elapsedTime 变量,其中包含从开始经过的时间(以毫秒为单位)。我将如何使用它来计算pts?
【问题讨论】:
标签: c encoding libav libavcodec multimedia