我用libavccodec(FFMPEG)的项目。我用它来在4编码的MPEG-2视频:2: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;
}

所产生的视频帧的screengrab可以在 HTTP可以看出://ftp.limeboy。 COM /图像/ screen_grab.png (输入为标准色条)。

我已经在这个过程中在不同点处输出调试帧TGA格式检查,并且我可以证实,它是所有非常愉快直到这libavcodec的编码帧中的点。

任何援助最理解!

干杯, 麦克

有帮助吗?

解决方案

行,这是令人尴尬的。

其实,我有它设置的方式是正确的。通过为FFMPEG源代码寻找,似乎所有你必须做的就是它以编码的4:2:2简档和4:2:2色度是将输入的像素格式设置为PIX_FMT_YUV422P

该问题的原因是什么?我在看视频文件回到VLC的虚拟机,这在某个阶段已经改变了它的视频分辨率从32位到16位。

这是正确的! IT改变了它。我没有改变它 - 它做到了!就其本身而言,会听到ME !!

道歉,如果任何人浪费了他们的时间追逐这个不是问题的问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top