gpt4 book ai didi

encoding - 如何设置 libavcodec 以使用 4 :2:2 chroma when encoding MPEG-2 4:2:2 profile?

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

我有一个使用 libavcodec (ffmpeg) 的项目。我正在使用它以 4:2:2 配置文件、主级别对 MPEG-2 视频进行编码。我在 AVCodecContext 中选择了像素格式 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;
}

可以在 http://ftp.limeboy.com/images/screen_grab.png 查看生成的视频帧的屏幕截图(输入是标准彩条)。

我已经通过在过程中的不同点将调试帧输出为 TGA 格式进行了检查,我可以确认在 libavcodec 对帧进行编码之前一切正常。

非常感谢任何帮助!

干杯,迈克。

最佳答案

好吧,这很尴尬。

实际上,我设置它的方式是正确的。查看 ffmpeg 的源代码,似乎要让它编码 4:2:2 配置文件和 4:2:2 色度,您只需将传入像素格式设置为 PIX_FMT_YUV422P。

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

没错!它改变了它。我没有改变它 - 它做到了!靠自己,你能听到我!!

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

关于encoding - 如何设置 libavcodec 以使用 4 :2:2 chroma when encoding MPEG-2 4:2:2 profile?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2453732/

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