内部时间戳:
AVRarional time_base = {1,1,AV_TIME_BASE};
int64_t timestamp = time/ time_base; //内部时间戳
int64_t time = timestamp * time_base;//实际时间(秒)
例子:
1:封装Packet的PTS,DTS;
</pre><pre name="code" class="cpp">AVRational time_base = ofmt_ctx->streams[0]->time_base;
AVRational r_framerate1 = { 60, 2 };
AVRational time_base_q = { 1, AV_TIME_BASE };
//内部时间戳
int64_t calc_duration = (double)(1/av_q2d(r_framerate1))*(AV_TIME_BASE);
// int64_t calc_duration = (double)(1/av_q2d(r_framerate1))/av_q2d(time_base_q);
//转换为以packet的time_base的pts,dts,duration:
enc_pkt.pts = av_rescale_q(framecnt*calc_duration, time_base_q, time_base);
enc_pkt.dts = enc_pkt.pts;
enc_pkt.duration = av_rescale_q(calc_duration, time_base_q, time_base);
2:判断PTS和当前时间间隔是否相等
pts时间还原为内部时间戳
int64_t pts_time = av_rescale_q(enc_pkt.dts, time_base, time_base_q);
int64_t now_time = av_gettime() - start_time;
if (pts_time > now_time)
av_usleep(pts_time - now_time);