midas+son의 크리에이티브(creative) 이야기

UGameViewportClient* Viewport = GetWorld()->GetGameViewport();

FVector2D pos = Viewport->GetWindow()->GetPositionInScreen();    //시작점. 전체 화면일 경우 -8, -8로 나왔다.(Win10)

FVector2D WH = Viewport->GetWindow()->GetViewportSize();    //실행창 크기. 위에 타이틀 바가 있다면 그 크기도 포함


ffmpeg라는 동영상 프로그램을 사용하기 위해 위의 값들이 필요했다.

원하는 위치부터 원하는 사이즈 만큼 

인자 값들을 넣기 위해 아래처럼 스트링을 만들어 영상 캡쳐가 성공했다.

int X = 0;    //ffmpeg에 들어갈 인자 값들이 int가 아니면 작동 안한다.

int Y = 0;

int Width = 0;

int Height = 0;


//가로축 컨트롤 + width

if (pos.X < 0)    //인자값 중 -offset_x 값이 -(음수)여도 동작 안한다.

{

X = 0;

Width = WH.X + pos.X * 2;    //더해진 만큼 좌우 값을 빼준다.  pos.X가 -이므로 

}

else

{

X = pos.X;

Width = WH.X;

}

//세로축 컨트롤 + Height

if (pos.Y < 0)    //인자값 중 -offset_y 값이 -(음수)여도 동작 안한다.

{

Y = 0; 

Height = WH.Y + pos.Y * 2;    //더해진 만큼 좌우 값을 빼준다.  pos.Y가 -이므로 

}

else

{

Y = pos.Y; 

Height = WH.Y;

}


//아래 코드는 ffmpeg를 실행하기 위한 코드

FString FilePath = FPaths::ConvertRelativePathToFull(FPaths::Combine(*FPaths::GameDir(), TEXT("Plugins/ThirdParty/ffmpeg/"), TEXT("ffmpeg.exe")));

FString Args = FString::Printf(TEXT("-f gdigrab -offset_x %d -offset_y %d -video_size %dx%d -i desktop -r 24000/1001 -q 1 -vf crop %s"), X, Y, Width, Height, *Filename);    //Filename은 인자로 받아온 저장될 파일 이름, 해상도는 -video_size 1024x768 이런 식으로 들어가야 함.

FString Cmd = FString::Printf(TEXT("%s %s %s"), *FilePath, *Args, *Filename);


TRACE("%s", *Cmd);

if (FPaths::FileExists(FilePath))

{

RecordHandle = FPlatformProcess::CreateProc(*FilePath, *Args, false, true, false, nullptr, 0, nullptr, nullptr);

}