如何解决使用ffmpeg API的MPEG-2视频编码:文件大小大于ffmpeg.exe
| 我正在尝试使用ffmpeg API将视频从原始YUV编码为MPEG-2。 我的问题是,API生成的文件约为。比ffmpeg本身生成的等效文件大1.7倍。 我使用量化参数(通过qmin
和ѭ1instead)而不是比特率。
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生成的文件的比特率达到5212 kb / s,而ffmpeg生成的文件却以相同的“ 4”达到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
无济于事。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。