2010-03-16 88 views
2

我有一個項目使用libavcodec(ffmpeg)。我正在使用它在4:2:2 Profile,Main Level上編碼MPEG-2視頻。我在AVCodecContext中選擇了像素格式PIX_FMT_YUV422P,但是我得到的視頻輸出具有所有顏色錯誤,並且在我看來像編碼器不正確地讀取緩衝區,就好像它認爲它是4:2:0色度比4:2:2。這是我的編解碼器設置:如何在編碼MPEG-2 4:2:2配置文件時將libavcodec設置爲使用4:2:2色度?

// 
// AVFormatContext* _avFormatContext previously defined as mpeg2video 
// 

// 
// Set up the video stream for output 
// 
AVVideoStream* _avVideoStream = av_new_stream(_avFormatContext, 0); 
if (!_avVideoStream) 
{ 
    err = ccErrWFFFmpegUnableToAllocateStream; 
    goto bail; 
} 
_avCodecContext = _avVideoStream->codec; 
_avCodecContext->codec_id = CODEC_ID_MPEG2VIDEO; 
_avCodecContext->codec_type = CODEC_TYPE_VIDEO; 

// 
// Set up required parameters 
// 
_avCodecContext->rc_max_rate = _avCodecContext->rc_min_rate = _avCodecContext->bit_rate = src->_avCodecContext->bit_rate; 
_avCodecContext->flags = CODEC_FLAG_INTERLACED_DCT; 
_avCodecContext->flags2 = CODEC_FLAG2_INTRA_VLC | CODEC_FLAG2_NON_LINEAR_QUANT; 
_avCodecContext->qmin = 1; 
_avCodecContext->qmax = 1; 
_avCodecContext->rc_buffer_size = _avCodecContext->rc_initial_buffer_occupancy = 2000000; 
_avCodecContext->rc_buffer_aggressivity = 0.25; 
_avCodecContext->profile = 0; 
_avCodecContext->level = 5; 
_avCodecContext->width = f->GetWidth(); // f is a private Frame class with width, height properties etc. 
_avCodecContext->height = f->GetHeight(); 
_avCodecContext->time_base.den = 25; 
_avCodecContext->time_base.num = 1; 
_avCodecContext->gop_size = 12; 
_avCodecContext->max_b_frames = 2; 
_avCodecContext->pix_fmt = PIX_FMT_YUV422P; 

if (_avFormatContext->oformat->flags & AVFMT_GLOBALHEADER) 
{ 
    _avCodecContext->flags |= CODEC_FLAG_GLOBAL_HEADER; 
} 

if (av_set_parameters(_avFormatContext, NULL) < 0) 
{ 
    err = ccErrWFFFmpegUnableToSetParameters; 
    goto bail; 
} 

// 
// Set up video codec for encoding 
// 
AVCodec* _avCodec = avcodec_find_encoder(_avCodecContext->codec_id); 
if (!_avCodec) 
{ 
    err = ccErrWFFFmpegUnableToFindCodecForOutput; 
    goto bail; 
} 
if (avcodec_open(_avCodecContext, _avCodec) < 0) 
{ 
    err = ccErrWFFFmpegUnableToOpenCodecForOutput; 
    goto bail; 
} 

所產生的視頻幀的screengrab可以在http://ftp.limeboy.com/images/screen_grab.png可以看出(輸入爲標準彩條)。

我已經通過在過程中的各個點向TGA格式輸出調試幀進行檢查,並且我可以確認它是否都很好,直到libavcodec編碼幀爲止。

任何幫助最受讚賞!

乾杯, Mike。

回答

4

好的,這很尷尬。

其實,我設置的方式是正確的。仔細查看ffmpeg的源代碼,看起來你需要做的就是編碼4:2:2配置文件和4:2:2色度,將輸入像素格式設置爲PIX_FMT_YUV422P。

問題的原因是什麼?我正在一個虛擬機上觀看VLC上的視頻文件,該文件在某個階段已將其視頻分辨率從32位更改爲16位。

沒錯! IT改變了它。我沒有改變它 - 它做到了!自己,你聽我說!

道歉,如果有人浪費他們的時間追逐這個非問題。