使用ffmpeg API设置libx264编解码器的视频比特率被忽略了。

3

我正在使用FFMPEG API在C代码中转码视频。我正在尝试使用以下ffmpeg API设置视频比特率:

ovCodecCtx->bit_rate = 100 * 1000;

我正在使用的编码器是libx264。
但是这个参数没有起作用,导致生成的视频质量非常差。
我甚至尝试设置相关参数,如rc_min_rate,rc_max_rate等,但视频质量仍然很低,因为这些相关参数并没有起到作用。
请问有哪位专家可以告诉我如何使用FFMPEG API正确地设置比特率?
谢谢。

文档中 - "bit_rate: 由用户设置; 对于恒定量化编码未使用" - sashoalm
1
另外,你确定它没有生效吗?100 kbits 不是很多,你试过 1 mbit 吗?即 ovCodecCtx->bit_rate = 1000 * 1000; - sashoalm
2个回答

2
我已经找到了解决问题的方法。事实上,一个遇到同样问题的人在ffmpeg(libav)用户论坛中发布了解决方案。这个解决方案对我的情况也有效。我现在将答案发布在这里,以便其他遇到类似问题的用户受益。

问题:

通过编程方式为H264视频编解码器设置视频比特率并没有被libx264编解码器所支持。尽管它适用于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);

谢谢


0

在FFmpeg 5.1.2中,bit_rate未被H264编解码器识别的问题似乎已经得到解决。

今天我使用FFmpeg C API与ID为AV_CODEC_ID_H264的编码器一起工作时,只重新调整了要复用的数据包的时间字段,因为这是必要的,但没有重新调整解码图像的时间字段。我设置了bit_rate字段,编码器根据此工作。

如果不设置bit_rate,输出视频流的比特率为1406 kb/s,但在代码中将比特率设置为9851807后,ffplay显示的输出比特率变为5683 kb/s。虽然不完全是我设置的数字,但至少高得多。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接