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);*** |