Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
Reproduzindo videos
O Godot oferece suporte à reprodução de vídeo por meio do nó VideoStreamPlayer.
Formatos de reprodução suportados
O único formato suportado nativamente é Ogg Theora (não deve ser confundido com o áudio Ogg Vorbis), com faixas opcionais de áudio Ogg Vorbis. Extensões podem adicionar suporte a formatos adicionais.
H.264 e H.265 não podem ser suportados no núcleo do Godot, pois ambos estão protegidos por patentes de software. O AV1 é isento de royalties, mas permanece lento para decodificar na CPU e o suporte de decodificação de hardware ainda não está disponível em todas as GPUs em uso.
O WebM era suportado nativamente no Godot 3.x, mas o suporte foi removido na versão 4.0 por ser muito instável e difícil de manter.
Nota
Você pode encontrar vídeos com as extensões .ogg ou .ogx, que são extensões genéricas para dados armazenados em um contêiner Ogg.
Renomear essas extensões de arquivo para .ogv talvez possa permitir que os vídeos sejam importados no Godot. No entanto, nem todos os arquivos com extensões .ogg ou .ogx são vídeos - alguns deles podem conter apenas áudio.
Configurando o VideoStreamPlayer
Crie um nó VideoStreamPlayer utilizando a janela Create New Node.
Selecione o nó VideoStreamPlayer na árvore da cena, vá até o Inspetor e carregue um arquivo
.ogvna propriedade Stream.Se você ainda não tem seu vídeo no formato Ogg Theora, vá para Configurações recomendadas de codificação Theora.
Se desejar que o vídeo seja reproduzido assim que a cena for carregada, marque Autoplay no Inspetor. Caso contrário, deixe Autoplay desabilitado e chame
play()no nó VideoStreamPlayer por meio de um script para iniciar a reprodução quando desejado.
Lidando com redimensionamento e diferentes proporções
Por padrão, o VideoStreamPlayer será redimensionado automaticamente para corresponder à resolução do vídeo. Você pode fazê-lo seguir o comportamento normal de dimensionamento de um Control habilitando Expand no nó VideoStreamPlayer.
Para ajustar como o nó VideoStreamPlayer será redimensionado de acordo com o tamanho da janela, ajuste as âncoras usando o menu Layout no topo da viewport do editor 2D. Entretanto, essa configuração pode não ser suficiente para todos os casos de uso, como reproduzir vídeos em tela cheia sem distorção (mas mantendo espaços vazios nas bordas). Para obter mais controle, você pode usar um nó AspectRatioContainer, projetado especificamente para esse tipo de situação:
Adicione um nó AspectRatioContainer. Certifique-se de que não seja filho de nenhum outro nó de contêiner. Selecione o nó AspectRatioContainer e defina seu Layout na parte superior do editor 2D como Full Rect. Defina Ratio no nó AspectRatioContainer para corresponder à proporção do seu vídeo. Você pode usar fórmulas matemáticas no inspetor para se ajudar. Lembre-se de transformar um dos operandos em float. Caso contrário, o resultado da divisão será sempre um número inteiro.
Isso avaliará para (aproximadamente) 1,777778
Após configurar o AspectRatioContainer, torne o nó VideoStreamPlayer um filho dele. Certifique-se de que Expand esteja habilitado no VideoStreamPlayer. Agora o vídeo deverá se ajustar automaticamente à tela inteira sem sofrer distorções.
Ver também
Consulte Resoluções múltiplas para mais dicas sobre suporte a múltiplas proporções de tela em seu projeto.
Exibindo um vídeo em uma superfície 3D
Utilizando um nó VideoStreamPlayer como filho de um nó SubViewport, é possível exibir qualquer nó 2D em uma superfície 3D. Por exemplo, isso pode ser usado para exibir painéis animados quando uma animação quadro a quadro consumiria memória demais.
Isto pode ser feito com as seguintes etapas:
Crie um nó SubViewport. Defina seu tamanho para corresponder ao tamanho do vídeo em pixels.
Crie um nó VideoStreamPlayer como filho do nó SubViewport e especifique o caminho para um vídeo. Certifique-se de que Expand esteja desabilitado e habilite Autoplay, se necessário.
Crie um nó MeshInstance3D com um recurso PlaneMesh ou QuadMesh atribuído à propriedade Mesh. Redimensione a malha para corresponder à proporção do vídeo (caso contrário, ele aparecerá distorcido).
Crie um novo recurso StandardMaterial3D na propriedade Material Override da seção GeometryInstance3D.
Habilite Local To Scene na seção Resource do StandardMaterial3D (na parte inferior). Isso é obrigatório antes de poder utilizar uma ViewportTexture na propriedade Albedo Texture.
No StandardMaterial3D, defina a propriedade Albedo > Texture como New ViewportTexture. Edite o novo recurso clicando nele e então especifique o caminho para o nó SubViewport na propriedade Viewport Path.
Habilite Albedo Texture Force sRGB no StandardMaterial3D para evitar que as cores fiquem desbotadas.
Se o painel deve emitir sua própria luz, defina Shading Mode como Unshaded para melhorar o desempenho da renderização.
Veja Usando Viewports e o GUI em demonstração 3D para mais informações sobre a configuração desta instalação.
Reproduzindo um vídeo em loop
Para colocar um vídeo em loop, a propriedade Loop pode ser ativada. Isso reiniciará o vídeo perfeitamente quando ele chegar ao fim.
Note que definir a configuração de projeto Video Delay Compensation para um valor diferente de zero pode fazer com que o seu loop não seja contínuo, porque a sincronização de áudio e vídeo ocorre no início de cada loop, causando perda ocasional de quadros. Defina Video Delay Compensation em suas configurações de projeto como 0 para evitar problemas de queda de quadros.
Condições de decodificação de vídeo e resoluções recomendadas
Video decoding is performed on the CPU, as GPUs don't have hardware acceleration for decoding Theora videos. Modern desktop CPUs can decode Ogg Theora videos at 1440p @ 60 FPS or more, but low-end mobile CPUs will likely struggle with high-resolution videos.
Para garantir que seus vídeos sejam decodificados sem problemas em diversos hardwares:
Ao desenvolver jogos para plataformas de desktop, é recomendável codificar no máximo em 1080p (de preferência a 30 FPS). A maioria das pessoas ainda está usando monitores de resolução 1080p ou inferior, portanto, a codificação de vídeos de resolução mais alta pode não valer o aumento do tamanho do arquivo e dos requisitos de CPU.
Ao desenvolver jogos para plataformas móveis ou web, recomenda-se codificar em 720p no máximo (de preferência a 30 FPS ou até menos). A diferença visual entre vídeos 720p e 1080p em um dispositivo móvel geralmente não é tão perceptível.
Limitações de reprodução
Existem algumas limitações na implementação atual de reprodução de vídeo no Godot:
A transmissão de um vídeo de um URL não é suportada.
Apenas a saída de áudio mono e estéreo é suportada. Vídeos com 4, 5.1 e 7.1 canais de áudio são suportados, mas são misturados (down-mixed) para estéreo.
Configurações recomendadas de codificação Theora
Um conselho é evitar depender de exportadores Ogg Theora integrados (na maioria das vezes). Existem 2 razões pelas quais você pode querer usar um programa externo para codificar seu vídeo:
Alguns programas como o Blender podem renderizar para Ogg Theora. No entanto, as predefinições de qualidade padrão geralmente são muito baixas para os padrões atuais. Você pode aumentar as opções de qualidade no software que está usando, mas pode achar que a qualidade de saída permanece abaixo do ideal (dado o tamanho maior do arquivo). Isso geralmente significa que o software suporta apenas codificação para taxa de bits constante (CBR), em vez de taxa de bits variável (VBR). A codificação VBR deve ser preferida na maioria dos cenários, pois fornece uma melhor relação entre qualidade e tamanho do arquivo.
Alguns outros programas não podem renderizar para Ogg Theora.
Nesse caso, você pode renderizar o vídeo para um formato intermediário de alta qualidade (como um vídeo H.264 de alta taxa de bits) e recodificá-lo para Ogg Theora. Idealmente, você deve usar um formato sem perdas ou descompactado como um formato intermediário para maximizar a qualidade do vídeo Ogg Theora de saída, mas isso pode exigir muito espaço em disco.
FFmpeg (linha de comando) é uma ferramenta popular de código aberto para essa finalidade. O FFmpeg possui uma curva de aprendizado acentuada, mas é extremamente poderoso.
A seguir estão exemplos de comandos FFmpeg para converter um vídeo MP4 para Ogg Theora. Como o FFmpeg suporta uma grande variedade de formatos de entrada, os comandos abaixo devem funcionar com praticamente qualquer formato de vídeo (AVI, MOV, WebM, …).
Nota
Certifique-se de que sua cópia do FFmpeg seja compilada com suporte a libtheora e libvorbis. Você pode verificar isso executando ffmpeg sem nenhum argumento e, em seguida, observando a linha configuration: na saída do comando.
Aviso
As versões oficiais atuais do FFmpeg possuem alguns bugs em seu multiplexador Ogg/Theora. É altamente recomendável usar uma das compilações diárias estáticas (static daily builds) mais recentes ou compilar a partir do ramo master deles para obter as correções mais recentes.
No Windows, certifique-se de usar compilações de 32 bits do FFmpeg. As compilações do Windows de 64 bits apresentam problemas conhecidos com a codificação Theora, o que resulta em artefatos no arquivo de saída.
Equilibrando qualidade e tamanho do arquivo
O nível de qualidade de vídeo (-q:v) deve estar entre 1 e 10. Qualidade 6 é um bom compromisso entre qualidade e tamanho do arquivo. Se estiver codificando em alta resolução (como 1440p ou 4K), você provavelmente desejará diminuir -q:v para 5 para manter os tamanhos de arquivo razoáveis. Como a densidade de pixels é maior em um vídeo de 1440p ou 4K, as predefinições de qualidade inferior em resoluções mais altas parecerão tão boas ou melhores em comparação com vídeos de baixa resolução.
O nível de qualidade de áudio (-q:a) deve estar entre -1 e 10. A qualidade 6 oferece um bom equilíbrio entre qualidade e tamanho do arquivo. Diferentemente da qualidade de vídeo, aumentar a qualidade do áudio não aumenta tanto o tamanho final do arquivo. Portanto, se desejar o áudio mais limpo possível, você pode aumentar esse valor para 9 e obter um áudio perceptualmente sem perdas. Isso é especialmente útil se o arquivo de entrada já utilizar compressão de áudio com perdas. Qualidades de áudio mais altas aumentam o uso de CPU pelo decodificador e podem causar falhas na reprodução do áudio sob carga elevada do sistema. Consulte esta página para uma tabela com predefinições de qualidade do Ogg Vorbis e suas respectivas taxas de bits variáveis.
O tamanho do GOP (Group of Pictures) (-g:v) é o intervalo máximo entre quadros-chave. Aumentar esse valor pode melhorar a compressão quase sem impacto na qualidade. O tamanho padrão (12) é muito baixo para a maioria dos tipos de conteúdo, portanto, recomenda-se usar valores de GOP mais altos antes de reduzir a qualidade do vídeo. Os benefícios da compressão diminuirão à medida que o tamanho do GOP aumentar, no entanto. Valores entre 64 e 512 geralmente oferecem a melhor compressão.
Nota
Tamanhos de GOP mais altos aumentarão os tempos máximos de busca (seek times), com um aumento repentino ao ir além das potências de dois começando em 64. Os tempos máximos de busca com tamanho de GOP 65 podem ser quase o dobro do tempo com tamanho de GOP 64, dependendo da velocidade de decodificação.
FFmpeg: Converter preservando a resolução de vídeo original
O comando a seguir converte o vídeo mantendo sua resolução original. A taxa de bits do vídeo e do áudio será variável para maximizar a qualidade enquanto economiza espaço em partes do vídeo/áudio que não requerem uma taxa de bits alta (como cenas estáticas).
ffmpeg -i input.mp4 -q:v 6 -q:a 6 -g:v 64 output.ogv
FFmpeg: Redimensionar o vídeo e depois convertê-lo
O comando a seguir redimensiona um vídeo para 720 pixels de altura (720p), preservando sua proporção existente. Isso ajuda a diminuir significativamente o tamanho do arquivo se a fonte for gravada em uma resolução superior a 720p:
ffmpeg -i input.mp4 -vf "scale=-1:720" -q:v 6 -q:a 6 -g:v 64 output.ogv
Vídeos com Chroma Key
O Chroma key, comumente conhecido como efeito "tela verde" ou "tela azul", permite remover uma cor específica de uma imagem ou vídeo e substituí-la por outro plano de fundo. Esse efeito é amplamente utilizado na produção de vídeo para compor diferentes elementos de forma integrada.
We will achieve the chroma key effect by writing a custom shader in GDScript and using a VideoStreamPlayer node to display the video content.
Configuração da cena
Ensure that the scene contains a VideoStreamPlayer node to play the video and a Control node to hold the UI elements for controlling the chroma key effect.
Escrevendo o shader personalizado
Para implementar o efeito chroma key, siga estas etapas:
Select the
VideoStreamPlayernode in the scene and go to its properties. Under , create a new shader named "ChromaKeyShader.gdshader."No arquivo "ChromaKeyShader.gdshader", escreva o código do shader personalizado conforme mostrado abaixo:
shader_type canvas_item;
// Uniform variables for chroma key effect
uniform vec3 chroma_key_color : source_color = vec3(0.0, 1.0, 0.0);
uniform float pickup_range : hint_range(0.0, 1.0) = 0.1;
uniform float fade_amount : hint_range(0.0, 1.0) = 0.1;
void fragment() {
// Get the color from the texture at the given UV coordinates
vec4 color = texture(TEXTURE, UV);
// Calculate the distance between the current color and the chroma key color
float distance = length(color.rgb - chroma_key_color);
// If the distance is within the pickup range, discard the pixel
// the lesser the distance more likely the colors are
if (distance <= pickup_range) {
discard;
}
// Calculate the fade factor based on the pickup range and fade amount
float fade_factor = smoothstep(pickup_range, pickup_range + fade_amount, distance);
// Set the output color with the original RGB values and the calculated fade factor
COLOR = vec4(color.rgb, fade_factor);
}
O shader usa o cálculo de distância para identificar os pixels próximos à cor do chroma key e os descarta, removendo efetivamente a cor selecionada. Os pixels que estão ligeiramente mais distantes da cor do chroma key são esmaecidos com base no fade_factor, misturando-os suavemente com as cores ao redor. Esse processo cria o efeito chroma key desejado, fazendo parecer que o plano de fundo foi substituído por outra imagem ou vídeo.
O código acima representa uma demonstração simples do shader Chroma Key, e os usuários podem personalizá-lo de acordo com suas necessidades específicas.
Controles de interface
To allow users to manipulate the chroma key effect in real-time, we created sliders in the Control node. The Control node's script contains the following functions:
extends Control
func _on_color_picker_button_color_changed(color):
# Update the "chroma_key_color" shader parameter of the VideoStreamPlayer's material.
$VideoStreamPlayer.material.set("shader_parameter/chroma_key_color", color)
func _on_h_slider_value_changed(value):
# Update the "pickup_range" shader parameter of the VideoStreamPlayer's material.
$VideoStreamPlayer.material.set("shader_parameter/pickup_range", value)
func _on_h_slider_2_value_changed(value):
# Update the "fade_amount" shader parameter of the VideoStreamPlayer's material.
$VideoStreamPlayer.material.set("shader_parameter/fade_amount", value)
func _on_video_stream_player_finished():
# Restart the video playback when it's finished.
$VideoStreamPlayer.play()
using Godot;
public partial class MyControl : Control
{
private VideoStreamPlayer _videoStreamPlayer;
public override void _Ready()
{
_videoStreamPlayer = GetNode<VideoStreamPlayer>("VideoStreamPlayer");
}
private void OnColorPickerButtonColorChanged(Color color)
{
// Update the "chroma_key_color" shader parameter of the VideoStreamPlayer's material.
_videoStreamPlayer.Material.Set("shader_parameter/chroma_key_color", color);
}
private void OnHSliderValueChanged(double value)
{
// Update the "pickup_range" shader parameter of the VideoStreamPlayer's material.
_videoStreamPlayer.Material.Set("shader_parameter/pickup_range", value);
}
private void OnHSlider2ValueChanged(double value)
{
// Update the "fade_amount" shader parameter of the VideoStreamPlayer's material.
_videoStreamPlayer.Material.Set("shader_parameter/fade_amount", value);
}
private void OnVideoStreamPlayerFinished()
{
// Restart the video playback when it's finished.
_videoStreamPlayer.Play();
}
}
certifique-se também de que o intervalo dos controles deslizantes seja apropriado, nossas configurações são:
Manipulação de sinais
Connect the appropriate signal from the UI elements to the Control node's script.
you created in the Control node's script to control the chroma key effect.
These signal handlers will update the shader's uniform variables
in response to user input.
Salve e execute a cena para ver o efeito chroma key em ação! Com os controles de UI fornecidos, agora você pode ajustar a cor do chroma key, o intervalo de seleção (pickup range) e a quantidade de desfoque (fade amount) em tempo real, alcançando a funcionalidade de chroma key desejada para o seu conteúdo de vídeo.