Encoding 如何将libavcodec设置为在编码MPEG-2 4:2:2配置文件时使用4:2:2色度?

Encoding 如何将libavcodec设置为在编码MPEG-2 4:2:2配置文件时使用4:2:2色度?,encoding,ffmpeg,libavcodec,mpeg-2,Encoding,Ffmpeg,Libavcodec,Mpeg 2,我有一个使用libavcodec(ffmpeg)的项目。我用它来编码MPEG-2视频在4:2:2配置文件,主要级别。我在AvcodeContext中选择了像素格式PIX_FMT_YUV422P,但是我得到的视频输出的所有颜色都错误,在我看来,编码器错误地读取缓冲区,好像它认为它是4:2:0色度,而不是4:2:2。以下是我的编解码器设置: // // AVFormatContext* _avFormatContext previously defined as mpeg2video // //

我有一个使用libavcodec(ffmpeg)的项目。我用它来编码MPEG-2视频在4:2:2配置文件,主要级别。我在AvcodeContext中选择了像素格式PIX_FMT_YUV422P,但是我得到的视频输出的所有颜色都错误,在我看来,编码器错误地读取缓冲区,好像它认为它是4:2:0色度,而不是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;
}
//
//AVFormatContext*\u先前定义为mpeg2video的AVFormatContext
//
//
//设置要输出的视频流
//
AVVideoStream*\u AVVideoStream=av\u new\u stream(\u avFormatContext,0);
如果(!\u avVideoStream)
{
err=ccerrwffmpegunabletoallocatestream;
去保释;
}
_avCodecContext=\u avVideoStream->codec;
_avCodecContext->codec_id=codec_id\u MPEG2VIDEO;
_avCodecContext->codec\u type=codec\u type\u视频;
//
//设置所需的参数
//
_avCodecContext->rc\u max\u rate=\u avCodecContext->rc\u min\u rate=\u avCodecContext->bit\u rate=src->\u avCodecContext->bit\u rate;
_avCodecContext->flags=CODEC\u FLAG\u interlated\u DCT;
_avCodecContext->flags2=CODEC_FLAG2_INTRA_VLC|CODEC_FLAG2_NON_LINEAR_QUANT;
_avCodecContext->qmin=1;
_avCodecContext->qmax=1;
_avCodecContext->rc\u buffer\u size=\u avCodecContext->rc\u initial\u buffer\u occulation=2000000;
_AvcodeContext->rc_缓冲区_攻击性=0.25;
_avCodecContext->profile=0;
_avCodecContext->level=5;
_avCodecContext->width=f->GetWidth();//f是一个私有框架类,具有宽度、高度等属性。
_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_头;
}
if(av_set_参数(_avFormatContext,NULL)<0)
{
err=ccerrwffmpegunabletosetparameters;
去保释;
}
//
//设置用于编码的视频编解码器
//
AVCodec*\u AVCodec=AVCodec\u find\u编码器(\u avCodecContext->codec\u id);
如果(!\u avCodec)
{
err=ccerrwffmpegunabletofindcodeforoutput;
去保释;
}
如果(avcodec\u打开(\u avCodecContext,\u avcodec)<0)
{
err=CCERRWFFMPEGUNABLE TOOPENCODECFOROUTPUT;
去保释;
}
结果视频帧的截图可在(输入为标准颜色条)处看到

在这个过程中,我通过将调试帧输出到TGA格式进行了检查,我可以确认在libavcodec对帧进行编码之前一切都很好

非常感谢您的帮助

干杯,
迈克。

好吧,这太尴尬了

事实上,我的设置方式是正确的。查看ffmpeg的源代码,要使其编码4:2:2配置文件和4:2:2色度,您需要做的就是将传入的像素格式设置为PIX_FMT_YUV422P

问题的原因是什么?我当时正在虚拟机上的VLC上观看视频文件,该虚拟机在某个阶段将其视频分辨率从32位更改为16位

没错!它改变了它。我没有改变,是它改变了!就凭它自己,你听到了


如果有人浪费时间追查这个非问题,我深表歉意。

我以为这只是用红气球追查而已。但这更糟。。。更糟的是……;)