Reproduciendo videos

Godot admite la reproducción de video con el nodo VideoPlayer.

Formatos de reproducción admitidos

El único formato admitido en el núcleo es Ogg Theora (no debe confundirse con el audio Ogg Vorbis). Es posible que las extensiones brinden soporte para formatos adicionales, pero hasta julio de 2022 no existen extensiones de este tipo.

H.264 y H.265 no pueden ser admitidos en el núcleo de Godot, ya que ambos están afectados por patentes de software. AV1 es libre de regalías, pero aún es lento para decodificar en la CPU y el soporte de decodificación de hardware no está ampliamente disponible en todas las GPU que se utilizan actualmente.

WebM es compatible en el núcleo de Godot en la versión 3.x, pero el soporte para él será eliminado en la versión 4.0, ya que ha demostrado ser demasiado problemático y difícil de mantener. Por lo tanto, no se recomienda usar WebM.

Nota

Puedes encontrar videos con extensiones .ogg o .ogx, que son extensiones genéricas para datos dentro de un contenedor Ogg.

Renombrar estas extensiones de archivo a .ogv puede permitir la importación de los videos en Godot. Sin embargo, no todos los archivos con extensiones .ogg o .ogx son videos, algunos de ellos pueden contener solo audio.

Configurando el VideoPlayer (reproductor de video)

  1. Crea un nodo VideoPlayer utilizando el diálogo "Crear Nuevo Nodo".

  2. Selecciona el nodo VideoPlayer en el panel del árbol de escenas, ve al inspector y carga un archivo .ogv en la propiedad Stream.

  3. Si deseas que el video se reproduzca tan pronto como se cargue la escena, marca la casilla Autoplay en el inspector. Si no, deja desactivada la opción Autoplay y llama a play() en el nodo VideoPlayer desde un script para iniciar la reproducción cuando lo desees.

Manejo de redimensionamiento y relaciones de aspecto diferentes

De forma predeterminada en Godot 4.0, el VideoPlayer se redimensionará automáticamente para que coincida con la resolución del video. Puedes hacer que siga las dimensiones habituales de Control activando la opción Expand en el nodo VideoPlayer.

Para ajustar cómo se redimensiona el nodo VideoPlayer según el tamaño de la ventana, ajusta los anclajes utilizando el menú Layout en la parte superior del viewport del editor 2D. Sin embargo, esta configuración puede no ser suficientemente potente para manejar todos los casos de uso, como reproducir videos en pantalla completa sin distorsionar el video (pero con espacio vacío en los bordes en su lugar). Para obtener un mayor control, puedes utilizar un nodo AspectRatioContainer, que está diseñado para manejar este tipo de casos de uso:

Agrega un nodo AspectRatioContainer. Asegúrate de que no sea un hijo de ningún otro nodo contenedor. Selecciona el nodo AspectRatioContainer y luego establece su opción Layout en la parte superior del editor 2D en Full Rect. Establece el valor de Ratio en el nodo AspectRatioContainer para que coincida con la relación de aspecto de tu video. Puedes utilizar fórmulas matemáticas en el inspector para ayudarte. Recuerda convertir uno de los operandos en un número decimal (float). De lo contrario, el resultado de la división siempre será un número entero.

La propiedad Ratio del nodo AspectRatioContainer se puede modificar en el inspector del editor

Esto se evaluará como (aproximadamente) 1.777778

Una vez que hayas configurado el AspectRatioContainer, cambia el padre de tu nodo VideoPlayer para que sea hijo del nodo AspectRatioContainer. Asegúrate de que la opción Expand esté desactivada en el VideoPlayer. Ahora tu video se debería escalar automáticamente para ajustarse a toda la pantalla sin distorsión.

Ver también

Consulta Múltiples resoluciones para obtener más consejos sobre cómo admitir múltiples relaciones de aspecto en tu proyecto.

Monstrando un video en una superficie 3D

Usando un nodo VideoPlayer como hijo de un nodo Viewport, es posible mostrar cualquier nodo 2D en una superficie 3D. Por ejemplo, esto se puede utilizar para mostrar carteles animados cuando la animación fotograma a fotograma requeriría demasiada memoria.

Esto se puede hacerse siguiendo los pasos:

  1. Crea un nodo Viewport. Establece su tamaño para que coincida con el tamaño de tu video en píxeles.

  2. Crea un nodo VideoPlayer como hijo del nodo Viewport y especifica una ruta de video en él. Asegúrate de que Expand esté desactivado y habilita Autoplay si es necesario.

  3. Crea un nodo MeshInstance con un recurso de PlaneMesh o QuadMesh en su propiedad Mesh. Ajusta el tamaño de la malla para que coincida con la relación de aspecto del video (de lo contrario, aparecerá distorsionado).

  4. Crea un nuevo recurso SpatialMaterial en la propiedad Material Override en la sección de GeometryInstance.

  5. Activa la opción Local To Scene en la sección de recursos de SpatialMaterial (en la parte inferior). Esto es necesario antes de poder usar un ViewportTexture en su propiedad Albedo Texture.

  6. En el SpatialMaterial, establece la propiedad Albedo > Texture en New ViewportTexture. Edita el nuevo recurso haciendo clic en él, luego especifica la ruta al nodo Viewport en la propiedad Viewport Path.

  7. Activa la opción Albedo Tex Force sRGB en el SpatialMaterial para evitar que los colores se desvanezcan.

  8. Si se supone que el cartel debe emitir su propia luz, activa la opción Flags > Unshaded para mejorar el rendimiento de renderizado.

Consulta Usando Viewports y el demo de GUI en 3D para obtener más información sobre cómo configurar esto.

Limitaciones de reproducción

La actual implementación de la reproducción de vídeo en Godot presenta varias limitaciones:

  • No se admite buscar (hacer un salto) en un video hasta un punto específico.

  • No se admite cambiar la velocidad de reproducción. El VideoPlayer tampoco seguirá Engine.time_scale.

  • No se admite la repetición en bucle (looping), pero puedes conectar la señal finished del VideoPlayer a una función que reproduzca el video nuevamente. Sin embargo, esto causará que se vea un fotograma en negro cuando el video se reinicie. Esto se puede solucionar agregando un fundido a negro en el archivo de video antes de que finalice, o ocultando el video durante un fotograma y mostrando un TextureRect con una captura de pantalla del primer fotograma del video hasta que se reinicie el video.

  • No se admite la transmisión de un video desde una URL.