كيف يمكنني ضبط يبافكوديك استخدام 4: 2: 2 صفاء عند ترميز MPEG-2 4: 2: 2 الشخصي؟

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

سؤال

ولدي مشروع باستخدام يبافكوديك (فمبيج). أنا استخدامه لتشفير 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. كوم / صور / screen_grab.png (وكان إدخال لون القضبان القياسية).

ولقد دققت عن طريق إخراج إطارات التصحيح إلى تنسيق TGA في نقاط مختلفة في هذه العملية، وأستطيع أن أؤكد أن كل ذلك هو خير والطراز الأول حتى النقطة التي تشفير يبافكوديك الإطار.

وأي مساعدة أكثر تقدير!

وابتهاج، مايك.

هل كانت مفيدة؟

المحلول

حسنا، هذا أمر محرج.

والواقع، والطريقة كان لي انشاء صحيحة. يبحث من خلال شفرة المصدر لفمبيج، يبدو أن كل ما عليك القيام به للحصول عليه لترميز 4: 2: 2 الشخصي و4: 2: 2 صفاء هو تعيين تنسيق بكسل الواردة إلى PIX_FMT_YUV422P

.

وسبب هذه المشكلة؟ كنت أشاهد الجزء الخلفي ملف فيديو على VLC في جهاز ظاهري، التي كانت في مرحلة ما غيرت دقة الفيديو في الفترة من 32 بت إلى 16 بت.

وهذا الحق! تغيرت IT ذلك. لم أكن تغييره - لم IT ذلك! في حد ذاته، تسمع ME !!

والاعتذار إذا كان أي شخص يضيع وقتهم مطاردة أسفل هذا غير مسألة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top