158 lines
5.3 KiB
Markdown
158 lines
5.3 KiB
Markdown
TsScreenPlayerTextureRenderer => AMultiViewActor
|
||
|
||
# 渲染逻辑
|
||
- UMultiViewRendererComponent::DrawMultiViewCameras()
|
||
|
||
渲染函数:GetRendererModule().BeginRenderingViewFamily(&SceneCanvas, &ViewFamily);
|
||
摄像机相关函数:FSceneView* UMultiViewRendererComponent::CalcSceneView(FSceneViewFamily* InViewFamily, UCineCameraComponent* InCamera,
|
||
const uint32 InViewIndex)
|
||
# 多屏与采集卡
|
||
以Preview为例:
|
||
TsDirectorCamManagerActor.ts
|
||
```c++
|
||
this.PreviewWindow = UE.MultiViewActor.Open(this.GetWorld(), UE.EMultiViewCameraLayout.Display_1920x1080_Layout_4x4, UE.EMultiViewMultiGPUMode.HalfSplit)
|
||
this.PreviewWindow.SetRenderFeaturePlanarReflection(false);
|
||
this.PreviewWindow.SetRenderFeatureNiagara(false);
|
||
|
||
// video output
|
||
let videoOutputParam = new UE.VideOutputParam()
|
||
videoOutputParam.bBlackMagicCard = false
|
||
videoOutputParam.bLazyStart = false
|
||
this.PreviewWindow.StartVideoOutput(videoOutputParam)
|
||
```
|
||
|
||
PVW&PGM使用 **BLACKMAGIC_OUTPUT_CONFIG_HORIZONTAL** 也就是/Game/ResArt/BlackmagicMedia/MO_BlackmagicVideoOutput。
|
||
```ts
|
||
export function StartVideoOutput(camManager : TsDirectorCamManagerActor, targetWindow : UE.MultiViewActor):void{
|
||
let videoOutpuParam = new UE.VideOutputParam()
|
||
videoOutpuParam.FilmbackMode = camManager.FilmbackMode
|
||
videoOutpuParam.OutputConfigPath = BLACKMAGIC_OUTPUT_CONFIG_HORIZONTAL
|
||
videoOutpuParam.bBlackMagicCard = true
|
||
videoOutpuParam.bLazyStart = false
|
||
if(camManager.FilmbackMode == UE.EFilmbackMode.EFM_1080x1920){
|
||
videoOutpuParam.MatV2H = GetV2HMaterialInstace(camManager)
|
||
}
|
||
targetWindow.StartVideoOutput(videoOutpuParam)
|
||
}
|
||
```
|
||
|
||
- DirectorMode.Preview:bBlackMagicCard = false
|
||
- PVW&PGM:bBlackMagicCard = true
|
||
|
||
## c++
|
||
核心函数在于**AMultiViewActor::StartVideoOutput**
|
||
|
||
# TS传入设置位置
|
||
- TsDirectorCamManagerActor.ts SwitchToDirectMode(newTag: UE.GameplayTag)
|
||
- FilmbackHelper.ts StartVideoOutput()
|
||
|
||
SwitchToDirectMode()
|
||
```ts
|
||
case DirectorMode.Preview:
|
||
console.log('启动Splite4x4预览窗口')
|
||
if (shouldCreateWindow) {
|
||
this.PreviewWindow = UE.MultiViewActor.Open(this.GetWorld(), UE.EMultiViewCameraLayout.Display_1920x1080_Layout_4x4, UE.EMultiViewMultiGPUMode.HalfSplit)
|
||
this.PreviewWindow.SetRenderFeaturePlanarReflection(false);
|
||
this.PreviewWindow.SetRenderFeatureNiagara(false);
|
||
|
||
// video output
|
||
let videoOutputParam = new UE.VideOutputParam()
|
||
videoOutputParam.bBlackMagicCard = false
|
||
videoOutputParam.bLazyStart = false
|
||
this.PreviewWindow.StartVideoOutput(videoOutputParam)
|
||
}
|
||
```
|
||
|
||
```ts
|
||
function StartVideoOutput(camManager : TsDirectorCamManagerActor, targetWindow : UE.MultiViewActor):void{
|
||
if(!BE_USE_DECKLINK){
|
||
let videoOutpuParam = new UE.VideOutputParam()
|
||
videoOutpuParam.FilmbackMode = camManager.FilmbackMode
|
||
videoOutpuParam.OutputConfigPath = BLACKMAGIC_OUTPUT_CONFIG_HORIZONTAL
|
||
videoOutpuParam.bBlackMagicCard = true
|
||
videoOutpuParam.bLazyStart = false
|
||
if(camManager.FilmbackMode == UE.EFilmbackMode.EFM_1080x1920){
|
||
videoOutpuParam.MatV2H = GetV2HMaterialInstace(camManager)
|
||
}
|
||
targetWindow.StartVideoOutput(videoOutpuParam)
|
||
}
|
||
}
|
||
```
|
||
# UDeckLinkMediaCapture
|
||
m_DeckLinkOutputDevice = DeckLinkDiscovery->GetDeviceByName(m_DeviceName);
|
||
|
||
```c++
|
||
FDeckLinkDeviceDiscovery::DeckLinkDeviceArrived(IDeckLink *device)
|
||
{
|
||
/*TComPtr<IDeckLink> device_;
|
||
device_ = device;*/
|
||
|
||
TComPtr<FDeckLinkOutputDevice> newDeviceComPtr = new FDeckLinkOutputDevice(device);
|
||
if (!newDeviceComPtr->Init())
|
||
return S_OK;
|
||
|
||
std::lock_guard<std::recursive_mutex> lock(m_DeviceMutex);
|
||
FString deviceName = newDeviceComPtr->GetDeviceName();//看这个Com对象的设备名称是否对应
|
||
if (!m_Devices.Contains(deviceName) )
|
||
{
|
||
m_Devices.Add(deviceName,newDeviceComPtr);
|
||
}
|
||
return S_OK;
|
||
}
|
||
```
|
||
|
||
DeckLinkDeviceArrived调用逻辑位于**DeckLinkAPI_h.h**。
|
||
|
||
## ADeckLinkOutputActor
|
||
ADeckLinkOutputActor的DeviceName 默认值为"DeckLink Mini Monitor 4K";
|
||
|
||
判断错误函数
|
||
UMediaCapture::CaptureTextureRenderTarget2D()=>UMediaCapture::StartSourceCapture() => ValidateMediaOutput()
|
||
```c++
|
||
bool UMediaCapture::ValidateMediaOutput() const
|
||
{
|
||
if (MediaOutput == nullptr)
|
||
{ UE_LOG(LogMediaIOCore, Error, TEXT("Can not start the capture. The Media Output is invalid."));
|
||
return false;
|
||
}
|
||
FString FailureReason;
|
||
if (!MediaOutput->Validate(FailureReason))
|
||
{ UE_LOG(LogMediaIOCore, Error, TEXT("Can not start the capture. %s."), *FailureReason);
|
||
return false;
|
||
}
|
||
if(DesiredCaptureOptions.bAutostopOnCapture && DesiredCaptureOptions.NumberOfFramesToCapture < 1)
|
||
{ UE_LOG(LogMediaIOCore, Error, TEXT("Can not start the capture. Please set the Number Of Frames To Capture when using Autostop On Capture in the Media Capture Options"));
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
```
|
||
|
||
```c++
|
||
bool UDeckLinkMediaCapture::InitBlackmagic(int _Width, int _Height)
|
||
{
|
||
if (DeckLinkDiscovery == nullptr)
|
||
{
|
||
return false;
|
||
}
|
||
Width = _Width;
|
||
Height = _Height;
|
||
check(Height > 0 && Width > 0)
|
||
BMDDisplayMode displayMode = GetDisplayMode(Width, Height);
|
||
m_DeckLinkOutputDevice = DeckLinkDiscovery->GetDeviceByName(m_DeviceName);
|
||
if (m_DeckLinkOutputDevice.Get() == nullptr)
|
||
{
|
||
return false;
|
||
}
|
||
if (!m_DeckLinkOutputDevice->EnableOutput(displayMode, bmdFormat8BitYUV))
|
||
{
|
||
m_DeckLinkOutputDevice.Reset();
|
||
return false;
|
||
}
|
||
|
||
|
||
return true;
|
||
}
|
||
```
|
||
|
||
***DeckLinkDiscovery->GetDeviceByName(m_DeviceName);*** |