¿Cómo se configura para usar libavcodec 4: 2: 2 croma al codificar MPEG-2 4: Perfil 2: 2?

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

Pregunta

Tengo un proyecto usando libavcodec (ffmpeg). Lo estoy usando para codificar vídeo MPEG-2 a las 4: 2: 2 Perfil, Nivel Principal. Tengo la PIX_FMT_YUV422P formato de píxel seleccionado en el AVCodecContext, sin embargo, la salida de vídeo Estoy recibiendo tiene todos los colores mal, y me parece el codificador está leyendo incorrectamente los tampones como si se piensa que es 4: 2: 0 en lugar de croma de 4: 2: 2. Aquí está mi configuración de códec:

// 
// 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 de la trama de vídeo resultante puede ser visto en http: //ftp.limeboy. com / images / screen_grab.png (la entrada era de barras de color estándar).

He comprobado mediante la salida de los marcos de depuración a formato TGA en varios puntos en el proceso, y puedo confirmar que es todo lo fino y elegante hasta el punto de que libavcodec codifica la trama.

Cualquier ayuda muy apreciada!

Cheers, Mike.

¿Fue útil?

Solución

OK, esto es embarazoso.

En realidad, la forma en que lo tenía configurado es correcta. Mirando a través del código fuente de FFmpeg, parece que todo lo que tiene que hacer para conseguir que codifican 4: 2: 2 y el perfil 4: 2: 2. Croma es establecer el formato de píxel de entrada a PIX_FMT_YUV422P

La causa del problema? Yo estaba viendo el archivo de vídeo de nuevo en VLC en una máquina virtual, que en algún momento había cambiado su resolución de vídeo de 32 bits a 16 bits.

Eso es! Cambió ella. Yo no lo cambio - lo hizo! Por sí mismo, ¿me oyes !!

Las disculpas si alguien pierde su tiempo persiguiendo a este no sea un problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top