- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 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/
我对 libGDX 很陌生,并尝试使用 table layout 实现下图所示的布局 表格[绿色]的容器由表格标题[蓝色]和ScrollPane主体[黑色项目]组成。主体也是一个包含各种行的表格。 我
我是一名优秀的程序员,十分优秀!