旧的方法是使用:int ret = avcodec_copy_context(out_stream->codec, in_stream->codec);
并注意设置这个out_stream->codec->time_base,num为1,den为帧率即可。
新的方法则使用:int ret = avcodec_parameters_from_context(out_stream->codecpar, ctx);
out_stream->time_base = in_stream->time_base;//stream tbn
out_stream->avg_frame_rate = in_stream->avg_frame_rate;//stream fps
out_stream->r_frame_rate = in_stream->r_frame_rate;//stream tbr
out_stream->codec->time_base = in_stream->codec->time_base;//stream tbc
out_stream->codecpar->codec_tag = 0;
接下来就是关键,将读出的帧pts\dts\duration进行转换:
pkt.pts = av_rescale_q_rnd(pkt.pts, in_stream->time_base, out_stream->time_base, (AVRounding)(AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX));
pkt.dts = av_rescale_q_rnd(pkt.dts, in_stream->time_base, out_stream->time_base, (AVRounding)(AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX));
pkt.duration = av_rescale_q(pkt.duration, in_stream->time_base, out_stream->time_base);
pkt.pos = -1;
要注意pkt.pts == AV_NOPTS_VALUE的情况,可以将in_stream->time_base替换成指定的时间基(通常可以用avg_frame_rate取反,实在找不到就用1:25好了)
pts\dts\duration转换正确后,再写帧,就不会再出现帧率超级高的情况了。