我有一个使用ffmpeg作为后端的C ++工作图像编码器。我正在摄取视频并将帧保存为jpeg,但是在调整输出jpeg的质量时遇到困难。
我尝试过的事情:
设置AVCodecContext
的{{1}}和global_quality
字段。
我也尝试过使用compression_level
的选项设置qscale
,但是在那也没有成功。
我知道这是可能的,因为通过命令行我可以
AVDictionary
并获得更高质量的图像。
答案 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
flags
和 global_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
...