如何在 FFmpeg C API 中编码之前计算帧的正确 PTS 值?
对于编码,我使用函数avcodec_encode_video2
,然后用av_interleaved_write_frame
.
我找到了一些公式,但没有一个有效。
在doxygen 示例中,他们正在使用
frame->pts = 0;
for (;;) {
// encode & write frame
// ...
frame->pts += av_rescale_q(1, video_st->codec->time_base, video_st->time_base);
}
这个博客说公式必须是这样的:
(1 / FPS) * 采样率 * 帧数
有人只使用帧号来设置pts:
frame->pts = videoCodecCtx->frame_number;
或者另一种方式:
int64_t now = av_gettime();
frame->pts = av_rescale_q(now, (AVRational){1, 1000000}, videoCodecCtx->time_base);
最后一个:
// 40 * 90 means 40 ms and 90 because of the 90kHz by the standard for PTS-values.
frame->pts = encodedFrames * 40 * 90;
哪一个是正确的?我认为这个问题的答案不仅对我有帮助。