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...
Riproduzione di video
Godot supporta la riproduzione di video con il nodo VideoStreamPlayer.
Formati di riproduzione supportati
L'unico formato supportato nel core è Ogg Theora (da non confondere con l'audio Ogg Vorbis), con tracce audio Ogg Vorbis facoltative. Le estensioni sono in grado di implementare supporto di formati aggiuntivi.
H.264 e H.265 non sono supportati nel core di Godot, poiché sono entrambi protetti da brevetti software. AV1 è esente da royalty, ma la sua decodifica è lenta sulla CPU e il supporto per la decodifica su hardware non è ancora disponibile su tutte le GPU in uso.
WebM era supportato nel core di Godot 3.x, ma il supporto è stato rimosso nella versione 4.0 perché era troppo pieno di bug e difficile da mantenere.
Nota
Potresti trovare video con estensione .ogg o .ogx, che sono estensioni generiche per i dati dentro un contenitore Ogg.
Rinominare queste estensioni di file in .ogv potrebbe permettere ai video di essere importati in Godot. Tuttavia, non tutti i file con estensione .ogg o .ogx sono video: alcuni di essi potrebbero contenere solo audio.
Configurazione di VideoStreamPlayer
Creare un nodo VideoStreamPlayer attraverso la finestra di dialogo Crea un nuovo nodo.
Selezionare il nodo VideoStreamPlayer nel pannello dell'albero di scene, andare nell'Ispettore e caricare un file
.ogvnella proprietà Stream.Se non si dispone ancora di un video in formato Ogg Theora, andare a Impostazioni di codifica Theora consigliate.
Se si desidera che il video venga riprodotto non appena la scena viene caricata, selezionare Riproduzione automatica nell'ispettore. Altrimenti, lascia Riproduzione automatica disabilitata e chiama
play()sul nodo VideoStreamPlayer in uno script per avviare la riproduzione quando desiderato.
Gestire il ridimensionamento e i diverse rapporti di aspetto
By default, the VideoStreamPlayer will automatically be resized to match the video's resolution. You can make it follow usual Control sizing by enabling Expand on the VideoStreamPlayer node.
Per regolare come il nodo VideoStreamPlayer è ridimensionato in base alle dimensioni della finestra, è possibile regolare le ancore attraverso il menu Layout in alto la viewport dell'editor 2D. Tuttavia, questa configurazione potrebbe non essere potente abbastanza per gestire tutti i casi d'uso, come la riproduzione di video a schermo intero senza distorcere l'immagine (ma con spazio vuoto ai bordi). Per un maggiore controllo, è possibile utilizzare un nodo AspectRatioContainer, progettato per gestire questo tipo di caso d'uso:
Aggiungi un nodo AspectRatioContainer. Assicurati che non sia figlio di nessun altro nodo contenitore. Seleziona il nodo AspectRatioContainer, quindi imposta il suo Layout in alto l'editor 2D su Full Rect. Imposta il Ratio nel nodo AspectRatioContainer in modo che corrisponda al rapporto d'aspetto del video. Puoi utilizzare formule matematiche nell'ispettore per aiutarti. Ricorda di impostare uno degli operandi come float. Altrimenti, il risultato della divisione sarà sempre un numero intero.
Questo valore sarà (approssimativamente) 1.777778
Dopo aver configurato l'AspectRatioContainer, riassegna il nodo VideoStreamPlayer al nodo figlio dell'AspectRatioContainer. Assicurati che l'opzione Expand sia abilitata sul VideoStreamPlayer. Il video dovrebbe ora ridimensionarsi automaticamente per adattarsi all'intero schermo, evitando distorsioni.
Vedi anche
Consulta Molteplici risoluzioni per ulteriori suggerimenti su come supportare più rapporti di aspetto nel tuo progetto.
Visualizzare un video su una superficie 3D
Attraverso un nodo VideoStreamPlayer come figlio di un nodo SubViewport, è possibile visualizzare qualsiasi nodo 2D su una superficie 3D. Ad esempio, questo può servire per visualizzare billboard animati quando un'animazione fotogramma per fotogramma richiederebbe troppa memoria.
Ciò si può fare seguendo i seguenti passaggi:
Crea un nodo SubViewport. Imposta le sue dimensioni in modo che corrispondano alle dimensioni del video in pixel.
Crea un nodo VideoStreamPlayer come figlio del nodo SubViewport e specifica al suo interno il percorso del video. Assicurati che Expand sia disabilitato e abilita Autoplay se necessario.
Crea un nodo MeshInstance3D con una risorsa PlaneMesh o QuadMesh nella sua proprietà Mesh. Ridimensiona la mesh in modo che corrisponda al rapporto d'aspetto del video (altrimenti, apparirà distorta).
Crea una nuova risorsa StandardMaterial3D nella proprietà Material Override nella sezione GeometryInstance3D.
Abilita Local To Scene nella sezione Resource di StandardMaterial3D (in basso). Questo è necessario affinché sia possibile utilizzare una ViewportTexture nella sua proprietà Albedo Texture.
Nello StandardMaterial3D, imposta la proprietà Albedo > Texture su Nuovo ViewportTexture. Modifica la nuova risorsa cliccando su di essa, poi specifica il percorso del nodo SubViewport nella proprietà Viewport Path.
Abilita Albedo Texture Force sRGB nello StandardMaterial3D per evitare che i colori risultino sbiaditi.
If the billboard is supposed to emit its own light, set Shading Mode to Unshaded to improve rendering performance.
Consultare Utilizzo delle Viewport e la demo GUI in 3D per ulteriori informazioni sulla configurazione.
Far ripetere un video
Per ripetere un video, è possibile abilitare la proprietà Loop. Questa proprietà riavvia il video senza interruzioni al termine della riproduzione.
Note that setting the project setting Video Delay Compensation to a non-zero value might cause your loop to not be seamless, because the synchronization of audio and video takes place at the start of each loop causing occasional missed frames. Set Video Delay Compensation in your project settings to 0 to avoid frame drop issues.
Condizioni di decodifica video e risoluzioni consigliate
La decodifica video è eseguita dalla CPU, poiché le GPU non hanno accelerazione hardware per la decodifica dei video Theora. Le CPU moderne per i desktop sono in grado di decodificare video Ogg Theora a 1440p a 60 FPS o più, ma le CPU mobili di fascia bassa probabilmente avranno difficoltà con i video ad alta risoluzione.
Per garantire che i video siano decodificati senza problemi su tutti i tipi di hardware:
Quando si sviluppano giochi per piattaforme desktop, si consiglia di codificare al massimo a 1080p (preferibilmente a 30 FPS). La maggior parte degli utenti utilizza ancora schermi con risoluzione 1080p o inferiore, quindi codificare video a risoluzioni più alte potrebbe non valerne la pena, a causa delle dimensioni dei file e dei requisiti della CPU.
Quando si sviluppano giochi per piattaforme mobile o web, si consiglia di codificare al massimo a 720p (preferibilmente a 30 FPS o anche meno). La differenza visiva tra video a 720p e 1080p su un dispositivo mobile di solito non è così evidente.
Limitazioni della riproduzione
There are some limitations with the current implementation of video playback in Godot:
La trasmissione di video da un URL non è supportata.
È supportata solo l'uscita audio mono e stereo. I video con 4, 5.1 e 7.1 canali audio sono supportati, ma sono convertiti in stereo.
Impostazioni di codifica Theora consigliate
Un consiglio è di evitate di affidarti agli esportatori integrati di Ogg Theora (la maggior parte delle volte). Ci sono due motivi per cui potresti preferire usare un programma esterno per codificare il video:
Alcuni programmi, come Blender, sono in grado di renderizzare in formato Ogg Theora. Tuttavia, le impostazioni di qualità predefinite sono generalmente molto basse rispetto agli standard odierni. Potresti essere in grado di aumentare le opzioni di qualità nel software che stai utilizzando, ma potresti comunque notare che la qualità di output sia meno che ideale (dato l'aumento delle dimensioni del file). Questo di solito significa che il software supporta solo la codifica a bitrate costante (CBR), anziché a bitrate variabile (VBR). La codifica VBR è da preferire nella maggior parte dei casi, in quanto offre un rapporto migliore tra qualità e dimensioni.
Alcuni altri programmi non sono affatto in grado di renderizzare in Ogg Theora.
In questo caso, è possibile renderizzare il video in un formato intermedio di alta qualità (come un video H.264 ad alto bitrate) e poi ricodificarlo in Ogg Theora. Idealmente, si dovrebbe utilizzare un formato senza perdita di dati o non compresso come formato intermedio per massimizzare la qualità del video convertito in Ogg Theora, ma ciò può richiedere molto spazio su disco.
FFmpeg (CLI) è un popolare strumento open source per questo scopo. FFmpeg è complesso da imparare, ma è uno strumento potente.
Ecco alcuni esempi di comandi FFmpeg per convertire un video MP4 in Ogg Theora. Poiché FFmpeg supporta molti formati di input, dovresti essere in grado di utilizzare i comandi seguenti con quasi tutti i formati video di input (AVI, MOV, WebM, ...).
Nota
Assicurati che la tua copia di FFmpeg sia compilata con il supporto per libtheora e libvorbis. Si può verificare eseguendo ffmpeg senza argomenti, quindi esaminando la riga configuration: nell'output del comando.
Avvertimento
Le attuali versioni ufficiali di FFmpeg hanno alcuni bug nel multiplexer Ogg/Theora. Si consiglia vivamente di utilizzare una delle ultime build statiche giornaliere o di compilare dal ramo master per ottenere le correzioni più recenti.
On Windows, make sure to use 32-bit builds of FFmpeg. Windows 64-bit builds have known issues with Theora encoding, which result in artifacts in the output file.
Bilanciare tra qualità e dimensione di file
Il livello di qualità video (-q:v) deve essere compreso tra 1 e 10. La qualità 6 è un buon compromesso tra qualità e dimensioni del file. Se si codifica ad alta risoluzione (come 1440p o 4K), probabilmente si vorrà ridurre -q:v a 5 per mantenere ragionevoli le dimensioni del file. Poiché la densità dei pixel è maggiore su un video 1440p o 4K, i preset di qualità inferiori a risoluzioni più elevate avranno un aspetto altrettanto buono o migliore rispetto ai video a bassa risoluzione.
Il livello di qualità audio (-q:a) deve essere compreso tra -1 e 10. La qualità 6 offre un buon compromesso tra qualità e dimensioni del file. A differenza della qualità video, aumentare la qualità audio non aumenta di così tanto le dimensioni del file risultante. Pertanto, se si desidera l'audio più pulito possibile, è possibile aumentarlo a 9 per ottenere un audio percettivamente senza perdite. Questo è particolarmente utile se il file di input utilizza già la compressione audio con perdita di dati. Una qualità audio più alta aumenta l'impatto del decoder sulla CPU, quindi potrebbe causare interruzioni audio in caso di carico elevato del sistema. Consulta questa pagina per una tabella che elenca i preset di qualità audio di Ogg Vorbis e i rispettivi bitrate variabili.
La dimensione del GOP (Group of Pictures) (-g:v) rappresenta l'intervallo massimo tra i fotogrammi chiave. Aumentando questo valore è possibile migliorare la compressione senza quasi alcun impatto sulla qualità. La dimensione predefinita (12) è troppo bassa per la maggior parte dei tipi di contenuto, pertanto si consiglia di utilizzare valori GOP più alti prima di ridurre la qualità video. Tuttavia, i benefici della compressione diminuiranno con l'aumentare della dimensione del GOP. I valori compresi tra 64 e 512 offrono generalmente la migliore compressione.
Nota
Higher GOP sizes will increase max seek times with a sudden increase when
going beyond powers of two starting at 64. Max seek times with GOP size
65 can be almost twice as long as with GOP size 64, depending on
decoding speed.
FFmpeg: converti preservando la risoluzione video originale
Il seguente comando converte il video mantenendo la sua risoluzione originale. Il bitrate del video e dell'audio sarà variabile per massimizzare la qualità, risparmiando spazio nelle parti del video/audio che non richiedono un bitrate elevato (come le scene statiche).
ffmpeg -i input.mp4 -q:v 6 -q:a 6 -g:v 64 output.ogv
FFmpeg: ridimensiona il video e poi convertilo
Il seguente comando ridimensiona un video a un'altezza di 720 pixel (720p), mantenendo il rapporto di aspetto originale. Questo aiuta a ridurre notevolmente le dimensioni del file se la sorgente è stata registrata a una risoluzione superiore a 720p:
ffmpeg -i input.mp4 -vf "scale=-1:720" -q:v 6 -q:a 6 -g:v 64 output.ogv
Video con chroma key
Il chroma key, comunemente noto come effetto "green screen" o "blue screen", permette di rimuovere un colore specifico da un'immagine o un video e sostituirlo con un altro sfondo. Questo effetto è ampiamente utilizzato nella produzione video per comporre diversi elementi senza intoppi.
Realizzeremo l'effetto chroma key scrivendo uno shader personalizzato in GDScript e utilizzando un nodo VideoStreamPlayer per visualizzare il contenuto video.
Configurazione della scena
Assicurati che la scena contenga un nodo VideoStreamPlayer per riprodurre il video e un nodo Control per contenere gli elementi dell'interfaccia utente per controllare l'effetto chroma key.
Scrivere lo shader personalizzato
Per implementare l'effetto chroma key, segui questi passaggi:
Seleziona il nodo VideoStreamPlayer nella scena e vai alle sue proprietà. In CanvasItem > Material, crea un nuovo shader chiamato "ChromaKeyShader.gdshader".
Nel file "ChromaKeyShader.gdshader", scrivi il codice dello shader personalizzato come mostrato di seguito:
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);
}
Lo shader utilizza il calcolo della distanza per identificare i pixel vicini al colore di chroma key e li scarta, effettivamente rimuovendo il colore selezionato. I pixel leggermente più distanti dal colore di chroma key sono sfumati in base a fade_factor, fondendoli gradualmente con i colori circostanti. Questo processo crea l'effetto chroma key desiderato, dando l'impressione che lo sfondo sia stato sostituito con un'altra immagine o un altro video.
Il codice qui sopra rappresenta una semplice dimostrazione dello shader Chroma Key, e gli utenti lo possono personalizzare in base alle proprie esigenze specifiche.
Control dell'UI
Per consentire agli utenti di manipolare l'effetto chroma key in tempo reale, abbiamo creato degli slider nel nodo Control. Lo script del nodo Control contiene le seguenti funzioni:
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();
}
}
assicurati anche che l'intervallo degli slider sia appropriato, le nostre impostazioni sono:
Gestione dei segnali
Connetti il segnale appropriato dagli elementi dell'interfaccia utente allo script del nodo Control creato nello script del nodo Control per controllare l'effetto chroma key. Questi gestori di segnale aggiorneranno le variabili uniformi dello shader in risposta all'input dell'utente.
Save and run the scene to see the chroma key effect in action! With the provided UI controls, you can now adjust the chroma key color, pickup range, and fade amount in real-time, achieving the desired chroma key functionality for your video content.