FFMpeg57使用新API转码导致帧率超高的问题解决方法

旧的方法是使用: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转换正确后,再写帧,就不会再出现帧率超级高的情况了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值