我正在使用 c 代码中的 FFMPEG API 对视频进行转码。我正在尝试使用 ffmpeg API 设置视频比特率,如下所示:
ovCodecCtx->bit_rate = 100 * 1000;
我使用的编码器是 libx264。
但是这个参数没有生效,结果视频质量很差。我什至尝试设置相关参数,如rc_min_rate、rc_max_rate等。但由于这些相关参数没有生效,视频质量仍然很低。
任何专家都可以告诉人们如何使用 FFMPEG API 正确设置比特率吗?谢谢
我找到了解决我的问题的方法。事实上,遇到同样问题的人已经在 ffmpeg(libav) 用户论坛上发布了解决方案。这似乎也适用于我的情况。我正在发布我自己问题的答案,以便其他面临类似问题的用户可能会从这篇文章中受益。
问题:
libx264 编解码器不支持以编程方式为 H264 视频编解码器设置视频比特率。尽管它适用于 MPEG1、2 和 MPEG4 视频编解码器,但 H264 视频编解码器无法识别此设置。由此产生的视频质量非常糟糕。
解决方案:
在将解码/调整大小的帧输入编码器之前,我们需要设置它们的 pts。找到解决方案的人已经通过 ffmpeg.c 源代码并能够解决这个问题。我们需要首先将 AVFrame 的 pts 从流的 time_base 重新缩放到编解码器 time_base 以获得一个简单的帧号(例如 1、2、3)。
pic->pts = av_rescale_q(pic->pts, ost->time_base, ovCodecCtx->time_base);
avcodec_encode_video2(ovCodecCtx, &newpkt, pic, &got_packet_ptr);
而当我们从 libx264 编解码器接收回编码包时,我们需要将编码视频包的 pts 和 dts 重新缩放到流时基
newpkt.pts = av_rescale_q(newpkt.pts, ovCodecCtx->time_base, ost->time_base);
newpkt.dts = av_rescale_q(newpkt.dts, ovCodecCtx->time_base, ost->time_base);
谢谢