首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >libx264编解码器忽略通过ffmpeg API设置视频码率

libx264编解码器忽略通过ffmpeg API设置视频码率
EN

Stack Overflow用户
提问于 2012-07-13 15:41:22
回答 1查看 3.2K关注 0票数 3

我正在使用c代码的FFMPEG API对视频进行转码。我正在尝试使用ffmpeg API设置视频比特率,如下所示:

代码语言:javascript
复制
ovCodecCtx->bit_rate = 100 * 1000;

我使用的编码器是libx264。

但是这个参数没有生效,结果视频质量很差。我甚至尝试过设置相关参数,如rc_min_rate、rc_max_rate等。但是视频质量仍然很低,因为这些相关参数没有生效。

有专家能告诉我们如何使用FFMPEG API正确设置比特率吗?谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-07 19:52:15

我已经找到了我的问题的解决方案。事实上,一些面临同样问题的人已经在ffmpeg(libav)用户论坛上发布了解决方案。这似乎也适用于我的情况。我发布了我自己问题的答案,以便其他面临类似问题的用户可以从这篇文章中受益。

问题:

libx264编解码器不支持以编程方式设置H264视频编解码器的视频比特率。尽管它适用于MPEG1、2和MPEG4视频编解码器,但H264视频编解码器无法识别此设置。由此产生的视频质量非常差。

解决方案:

我们需要为解码/调整大小的帧设置pts,然后才能将它们提供给编码器。找到解决方案的人已经通过ffmpeg.c源代码找到了答案。我们首先需要将AVFrame的pt从流的time_base重新缩放到编解码器time_base,以获得一个简单的帧号(例如1,2,3)。

代码语言:javascript
复制
pic->pts = av_rescale_q(pic->pts, ost->time_base, ovCodecCtx->time_base);

avcodec_encode_video2(ovCodecCtx, &newpkt, pic, &got_packet_ptr);

并且当我们从libx264编解码器接收回编码分组时,我们需要将编码视频分组的pt和dts重新定标到流时基

代码语言:javascript
复制
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);

谢谢

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11466184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档