어떻게 설정된 위해 libavcodec 사용하 4:2:2chroma 경우 인코딩한 MPEG-2 4:2:2 개의 프로필?
-
20-09-2019 - |
문제
내가 사용하여 프로젝트 위해 libavcodec(ffmpeg).나는 그것을 사용하여 인코딩한 MPEG-2 비디오에서 4:2:2 개의 프로필을 기본 수준입니다.가 픽셀 형식 PIX_FMT_YUV422P 에서 선택 AVCodecContext,그러나 비디오 출력을 나는 모든 색상이 잘못처럼 내게 보이는 인코더가 잘못 읽 버퍼처럼 생각을 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;
}
A screengrab 의 결과로 영상 프레임에 볼 수 있는 http://ftp.limeboy.com/images/screen_grab.png (입력 표준 색 바).
내가에 의해 확인 출력 디버깅하는 프레임 TGA 형식으로 다양한 지점에서 과정에서,그리고 나가는 것을 확인할 수 있습니다 그것은 멋까지 포인트는 위해 libavcodec 인코딩합니다.
모든 도움이 대부분의 평가를 받고 있습니다!
환호 마이크.
해결책
OK,이것은 당황합니다.
사실 나는 그것을 설정이 올바른 것입니다.을 통해 보고의 소스 코드 ffmpeg,그것은 당신이해야 할 모든 당신을 그것을 얻을 인코딩 4:2:2 개의 프로필 4:2:2 크로마을 설정하는 것입니다 들어오는 픽셀 형식으로 PIX_FMT_YUV422P.
문제의 원인?고의 비디오 파일에 다시 VLC 가상 컴퓨터에서는 어떤 단계에서 변경했다 그것의 비디오 해상도에서 32-bit to16-bit.
그것은 바로!그것은 변경되었습니다.지 않았 변경-그것은 그것을 했다!자체,당신을 듣는다.
죄송하는 경우에 누군가가 그들의 시간을 낭비를 쫓는 이 아닌 문제입니다.