如何在C/C++;用于图像编码 我有一个C++的工作图像编码器,使用FFMPEG作为后端。我正在拍摄视频并将帧保存为jpeg格式,但我很难调整输出jpeg格式的质量。 我尝试过的事情: 设置AVCodecContext的全局质量和压缩级别字段。 我也尝试过使用AVDictionary的选项设置qscale,但也没有成功

如何在C/C++;用于图像编码 我有一个C++的工作图像编码器,使用FFMPEG作为后端。我正在拍摄视频并将帧保存为jpeg格式,但我很难调整输出jpeg格式的质量。 我尝试过的事情: 设置AVCodecContext的全局质量和压缩级别字段。 我也尝试过使用AVDictionary的选项设置qscale,但也没有成功,c,encoding,ffmpeg,C,Encoding,Ffmpeg,我知道这是可能的,因为使用命令行我可以 ffmpeg-i输入-q:v2输出\u帧%02d.jpg并获得更高质量的图像。命令行-q选项影响两件事 enc_ctx->flags |= AV_CODEC_FLAG_QSCALE; enc_ctx->global_quality = FF_QP2LAMBDA * qscale; 其中,enc_ctx是输出流的AVCodecContext,FF_QP2LAMBDA是118 avcodec_decode_video2 avcod

我知道这是可能的,因为使用命令行我可以

ffmpeg-i输入-q:v2输出\u帧%02d.jpg
并获得更高质量的图像。

命令行
-q
选项影响两件事

    enc_ctx->flags |= AV_CODEC_FLAG_QSCALE;
    enc_ctx->global_quality = FF_QP2LAMBDA * qscale;

其中,enc_ctx是输出流的AVCodecContext,FF_QP2LAMBDA是118

avcodec_decode_video2
avcodec_encode_video2
avcodec_send_frame
avcodec_receive_packet
标志
全局质量
不起作用。您应该在./libavcodec/mpegvideo\u enc.c中的静态整数编码图片(mpegencontext*s,整数图片\u编号)处修改第3814行:

。。。
如果(估计值_qp(s,0)<0)
返回-1;
s->qscale=5//在此处修改qscale
如果(s->qscale<3&&s->max\u qcoeff pict\u type==AV\u PICTURE\u type\u I&&
!(s->avctx->标志和AV编解码器标志)
s->qscale=3//减少剪辑问题
...

C和C++是两个不同的东西。你想要C++解决方案还是想要C解决方案?FFMPEG是C库,所以我不相信会有C++解决方案,只有C,对吗?我只需要知道如何让FFMPEG来执行。如果你使用C++,你可以无缝地与C代码进行接口。如果你只使用C,那么C++解决方案就不相关了。C库也用于其他应用程序中,但我们不会把Python/C或Node.js/C当作一件事来谈论,先生,你就是山羊。我一直在寻找这个太久了。看看ffmpeg的源代码,这似乎不会影响mpegvideo编码器。你知道全球质量是如何设定的吗?我还尝试在编码器上下文的priv_数据上设置qscale,但似乎也没有帮助。我终于找到了答案。必须将AVFrame的质量设置为与编码器上下文的全局质量相同。它在ffmpeg.c中,但我只使用了libav*的东西。
    ...
    if (estimate_qp(s, 0) < 0)
        return -1;
    s->qscale = 5; //modify qscale here
    if (s->qscale < 3 && s->max_qcoeff <= 128 &&
        s->pict_type == AV_PICTURE_TYPE_I &&
        !(s->avctx->flags & AV_CODEC_FLAG_QSCALE))
        s->qscale= 3; //reduce clipping problems
    ...