gpt4 book ai didi

api - 使用 ffmpeg API : bigger filesize than ffmpeg. exe 进行 MPEG-2 视频编码

转载 作者:行者123 更新时间:2023-12-04 23:01:01 26 4
gpt4 key购买 nike

我正在尝试使用 ffmpeg API 将视频从原始 YUV 编码为 MPEG-2。

我的问题是 API 生成的文件大约是。比 ffmpeg 本身生成的等效文件大 1.7 倍。

我使用量化参数(通过 qminqmax )而不是比特率。

API版本基本上是:

//...
pCodecCtx->pix_fmt = PIX_FMT_YUV420P;
pCodecCtx->qmin = 3;
pCodecCtx->qmax = 3;
pCodecCtx->time_base.num = 1;
pCodecCtx->time_base.den = 30;
avcodec_open(pCodecCtx, avcodec_find_encoder(CODEC_ID_MPEG2VIDEO));
//...
while(/*...*/) {
avcodec_encode_video(pCodecCtx, pOutbuf, outbufSize, pPicture);
//..
}
//...

对于 ffmpeg 本身,我使用以下命令:
ffmpeg -s 352x288 -r 30 -i foreman_352x288.yuv -f mpeg2video -vcodec mpeg2video -r 30 -pix_fmt yuv420p -qmin 3 -qmax 3 foreman.m2v

为什么API-generate文件达到5212 kb/s的比特率和ffmpeg生成的文件相同 qp比特率 3047 kb/s??

(更令人费解的是,较小的 ffmpeg 版本的 PSNR 略高,40.49 dB 对 40.02 dB)。

还有其他我错过的相关参数吗? ffmpeg 是否真的尊重量化参数?

最佳答案

使用ffmpeg API时,需要为每一帧手动设置图片类型(I帧、P帧等)。默认情况下,ffmpeg 将使每一帧都成为 I 帧。

解决方法是在编码一帧之前设置图片类型(这里为GOP大小为12):

//...
while(/*...*/) {
if(pCodecCtx->frame_number % 12)
pPicture->pict_type = AV_PICTURE_TYPE_P;

avcodec_encode_video(pCodecCtx, pOutbuf, outbufSize, pPicture);
//...
}
//...

注意设置 pCodecCtx->gop_size在编码之前没有帮助。

关于api - 使用 ffmpeg API : bigger filesize than ffmpeg. exe 进行 MPEG-2 视频编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6138376/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com