Oblicz PTS przed kodowaniem klatek w FFmpeg

Jak obliczyć poprawną wartość PTS dla ramki przed kodowaniem w interfejsie API FFmpeg C?

Do kodowania używam funkcjiavcodec_encode_video2 a następnie zapisz go przezav_interleaved_write_frame.

Znalazłem kilka formuł, ale nikt z nich nie działa.

Wprzykład doxygen oni używają

frame->pts = 0;
for (;;) {
    // encode & write frame
    // ...
    frame->pts += av_rescale_q(1, video_st->codec->time_base, video_st->time_base);
}

Ten blog mówi, że formuła musi być taka:

(1 / FPS) * częstotliwość próbkowania * numer ramki

Ktoś używa tylko numeru ramki do ustawiania punktów:

frame->pts = videoCodecCtx->frame_number;

Lub alternatywny sposób:

int64_t now = av_gettime();
frame->pts = av_rescale_q(now, (AVRational){1, 1000000}, videoCodecCtx->time_base);

I ostatni:

// 40 * 90 means 40 ms and 90 because of the 90kHz by the standard for PTS-values. 
frame->pts = encodedFrames * 40 * 90;

Który jest prawidłowy? Myślę, że odpowiedź na to pytanie będzie pomocna nie tylko dla mnie.

questionAnswers(2)

yourAnswerToTheQuestion