es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Valores RGB correctos para AVFrame.

Tengo que llenar los datos AVFrame->data de ffmpeg desde los datos de píxeles de una superficie de cairo. Tengo este código:

/* Información de la imagen y datos de píxeles */
width  = cairo_image_surface_get_width( surface );
height = cairo_image_surface_get_height( surface );
stride = cairo_image_surface_get_stride( surface );
pix    = cairo_image_surface_get_data( surface );

for( row = 0; row < height; row++ )
{
    data = pix + row * stride;
    for( col = 0; col < width; col++ )
    {
        img->video_frame->data[0][row * img->video_frame->linesize[0] + col] = data[0];
        img->video_frame->data[1][row * img->video_frame->linesize[1] + col] = data[1];
        //img->video_frame->data[2][row * img->video_frame->linesize[2] + col] = data[2];
        data += 4;
    }
    img->video_frame->pts++;
}

Pero los colores en el video exportado son incorrectos. El corazón original es rojo. ¿Alguien puede indicarme en la dirección correcta? El ejemplo encode.c es inútil, desafortunadamente, y en Internet hay mucha confusión sobre Y, Cr y Cb, que realmente no entiendo. Por favor, no dude en pedir más detalles. Muchas gracias.

Imagen con valores RGB incorrectos

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está en la forma en que se asignan los canales de color a los datos de AVFrame. El código asume que los datos de píxeles están en formato RGB, pero es posible que la superficie de Cairo esté utilizando un formato de color diferente.

    Una posible solución es convertir los datos de píxeles de la superficie de Cairo al formato YUV que espera ffmpeg. Esto se puede hacer utilizando la biblioteca libswscale, que proporciona funciones para la conversión de espacios de color.

    Otra solución es utilizar la biblioteca libavfilter para hacer la conversión de espacios de color. El grafo del filtro debería tener un filtro “format” para especificar el formato de píxeles de entrada, seguido de un filtro “scale” para redimensionar el fotograma si es necesario, y finalmente un filtro “format” para especificar el formato de píxeles de salida (YUV).

    En cualquier caso, es importante entender los diferentes formatos de color y cómo se representan en ffmpeg. YUV es un formato común utilizado en la codificación de video, y separa la información de luminancia (Y) y color (U y V) en canales separados. RGB es otro formato común utilizado en gráficos por computadora, donde cada píxel se representa mediante canales de color rojo, verde y azul. El formato YUV es más eficiente para la codificación de video, ya que el ojo humano es más sensible a los cambios en el brillo (luminancia) que a los cambios en el color (crominancia).

Comments are closed.