我正在使用FFMPEG API在C代码中转码视频。我正在尝试使用以下ffmpeg API设置视频比特率:
ovCodecCtx->bit_rate = 100 * 1000;
我正在使用的编码器是libx264。
但是这个参数没有起作用,导致生成的视频质量非常差。
我甚至尝试设置相关参数,如rc_min_rate,rc_max_rate等,但视频质量仍然很低,因为这些相关参数并没有起到作用。
请问有哪位专家可以告诉我如何使用FFMPEG API正确地设置比特率?
谢谢。
问题:
通过编程方式为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);
谢谢
在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。虽然不完全是我设置的数字,但至少高得多。
ovCodecCtx->bit_rate = 1000 * 1000;
。 - sashoalm