어떻게 설정된 위해 libavcodec 사용하 4:2:2chroma 경우 인코딩한 MPEG-2 4:2:2 개의 프로필?

StackOverflow https://stackoverflow.com/questions/2453732

문제

내가 사용하여 프로젝트 위해 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.

그것은 바로!그것은 변경되었습니다.지 않았 변경-그것은 그것을 했다!자체,당신을 듣는다.

죄송하는 경우에 누군가가 그들의 시간을 낭비를 쫓는 이 아닌 문제입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top