Come faccio a impostare libavcodec da usare 4: 2: 2 chroma durante la codifica MPEG-2 4: 2 profilo: 2?

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

Domanda

Ho un progetto che utilizza libavcodec (ffmpeg). Lo sto usando per la codifica video MPEG-2 a 4: 2: 2, profilo, livello principale. Ho il PIX_FMT_YUV422P formato pixel selezionato nel AVCodecContext, tuttavia l'uscita video sto ottenendo ha tutti i colori sbagliato, e mi sembra l'encoder sta leggendo correttamente i buffer come se pensa che sia 4: 2: 0 croma piuttosto di 4: 2: 2. Qui è la mia messa a punto codec:

// 
// 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;
}

Una screengrab del fotogramma video risultante può essere visto a http: //ftp.limeboy. com / images / screen_grab.png (l'ingresso era barre di colore standard).

Ho controllato tramite emissione di cornici di debug in formato TGA in vari punti del processo, e posso confermare che è tutto bene e dandy fino al punto che libavcodec codifica il telaio.

Qualsiasi tipo di assistenza più apprezzato!

Saluti, Mike.

È stato utile?

Soluzione

OK, questo è imbarazzante.

In realtà, il modo in cui avevo impostato è corretto. Guardando attraverso il codice sorgente per ffmpeg, sembra che tutto quello che dovete fare per ottenerlo per codificare 4: 2: 2 profilo e 4: 2:. 2 croma è quello di impostare il formato di pixel in arrivo per PIX_FMT_YUV422P

La causa del problema? Stavo guardando il file video di nuovo su VLC in una macchina virtuale, che a un certo punto aveva cambiato la sua risoluzione video da 32 bit a 16 bit.

Questo è giusto! IT cambiato. Non ho cambiato - è fatto! DA SOLO, mi senti !!

Ci scusiamo se qualcuno sprecato il loro tempo a inseguire questo non-problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top