如何在C / C ++中设置ffmpeg qscale以进行图像编码

时间:2018-09-20 17:23:54

标签: c encoding ffmpeg

我有一个使用ffmpeg作为后端的C ++工作图像编码器。我正在摄取视频并将帧保存为jpeg,但是在调整输出jpeg的质量时遇到困难。
我尝试过的事情:
设置AVCodecContext的{​​{1}}和global_quality字段。
我也尝试过使用compression_level的选项设置qscale,但是在那也没有成功。

我知道这是可能的,因为通过命令行我可以
AVDictionary并获得更高质量的图像。

2 个答案:

答案 0 :(得分:1)

命令行-q选项有两件事

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

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

答案 1 :(得分:0)

当你使用诸如

之类的接口函数时
avcodec_decode_video2
avcodec_encode_video2
avcodec_send_frame
avcodec_receive_packet

flagsglobal_quality 不起作用。您应该在 ./libavcodec/mpegvideo_enc.c 中的 static int encode_picture(MpegEncContext *s, int picture_number) 处修改第 3814 行

    ...
    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
    ...