gpt4 book ai didi

c - 对于 libx264 编解码器,忽略通过 ffmpeg API 设置视频比特率

转载 作者:太空宇宙 更新时间:2023-11-04 00:08:54 24 4
gpt4 key购买 nike

我正在使用 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);

谢谢

关于c - 对于 libx264 编解码器,忽略通过 ffmpeg API 设置视频比特率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11466184/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com