2011-05-26 103 views
1

我試圖使用ffmpeg API將原始YUV視頻編碼爲MPEG-2。使用ffmpeg API的MPEG-2視頻編碼:比ffmpeg.exe更大的文件大小

我的問題是API - 生成的文件大約是。比由ffmpeg本身產生的等效文件大1.7倍。

我使用量化參數(通過qminqmax)而不是比特率。

API -version基本上是:

//... 
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的比特率? (更令人費解的是,較小的版本具有稍高的PSNR,40.49dB與40.02dB)。

是否還有其他相關參數我錯過了? ffmpeg實際上是否尊重量化參數?

回答

1

當使用ffmpeg API時,需要爲每個幀手動設置圖片類型(I幀,P幀等)。默認情況下,ffmpeg會使每一幀都成爲一個I幀。

的解決方案是(這裏爲12的GOP大小)編碼幀之前設置的畫面類型:

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

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

注意,在編碼之前設置pCodecCtx->gop_size沒有幫助。