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...
비디오 재생
Godot는 VideoStreamPlayer 노드로 비디오 재생을 지원합니다.
지원되는 플랫폼
코어에서 지원되는 유일한 형식은 선택적 Ogg Vorbis 오디오 트랙이 있는 **Ogg Theora**(Ogg Vorbis 오디오와 혼동하지 마세요)입니다. 확장이 추가 형식을 지원하는 것이 가능합니다.
H.264와 H.265는 둘 다 소프트웨어 특허에 의해 보호되기 때문에 핵심 Godot에서 지원될 수 없습니다. AV1은 로열티가 없지만 CPU에서 디코딩하는 속도가 느리고 아직 사용 중인 모든 GPU에서 하드웨어 디코딩 지원을 쉽게 사용할 수는 없습니다.
WebM은 Godot 3.x에서 핵심적으로 지원되었지만 버그가 너무 많고 유지 관리가 어려웠기 때문에 4.0에서 지원이 제거되었습니다.
참고
Ogg 컨테이너 내 데이터에 대한 일반 확장인 .ogg 또는 .ogx 확장자가 있는 비디오를 찾을 수 있습니다.
이 파일 확장자의 이름을 .ogv``로 바꾸면 비디오를 Godot로 가져올 수 *될 수도 있습니다*. 그러나 ``.ogg 또는 .ogx 확장자를 가진 모든 파일이 비디오는 아닙니다. 일부 파일에는 오디오만 포함될 수 있습니다.
VideoStreamPlayer 설정하기
만들기 만들기 새 노드 대화 상자를 사용하여 VideoStreamPlayer 노드입니다.
Timer 노드를 선택한 상태에서 인스펙터로 이동하여 자동 시작 속성을 활성화합니다.
아직 Ogg Theora 형식의 비디오가 없다면 :ref:`doc_playing_videos_recommended_theora_encoding_settings`로 이동하세요.
씬이 로드되자마자 비디오를 재생하려면 인스펙터에서 **Autoplay**를 선택하세요. 그렇지 않은 경우 **자동 재생**을 비활성화한 상태로 두고 스크립트에서 VideoStreamPlayer 노드의 ``play()``를 호출하여 원할 때 재생을 시작합니다.
시그널 다루기
기본적으로 VideoStreamPlayer는 비디오 해상도에 맞게 크기가 자동으로 조정됩니다. VideoStreamPlayer 노드에서 **확장**을 활성화하여 일반적인 Control 크기 조정을 따르도록 할 수 있습니다.
창 크기에 따라 VideoStreamPlayer 노드의 크기가 조정되는 방식을 조정하려면 2D 편집기 뷰포트 상단에 있는 레이아웃 메뉴를 사용하여 앵커를 조정하세요. 그러나 이 설정은 비디오를 왜곡하지 않고 전체 화면 비디오를 재생하는 등의 모든 사용 사례를 처리할 만큼 강력하지 않을 수 있습니다(대신 가장자리에 빈 공간이 있음). 더 많은 제어를 위해 이러한 종류의 사용 사례를 처리하도록 설계된 AspectRatioContainer 노드를 사용할 수 있습니다.
AspectRatioContainer 노드를 추가합니다. 다른 컨테이너 노드의 하위가 아닌지 확인하세요. AspectRatioContainer 노드를 선택한 다음 2D 편집기 상단의 **Layout**을 **Full Rect**로 설정합니다. AspectRatioContainer 노드에서 **비율**을 설정하여 동영상의 가로 세로 비율과 일치시킵니다. 검사기에서 수학 공식을 사용하여 도움을 받을 수 있습니다. 피연산자 중 하나를 부동 소수점으로 만드는 것을 잊지 마세요. 그렇지 않으면 나누기 결과는 항상 정수가 됩니다.
이는 (대략) 1.777778로 평가됩니다.
AspectRatioContainer를 구성한 후에는 VideoStreamPlayer 노드를 AspectRatioContainer 노드의 하위 항목으로 다시 지정하세요. VideoStreamPlayer에서 **확장**이 활성화되어 있는지 확인하세요. 이제 왜곡을 피하면서 전체 화면에 맞게 비디오 크기가 자동으로 조정됩니다.
더 보기
프로젝트에서 다양한 종횡비를 지원하는 방법에 대한 추가 팁은 :ref:`doc_multiple_resolutions`를 참조하세요.
3D 표면에 비디오 표시
VideoStreamPlayer 노드를 SubViewport 노드의 하위로 사용하면 3D 표면에 2D 노드를 표시할 수 있습니다. 예를 들어, 프레임별 애니메이션에 너무 많은 메모리가 필요할 때 애니메이션 광고판을 표시하는 데 사용할 수 있습니다.
적 씬은 다음 노드들을 사용할 것입니다:
만들기 및 SubViewport 노드. 동영상 크기(픽셀)와 일치하도록 크기를 설정하세요.
만들기 VideoStreamPlayer 노드 *SubViewport 노드*의 하위 항목으로 여기에 비디오 경로를 지정합니다. **확장**이 비활성화되어 있는지 확인하고 필요한 경우 **자동재생**을 활성화하세요.
Mesh 속성에 PlaneMesh 또는 QuadMesh 리소스가 있는 만들기 MeshInstance3D 노드. 비디오의 종횡비에 맞게 메시 크기를 조정합니다(그렇지 않으면 왜곡되어 나타납니다).
만들기 GeometryInstance3D 섹션의 Material Override 속성에 새로운 StandardMaterial3D 리소스가 있습니다.
StandardMaterial3D의 리소스 섹션(하단)에서 **Local To 씬**를 활성화합니다. 이는 Albedo Texture 속성에서 ViewportTexture를 사용하기 전에 *필수*입니다.
StandardMaterial3D에서 Albedo > Texture 속성을 New ViewportTexture**로 설정합니다. 새 리소스를 클릭하여 편집한 다음 **뷰포트 Path 속성에서 SubViewport 노드에 대한 경로를 지정합니다.
색상이 바래지는 것을 방지하려면 StandardMaterial3D에서 **Albedo Texture Force sRGB**를 활성화하세요.
빌보드가 자체적으로 빛을 발산해야 하는 경우 **Shading Mode**를 **Unshaded**로 설정하여 렌더링 성능을 향상시킵니다.
이를 설정하는 것에 대한 자세한 정보는 뷰포트 사용하기와 3D 데모에서의 GUI를 참조하세요.
비디오 루프하기
비디오를 반복하려면 Loop 속성을 활성화할 수 있습니다. 이렇게 하면 비디오가 끝나면 원활하게 다시 시작됩니다.
프로젝트 설정 **비디오 지연 보상**을 0이 아닌 값으로 설정하면 루프가 원활하지 않게 될 수 있습니다. 오디오와 비디오의 동기화가 각 루프의 시작 부분에서 발생하여 가끔 프레임 누락이 발생하기 때문입니다. 프레임 드롭 문제를 방지하려면 프로젝트 설정에서 **비디오 지연 보상**을 **0**으로 설정하세요.
비디오 디코딩 조건 및 권장 해상도
GPU에는 Theora 비디오 디코딩을 위한 하드웨어 가속 기능이 없기 때문에 비디오 디코딩은 CPU에서 수행됩니다. 최신 데스크톱 CPU는 1440p @ 60FPS 이상으로 Ogg Theora 비디오를 디코딩할 수 있지만 저가형 모바일 CPU는 고해상도 비디오에 어려움을 겪을 가능성이 높습니다.
다양한 하드웨어에서 비디오가 원활하게 디코딩되도록 하려면:
데스크톱 플랫폼용 게임을 개발할 때는 최대 1080p(바람직하게는 30FPS)로 인코딩하는 것이 좋습니다. 대부분의 사람들은 여전히 1080p 이하의 해상도 디스플레이를 사용하고 있으므로 고해상도 비디오를 인코딩하는 것은 증가된 파일 크기 및 CPU 요구 사항에 비해 가치가 없을 수 있습니다.
모바일 또는 웹 플랫폼용 게임을 개발할 때는 최대 720p(바람직하게는 30FPS 이하)로 인코딩하는 것이 좋습니다. 모바일 장치에서 720p와 1080p 비디오의 시각적 차이는 일반적으로 그다지 눈에 띄지 않습니다.
재생 제한 사항
glTF 내보내기에는 몇 가지 제약이 있습니다.
URL에서 비디오 스트리밍은 지원되지 않습니다.
모노 및 스테레오 오디오 출력만 지원됩니다. 4, 5.1, 7.1 오디오 채널의 비디오는 지원되지만 스테레오로 다운믹스됩니다.
권장되는 Theora 인코딩 설정
한 마디 조언은 **내장된 Ogg Theora 내보내기 프로그램에 의존하지 말라**(대부분의 경우)는 것입니다. 비디오를 인코딩하기 위해 외부 프로그램을 사용하는 것을 선호하는 두 가지 이유가 있습니다.
Blender와 같은 일부 프로그램은 Ogg Theora로 렌더링할 수 있습니다. 그러나 기본 품질 사전 설정은 일반적으로 오늘날의 표준에 비해 매우 낮습니다. 사용 중인 소프트웨어에서 품질 옵션을 높일 수 있지만 파일 크기가 증가함에 따라 출력 품질이 이상적이지 않을 수 있습니다. 이는 일반적으로 소프트웨어가 가변 비트 전송률(VBR) 대신 고정 비트 전송률(CBR)로의 인코딩만 지원한다는 의미입니다. VBR 인코딩은 파일 크기 비율에 더 나은 품질을 제공하므로 대부분의 시나리오에서 선호됩니다.
일부 다른 프로그램은 Ogg Theora로 전혀 렌더링할 수 없습니다.
이 경우 **비디오를 중간 고품질 형식**(예: 높은 비트 전송률의 H.264 비디오)으로 렌더링한 다음 Ogg Theora로 다시 인코딩할 수 있습니다. 이상적으로는 무손실 또는 비압축 형식을 중간 형식으로 사용하여 출력 Ogg Theora 비디오의 품질을 최대화해야 하지만 이 경우 많은 디스크 공간이 필요할 수 있습니다.
`FFmpeg <https://ffmpeg.org/>`__(CLI)는 이러한 목적으로 널리 사용되는 오픈 소스 도구입니다. FFmpeg는 학습 곡선이 가파르지만 강력한 도구입니다.
다음은 MP4 비디오를 Ogg Theora로 변환하는 FFmpeg 명령의 예입니다. FFmpeg는 다양한 입력 형식을 지원하므로 거의 모든 입력 비디오 형식(AVI, MOV, WebM 등)에서 아래 명령을 사용할 수 있습니다.
참고
FFmpeg 사본이 libtheora 및 libvorbis 지원으로 컴파일되었는지 확인하십시오. 인수 없이 ffmpeg``를 실행한 다음 명령 출력에서 ``configuration: 줄을 보면 이를 확인할 수 있습니다.
경고
현재 공식 FFmpeg 릴리스에는 Ogg/Theora 멀티플렉서에 몇 가지 버그가 있습니다. 최신 정적 일일 빌드 중 하나를 사용하거나 마스터 브랜치에서 빌드하여 최신 수정 사항을 얻는 것이 좋습니다.
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.
품질과 파일 크기의 균형
동영상 품질 수준(-q:v)은 1``에서 ``10 사이여야 합니다. 품질 ``6``는 품질과 파일 크기 간의 적절한 절충안입니다. 고해상도(예: 1440p 또는 4K)로 인코딩하는 경우 파일 크기를 적절하게 유지하기 위해 ``-q:v``를 ``5``로 줄이는 것이 좋습니다. 1440p 또는 4K 비디오에서는 픽셀 밀도가 더 높기 때문에 더 높은 해상도에서 낮은 품질 사전 설정이 저해상도 비디오에 비해 좋아 보이거나 더 좋게 보입니다.
오디오 품질 수준(-q:a)은 -1``에서 ``10 사이여야 합니다. 품질 ``6``는 품질과 파일 크기 간의 적절한 절충안을 제공합니다. 비디오 품질과 달리 오디오 품질을 높이더라도 출력 파일 크기는 거의 늘어나지 않습니다. 따라서 가능한 가장 깨끗한 오디오를 원한다면 이 값을 ``9``로 늘려 지각적으로 무손실 오디오를 얻을 수 있습니다. 이는 입력 파일이 이미 손실 오디오 압축을 사용하는 경우 특히 유용합니다. 오디오 품질이 높을수록 디코더의 CPU 사용량이 늘어나므로 시스템 부하가 높은 경우 오디오 끊김이 발생할 수 있습니다. Ogg Vorbis 오디오 품질 사전 설정 및 해당 가변 비트 전송률이 나열된 표는 `이 페이지 <https://wiki.hydrogenaud.io/index.php?title=Recommended_Ogg_Vorbis#Recommended_Encoder_Settings>`__를 참조하세요.
**GOP(사진의 그룹) 크기**(-g:v)는 키프레임 간의 최대 간격입니다. 이 값을 늘리면 품질에 거의 영향을 주지 않고 압축이 향상될 수 있습니다. 기본 크기(12)는 대부분의 콘텐츠 유형에 비해 너무 작으므로 비디오 품질을 낮추기 전에 더 높은 GOP 값을 사용하는 것이 좋습니다. 그러나 GOP 크기가 증가하면 압축 이점이 사라집니다. 일반적으로 64``와 ``512 사이의 값이 가장 압축률이 높습니다.
FFmpeg: 원본 비디오 해상도를 유지하면서 변환
다음 명령은 원래 해상도를 유지하면서 비디오를 변환합니다. 높은 비트 전송률이 필요하지 않은 비디오/오디오 부분(예: 정적 장면)의 공간을 절약하면서 품질을 최대화하기 위해 비디오 및 오디오의 비트 전송률이 가변됩니다.
ffmpeg -i input.mp4 -q:v 6 -q:a 6 -g:v 64 output.ogv
FFmpeg: 비디오 크기를 조정한 후 변환
다음 명령은 기존 종횡비를 유지하면서 높이가 720픽셀(720p)이 되도록 비디오 크기를 조정합니다. 이렇게 하면 소스가 720p보다 높은 해상도로 기록되는 경우 파일 크기를 크게 줄이는 데 도움이 됩니다.
ffmpeg -i input.mp4 -vf "scale=-1:720" -q:v 6 -q:a 6 -g:v 64 output.ogv
크로마키 비디오
일반적으로 "그린 스크린" 또는 "블루 스크린" 효과로 알려진 크로마 키를 사용하면 이미지나 비디오에서 특정 색상을 제거하고 다른 배경으로 바꿀 수 있습니다. 이 효과는 다양한 요소를 원활하게 결합하기 위해 비디오 제작에 널리 사용됩니다.
GDScript에서 사용자 정의 셰이더를 작성하고 VideoStreamPlayer 노드를 사용하여 비디오 콘텐츠를 표시함으로써 크로마 키 효과를 얻을 것입니다.
씬 설정
씬에는 비디오를 재생하는 VideoStreamPlayer 노드가 포함되어 있고 크로마 키 효과를 제어하기 위한 UI 요소를 보유하는 Control 노드가 포함되어 있는지 확인하세요.
셰이더 개선하기
크로마키 효과를 구현하려면 다음 단계를 따르세요.
씬에서 VideoStreamPlayer 노드를 선택하고 해당 속성으로 이동합니다. CanvasItem > Material 아래에 "ChromaKeyShader.gdshader"라는 이름의 새 셰이더를 만듭니다.
"ChromaKeyShader.gdshader" 파일에서 아래와 같이 사용자 정의 셰이더 코드를 작성합니다.
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);
}
셰이더는 거리 계산을 사용하여 크로마 키 색상에 가까운 픽셀을 식별하고 이를 삭제하여 선택한 색상을 효과적으로 제거합니다. 크로마키 색상에서 약간 떨어진 픽셀은 fade_factor에 따라 페이드되어 주변 색상과 부드럽게 혼합됩니다. 이 과정을 통해 원하는 크로마키 효과가 생성되어 마치 배경이 다른 이미지나 비디오로 대체된 것처럼 보입니다.
위의 코드는 크로마 키 셰이더의 간단한 데모를 나타내며 사용자는 특정 요구 사항에 따라 이를 사용자 정의할 수 있습니다.
Control
사용자가 크로마 키 효과를 실시간으로 조작할 수 있도록 Control 노드에 슬라이더를 만들었습니다. Control 노드의 스크립트에는 다음 기능이 포함되어 있습니다.
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();
}
}
또한 슬라이더 범위가 적절한지 확인하십시오. 설정은 다음과 같습니다.
입력
연결 UI 요소의 적절한 시그널에서 Control 노드의 스크립트까지. 크로마키 효과를 제어하기 위해 Control 노드의 스크립트에서 생성했습니다. 이러한 시그널 핸들러는 사용자 입력에 응답하여 셰이더의 균일 변수를 업데이트합니다.
씬을 저장하고 실행하여 크로마키 효과가 실제로 나타나는지 확인하세요! 제공된 UI 컨트롤을 사용하면 이제 크로마 키 색상, 픽업 범위 및 페이드 양을 실시간으로 조정하여 비디오 콘텐츠에 대해 원하는 크로마 키 기능을 얻을 수 있습니다.