버추얼 스튜디오

언리얼 엔진의 비디오 피드를 전문가급 SDI 카드 및 디바이스와 교환하는 방법을 보여주는 버추얼 스튜디오입니다.

Choose your operating system:

Windows

macOS

Linux

언리얼 엔진과 전문가 퀄리티의 AJA Video Systems 및 Blackmagic Design 비디오 카드를 통합하는 방법을 보여주는 버추얼 스튜디오입니다. 지원되는 카드가 있는 경우 이 프로젝트를 사용하여 언리얼 엔진과 비디오 프로덕션 파이프라인의 통합을 시작할 수 있습니다.

이 쇼케이스는 가상 사운드 스테이지 내부의 가상 데스크 뒤에서 실제 프레젠터가 등장해 실시간으로 합성되도록 구성되어 있습니다. 동일한 개념 및 설정을 사용하여 라이브 비디오 카드를 언리얼 엔진 레벨에 가져오고 렌더링된 결과를 출력 피드로 캡처하는 다른 사용 사례에 활용할 수 있습니다.

이 쇼케이스의 비디오 환경설정 구성에 관한 배경 정보는 AJA VideoBlackmagic Design 퀵 스타트 가이드와 다중 미디어 구성 지원 페이지를 참조하세요.

비디오 I/O 구성 시작하기

버추얼 스튜디오 쇼케이스는 3개의 서로 다른 미디어 환경설정으로 구성되며, 각각은 별도의 미디어 프로파일 에셋으로 정의됩니다.

  • AJAMediaProfile_24fps_10bit 는 SDI 입력 비디오 피드 및 출력 캡처를 AJA Video Systems의 디바이스와 교환합니다.
    기본적으로 10비트 스트림을 사용하여 초당 24프레임에서 Corvid 44 카드의 포트 1, 2로부터 입력을 가져오도록 구성됩니다.

  • BlackmagicMediaProfile_24fps_10bit 는 SDI 입력 비디오 피드 및 출력 캡처를 Blackmagic Design의 디바이스와 교환합니다.
    기본적으로 10비트 스트림을 사용하여 초당 24프레임에서 DeckLink Duo 2 카드의 포트 1, 2로부터 입력을 가져오도록 구성됩니다.

  • FileMediaProfile 은 기본적으로 디스크의 .mp4 파일로부터 입력을 가져오도록 구성됩니다.
    이는 프로젝트를 시작할 때 활성 상태가 되는 기본 환경설정이므로 지원되는 AJA 또는 Blackmagic 카드가 설치되지 않은 경우에도 즉시 비디오가 재생되는 것을 볼 수 있습니다.
    이 환경설정은 언리얼 엔진 또는 언리얼 에디터로부터 비디오를 캡처하도록 구성되어 있지 않습니다. 즉, 환경설정된 미디어 출력이 없습니다. 따라서 이 환경설정이 활성 상태인 동안 레벨로 비디오 피드가 수신되지만 발신되지는 않습니다.

환경설정을 전환하려면 현재 미디어 프로파일 옆에 있는 툴바의 아래쪽 화살표를 누르고, 드롭다운 메뉴에서 프로파일 선택(Select Profile) 을 선택한 다음, 활성화할 미디어 프로파일을 선택합니다.

다른 미디어 프로파일로 전환

기본 포트 할당 또는 초당 프레임, 이미지 해상도, 컬러 뎁스와 같은 미디어 세팅을 컴퓨터에서 사용하는 미디어 구성과 일치하도록 변경해야 하는 경우 미디어 프로파일 에셋을 더블클릭하여 프로퍼티를 열고 편집할 수 있습니다. VirtualSet/MediaProfiles 폴더에 미디어 프로파일 에셋이 있습니다.

미디어 프로파일 에셋

미디어 프로파일 작동 방식에 관한 자세한 내용은 다중 미디어 환경설정 지원을 참조하세요.

미디어 소스 및 재생

버추얼 스튜디오 쇼케이스에서는 2개의 미디어 번들을 사용하여 입력 비디오 피드를 가져오고 이를 레벨 뷰포트에 표시합니다. 

  • 기본적으로 1개만 보이도록 구성됩니다. 이 피드는 프레젠터의 데스크 뒤편 씬과 합성되어 표시됩니다.
    비디오 피드 1

  • 두 번째 비디오 피드는 언리얼 에디터에 숨겨져 있으므로 미디어 캡처 패널에서 또는 런타임에서 온스크린 캡처 컨트롤을 사용하여 카메라를 전환할 때까지 기본적으로 보이지 않습니다. 자세한 내용은 아래의 온스크린 캡처 컨트롤을 참조하세요. 언리얼 에디터의 뷰포트에서 이 두 번째 피드가 표시되도록 하려면 다음 단계를 따릅니다.

    1. 월드 아웃라이너(World Outliner) 에서 VirtualSetMediaInput2 액터를 선택합니다.
      VirtualSetMediaInput2 선택

    2. 디테일(Details) 패널에서 플레이트(Plate) > 에디터에 플레이트 표시(Show Plate in Editor) 옵션을 활성화합니다.
      에디터에 플레이트 표시

    이 두 번째 피드는 프레젠터의 데스크 뒤에 합성되지만 프레젠터의 오른쪽에 위치한 카메라에서 보도록 각도가 설계되어 있습니다.
    비디오 피드 2

미디어 번들 구성

프레젠터의 데스크 뒤에 있는 2개의 비디오 입력 평면은 각각 다음 미디어 번들을 사용하도록 구성됩니다. VirtualSet/Media/VideoBundle_01VirtualSet/Media/VideoBundle_02. 각 번들에는 _InnerAssets 접미사가 붙은 미디어 프레임워크 에셋이 포함된 폴더가 있습니다.

미디어 번들 에셋

미디어 번들을 처음부터 구성하는 방법을 알아보려면 AJA 미디어 I/O 퀵 스타트 가이드 또는 Blackmagic 미디어 I/O 퀵 스타트 가이드를 참조하세요.

버추얼 스튜디오 쇼케이스의 미디어 번들에 관해 한 가지 유의해야 할 사항은 대부분의 미디어 번들 에셋에서 사용되는 기본 블루프린트 클래스를 사용하지 않는다는 점입니다.

일반적으로 미디어 번들 에셋을 레벨에 드롭할 때 새 BP_MediaBundle_Plane_16-9 액터가 자동으로 스폰되어 레벨의 3D 공간에서 비디오를 보여줍니다. 이 기본 블루프린트에는 평면 컴포넌트가 포함되어 있으며, 이는 번들의 _InnerAssets 폴더에 생성된 미디어 텍스처를 참조하도록 자동 구성됩니다. 또한 연결된 미디어 소스로부터 오디오 재생을 처리하는 MediaSound 컴포넌트가 포함되어 있습니다.

버추얼 스튜디오에서 미디어 번들 에셋은 블루프린트 액터 BP_MediaBundle_Plane_16-9의 커스텀 서브클래스에 의해 레벨에 대신 표시됩니다. VirtualSet/Blueprints/VirtualSetMediaInput. 이 서브클래스는 월드 아웃라이너(World Outliner) 에 자손으로 할당된 특정 카메라 액터가 있을 것으로 예상되는 점을 제외하고, 부모 같은 역할을 합니다 레벨의 두 비디오 평면에 각각 카메라가 자손으로 있는 것을 확인할 수 있습니다.

미디어 번들 및 자손 카메라

이 커스텀 VirtualSetMediaInput 서브클래스는 에디터 뷰포트에서 플레이트를 표시하거나 숨기는 기능, 플레이트와 할당된 카메라 사이의 거리를 환경설정하는 기능을 추가합니다. VirtualSetMediaInput1 또는 VirtualSetMediaInput2 액터를 선택하면 디테일(Details) 패널의 플레이트(Plate) 카테고리에서 이 옵션을 설정할 수 있습니다.

플레이트 거리

이 세팅이 어떻게 구현되는지 확인하려면 블루프린트 클래스를 더블클릭하여 컨스트럭션 스크립트와 다른 함수를 확인합니다.

프록시 미디어 소스

레벨에 있는 2개의 미디어 번들은 각각 서로 다른 프록시 미디어 소스 에셋으로부터 비디오 피드를 가져오도록 환경설정됩니다. 예를 들어 VideoBundle_01 을 더블클릭하면 MediaProxySource_01 에셋을 소스로 사용하도록 구성된 것을 확인할 수 있습니다.

미디어 번들 소스 프록시

마찬가지로 VideoBundle_02MediaProxySource_02 에셋을 소스로 사용하도록 구성됩니다.

메인 메뉴에서 편집(Edit) > 프로젝트 세팅(Project Settings) 을 선택하여 프로젝트 세팅(Project Settings) 패널을 열면, 플러그인(Plugins) > 미디어 프로파일(Media Profile) 섹션에서 2개의 프록시 미디어 소스 에셋이 각각 미디어 소스 프록시(Media Source Proxy) 목록에서 참조되는 것을 알 수 있습니다.

이 목록에 있는 슬롯의 순서는 현재 미디어 프로파일의 슬롯 순서와 같습니다. 예를 들어 BlackmagicMediaProfile_24fps_10bit 는 2개의 입력 미디어 소스로 구성됩니다. 슬롯 0은 카드의 포트 1로부터 입력 피드를 읽고, 슬롯 1은 카드의 포트 2로부터 입력 피드를 읽습니다.

미디어 프로파일 소스 환경설정

이렇게 환경설정하면 Blackmagic 미디어 프로파일이 활성 상태인 동안 VideoBundle_01 은 하나의 프록시를 통해 카드의 포트 1로부터 입력 피드를 가져오고, VideoBundle_02 는 다른 프록시를 통해 카드의 포트 2로부터 입력 피드를 가져옵니다. 미디어 프로파일을 변경할 때 이러한 프록시는 입력 피드를 새 미디어 프로파일에 정의된 처음 2개의 입력 소스에 자동으로 다시 매핑하며, 레벨에서 보이는 비디오 피드를 즉시 변경합니다.

미디어 프록시 작동 방식에 관한 자세한 내용은 다중 미디어 구성 지원을 참조하세요.

키잉 및 컴포지팅

미디어 번들은 버추얼 3D 레벨에 앉아 있는 프레젠터를 두기 위해 중앙 데스크 뒤에 배치됩니다. 이 이펙트가 작동하려면 입력 비디오 스트림에서 프레젠터 뒤에 있는 백그라운드를 제거해야 합니다. 이를 위해 일반적으로는 녹색 화면(또는 파란색 화면) 앞에 앉아 있는 프레젠터를 녹화하고, 크로마 키잉 또는 휘도 필터링을 통해 백그라운드를 제거해야 합니다.

이 쇼케이스에서 사용하는 것과 같은 미디어 번들은 언리얼 엔진에서 라이브로 크로마 키잉 및 휘도 필터링을 수행할 수 있는 머티리얼 인스턴스를 사용하도록 자동 구성됩니다.

구성 방법:

  1. 콘텐츠 브라우저(Content Browser) 에서 구성할 미디어 번들을 찾아 엽니다. 

  2. 미디어 번들 에디터(Media Bundle Editor)의 툴바에서 머티리얼 에디터 열기(Open Material Editor) 버튼을 클릭하여 미디어 번들에서 레벨의 오브젝트에 비디오 피드를 가져오는 데 사용하는 머티리얼 인스턴스를 편집합니다.
    머티리얼 에디터 열기

  3. 머티리얼 인스턴스 에디터(Material Instance Editor)의 디테일(Details) 패널에서 Keyer_00 - Setup 섹션을 찾아 EnableKeyer 프로퍼티를 활성화합니다.
    Keyer 활성화

  4. EnableKeyer 프로퍼티가 활성화된 상태에서 머티리얼 인스턴스는 디테일(Details) 패널의 다른 Keyer 섹션에 새 프로퍼티를 표시합니다. 이러한 프로퍼티를 사용하여 비디오 스트림에서 제거할 컬러를 환경설정하고, 픽셀의 휘도, 크롭, 스트림 색 보정을 기준으로 스트림을 필터링할 수 있습니다.
    키잉 프로퍼티

출력 비디오 캡처

이 섹션의 지침에 따라 언리얼 엔진에서 비디오를 캡처하려면 AJA Video Systems 또는 Blackmagic Design의 지원되는 SDI 카드가 있어야 합니다.

언리얼 에디터에서 AJA 또는 Blackmagic 카드로 비디오 전송을 시작하려면 다음 단계를 따릅니다.

  1. 메인 메뉴에서 창(Window) > 미디어 캡처(Media Capture) 를 선택합니다. 이 창의 툴을 사용하여 언리얼 엔진으로부터 출력을 수신할 미디어 출력을 식별할 수 있습니다. 또한 각 출력으로 비디오를 전송할 레벨의 카메라 또는 렌더 타깃을 지정할 수 있습니다.
    아래 이미지에서 미디어 캡처(Media Capture) 창은 레벨의 두 카메라에서 MediaOutput_01 프록시 미디어 출력 에셋으로 브로드캐스트하도록 구성됩니다. 
    미디어 캡처 패널 환경설정
    버추얼 스튜디오 샘플의 프로젝트 세팅은 MediaOutput_01 로 전송된 비디오를 활성 미디어 프로파일에 환경설정된 첫 번째 출력 소스로 리디렉션되도록 구성됩니다. AjaMediaProfile_24fps_10bit 또는 BlackmagicMediaProfile_24fps_10bit 미디어 프로파일을 사용하는 경우 출력은 카드의 네 번째 포트로 전송됩니다. 

  2. 창 상단에 있는 캡처 아이콘을 클릭하여 캡처를 시작합니다.
    캡처

  3. 창 하단에서 잠긴 카메라 액터(Locked Camera Actors) 목록의 첫 번째 카메라의 뷰포인트를 보여주는 프리뷰가 표시됩니다. 카드의 네 번째 포트에 연결된 비디오 디바이스가 있는 경우, 같은 비디오가 해당 포트를 통해 전송되는 것을 확인할 수 있습니다.
    미디어 캡처 카메라 프리뷰
    미디어 캡처(Media Capture) 창은 잠긴 카메라 액터(Locked Camera Actors) 목록에 표시되는 각 카메라에 대한 프리뷰 위에 버튼을 배치합니다. 이 버튼을 사용하여 서로 다른 뷰포인트 사이에서 출력을 전환합니다.

쇼케이스는 또한 런타임 시 온스크린 컨트롤 UI를 사용하여 캡처가 비디오 카드로 전송되도록 구성됩니다. 시작하려면 다음 단계를 따릅니다.

  1. 툴바의 플레이(Play) 버튼 옆에 있는 화살표를 클릭하고, 새 에디터 창(New Editor Window)(PIE) 또는 독립형 게임(Standalone Game) 옵션 중 하나를 선택합니다.

    에디터에서의 비디오 캡처는 새 에디터 창(New Editor Window)(PIE) 또는 독립형 게임(Standalone Game) 에서 프로젝트를 플레이할 때만 작동합니다. 기본 선택된 뷰포트(Selected Viewport) 모드 또는 시뮬레이트(Simulate) 모드에서는 작동하지 않습니다.
    또한 프로젝트의 뷰포트 해상도, 즉 각 프레임에서 언리얼 엔진이 생성하는 렌더링된 이미지의 크기는 활성 미디어 프로파일에 설정된 출력 해상도와 일치해야 출력 비디오 피드에 적합한 크기가 됩니다.

  2. 프레젠터 데스크가 앞에 보이며, 왼쪽 상단에는 몇 가지 컨트롤이 있고, 레벨에 각 카메라의 섬네일 이미지가 있는 상태에서 시작합니다.

    • 현재의 카메라 뷰를 변경하려면 카메라 섬네일을 클릭하거나 다음 카메라(Next Camera) 버튼(1)을 클릭하여 카메라를 전환할 수 있습니다.

    • 비디오 출력 활성화(Enable Video Output) 체크 박스(2)를 토글하여 현재 뷰포트를 비디오 카드로 전송하거나 전송 중지합니다.

온스크린 런타임 캡처 컨트롤은 선택된 카메라 피드를 MediaOutputProxy_01 에셋으로 전송하도록 구성되며, 프로젝트 세팅은 현재의 미디어 프로파일에 구성된 첫 번째 출력으로 전달됩니다. 이 구성 방식에 관한 자세한 내용은 아래의 온스크린 캡처 컨트롤 섹션을 참조하세요.

온스크린 캡처 컨트롤

Virtual Set/Blueprints 폴더에서 온스크린 카메라 컨트롤 UI에 대한 에셋을 찾을 수 있습니다.

온스크린 캡처 컨트롤 에셋

  • CameraSwitcherUI UMG 위젯에는 다음 카메라(Next Camera) 버튼, 현재 뷰의 캡처를 토글하는 체크 박스 등 메인 온스크린 엘리먼트가 포함되어 있습니다.

  • 씬 뒤에서 UI를 클릭할 때 발생하는 모든 작업은 CameraSwitcher 블루프린트 클래스에서 처리됩니다. 이벤트 그래프에서 모든 카메라 스위칭 로직이 구현된 모습을 확인할 수 있습니다. 비디오 캡처 시작 및 중지와 관련된 로직은 두 곳에 위치합니다.

    • 이벤트 그래프에서 Create Media Capture 노드는 VideoOutputSettings 변수에 구성된 MediaOutputProxy_01 에셋에서 새 미디어 캡처 오브젝트를 생성하고, 이를 Media Capture 변수에 저장합니다.

    • Enable Video Output 함수에서 이 Media Capture 변수는 뷰포트 캡처를 시작 및 중지하는 데 사용됩니다.

  • CameraSwitcher 는 UI에서 관리해야 하는 모든 VirtualSetMediaInput 오브젝트의 목록으로 구성되어야 합니다. 레벨이 로드되면 CameraSwitcherUI 는 자동으로 이 목록의 각 입력에 대한 새 섬네일을 생성합니다.

CameraSwitcher 블루프린트 클래스의 인스턴스 1개가 레벨에 추가됩니다. 뷰포트 또는 월드 아웃라이너(World Outliner) 에서 이 액터를 선택하면 디테일(Details) 패널의 세팅을 사용하여 동작을 제어할 수 있습니다.

Camera Switcher 디테일

프로퍼티

설명

비디오 출력

Enable Output by Default

이 세팅을 활성화하면 프로젝트를 실행할 때 CameraSwitcher가 즉시 비디오 출력 캡처를 시작하고 Video Output Settings 에 설정된 미디어 출력으로 전송합니다.

Video Output Settings

CameraSwitcher가 미디어 캡처를 생성하고 비디오 출력을 SDI 디바이스로 전송하는 데 사용하는 미디어 출력 에셋을 설정합니다. 이 에셋에 대한 세팅은 어떤 디바이스, 그리고 해당 디바이스의 어떤 포트에서 캡처된 비디오 스트림을 수신할지 결정합니다. 기본적으로 프로젝트 세팅에서 구성된 VirtualSet/Media/MediaOutputProxy_01 에셋을 사용하여 그 출력을 활성 미디어 프로파일(있는 경우)에 정의된 첫 번째 출력 포트로 전송합니다.

카메라

Camera List

런타임 시 CameraSwitcher에서 관리할 수 있는 모든 VirtualSetMediaInput 액터가 나와 있습니다.
프로젝트를 실행할 때 CameraSwitcher UI는 이 목록의 각 액터에 대한 카메라 섬네일 이미지를 생성하여 해당 액터에서 관리하는 비디오 입력 스트림을 표시합니다.

유저 인터페이스

Show UI

프로젝트를 실행할 때 온스크린 CameraSwitcher UI가 표시되는지 여부를 결정합니다.

비디오 월

프레젠터의 왼쪽에 있는 대형 비디오 월은 미디어 프로파일의 입력을 사용하지 않습니다. 대체로 미디어 프레임워크에서 제공하는 기본 빌딩 블록을 사용하여 빌드됩니다.

Virtual_Studio_Kit/Textures/Video 폴더 내에서 비디오 월에 사용되는 미디어 프레임워크 에셋을 찾을 수 있습니다.

비디오 월 에셋

  • EngineFeatures 는 프로젝트의 Movies 폴더에 있는 .mp4 파일에서 비디오를 읽도록 설정된 파일 미디어 소스입니다. WallMediaPlayer 는 해당 EngineFeatures 파일 소스로부터의 비디오 재생을 제어합니다. 그리고 WallMediaPlayer 에셋이 생성되었을 때 해당되는 미디어 텍스처 에셋인 T_WallMediaPlayer 를 자동으로 생성하여 비디오 소스로부터 프레임 읽기를 수신했습니다.
    이러한 종류의 에셋을 생성하여 비디오 파일을 재생하기 위한 단계별 가이드는 비디오 파일 플레이 하우투 페이지를 참조하세요.

  • M_WallVideoPlayer 머티리얼은 T_WallMediaPlayer 미디어 텍스처로부터 픽셀을 샘플링하여 이미시브(Emissive) 출력으로 보냅니다. 이를 통해 화면에 렌더링될 때 비디오에 약간의 글로우가 더해집니다.
    비디오 월 머티리얼 그래프

  • 마지막으로 WallPlayerSetup 은 컨스트럭션 스크립트로 비디오 월의 반복 재생을 시작하는 블루프린트입니다. 이 클래스의 인스턴스는 이미 레벨에 배치되어 있으므로 레벨이 로드되고 클래스가 스폰될 때마다 비디오 월에서 비디오 재생이 시작됩니다. 이러한 방식으로 비디오 월은 언리얼 에디터를 사용 중인지 아니면 프로젝트를 실행 중인지와 상관없이 항상 백그라운드에서 재생됩니다.

    이미지를 클릭하면 최대 크기로 볼 수 있습니다.

모듈형 스튜디오 키트

버추얼 스튜디오 샘플에는 스태틱 메시, 머티리얼, 텍스처 등이 포함된 모듈형 에셋 라이브러리가 있습니다. 이러한 에셋을 사용하여 위의 섹션에 나온 디폴트 레벨에서 본 것과 유사한 스튜디오 레이아웃을 생성할 수 있습니다.

콘텐츠 브라우저의 Virtual_Studio_Kit 폴더에서 이 에셋 라이브러리를 찾을 수 있습니다.

또한 Maps 폴더에 사전 빌드된 스튜디오가 있는 여러 레벨이 있습니다.

언리얼 에디터에서 이 레벨을 열어 키트의 에셋만을 사용하여 구성할 수 있는 버추얼 스튜디오 레이아웃의 예시를 살펴볼 수 있습니다.

슬라이더를 드래그하여 샘플 스튜디오 레이아웃 보기

버추얼 스튜디오 샘플에서 작업을 시작할 때 열리는 기본 TrackerlessStudio 레벨과 달리 Maps 폴더에 있는 다른 샘플 스튜디오 레벨은 기본적으로 카메라와 미디어 플레이트가 구성되어 있지 않습니다. SDI 비디오 피드를 이러한 샘플 레벨 중 하나로 가져오려면 새 CineCamera 액터와 VirtualSetMediaInput 액터를 구성해야 합니다. 위 섹션을 따라 기본 레벨이 구성되는 방식을 이해하고, 이를 고유한 레벨에 적용하는 모델로 활용하세요.

언리얼 엔진의 이전 버전을 위해 작성된 페이지입니다. 현재 언리얼 엔진 5 버전을 위해 업데이트되지 않았습니다.