UnrealImageCapture
UnrealImageCapture copied to clipboard
Sample Project and plugins seems to crash when attempting render in UE 5.0.3 and 5.1.0
As the title claims, I cannot get a image capture to compleate without crashing unreal. I've tried compilin the sample project in both UE 5.0.3 and 5.1.0, and also tried installing it as a plugin in a fresh project. Same result.
I'm triggering the capture in a utility widget like so.

Error message always throws at line 185 in "C:\Users\*****\Documents\Unreal Projects\ImageCapture\Plugins\CameraCaptureToDisk\Source\CameraCaptureToDisk\Private\CameraCaptureManager.cpp". Attempting to run a float-non-blocking results in similar crash at line 250.
Error:
LoginId:9b7e3dc9443559f5ff884dad673f1823
EpicAccountId:1ea2120a2eaa42989234477b1afde595
Unhandled Exception: EXCEPTION_ACCESS_VIOLATION writing address 0x00000000000004b0
UnrealEditor_CameraCaptureToDisk!ACameraCaptureManager::CaptureNonBlocking() [C:\Users\******\Desktop\CaptureToDisk\Plugins\CameraCaptureToDisk\Source\CameraCaptureToDisk\Private\CameraCaptureManager.cpp:185]
UnrealEditor_CoreUObject
UnrealEditor_CoreUObject
UnrealEditor_CoreUObject
UnrealEditor_CoreUObject
UnrealEditor_CoreUObject
UnrealEditor_CoreUObject
UnrealEditor_CoreUObject
UnrealEditor_CoreUObject
UnrealEditor_CoreUObject
UnrealEditor_CoreUObject
UnrealEditor_UMG
UnrealEditor_UMG
UnrealEditor_UMG
UnrealEditor_Slate
UnrealEditor_Slate
UnrealEditor_Slate
UnrealEditor_Slate
UnrealEditor_Slate
UnrealEditor_Slate
UnrealEditor_Slate
UnrealEditor_ApplicationCore
UnrealEditor_ApplicationCore
UnrealEditor_ApplicationCore
UnrealEditor_ApplicationCore
user32
user32
UnrealEditor_ApplicationCore
UnrealEditor
UnrealEditor
UnrealEditor
UnrealEditor
UnrealEditor
UnrealEditor
kernel32
ntdll
+1 Same here. It compiles nicely but trying to place a CaptureManager or inherit from it crashes my editor.
Here's a proper stacktrace with debug symbols enabled:
Unhandled Exception: EXCEPTION_ACCESS_VIOLATION reading address 0x00007ffa2e8f9000
VCRUNTIME140
UnrealEditor_Engine!UE::Transaction::Internal::FSerializedObjectDataWriterCommon::Serialize() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\TransactionCommon.cpp:254]
UnrealEditor_Core!FStructuredArchiveSlot::operator<<() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Private\Serialization\StructuredArchiveSlots.cpp:150]
UnrealEditor_CoreUObject!FByteProperty::SerializeItem() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\PropertyByte.cpp:59]
UnrealEditor_CoreUObject!FArrayProperty::SerializeItem() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\PropertyArray.cpp:367]
UnrealEditor_CoreUObject!FPropertyTag::SerializeTaggedProperty() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\PropertyTag.cpp:253]
UnrealEditor_CoreUObject!UStruct::SerializeVersionedTaggedProperties() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\Class.cpp:1590]
UnrealEditor_CoreUObject!UStruct::SerializeTaggedProperties() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\Class.cpp:1279]
UnrealEditor_CoreUObject!UObject::SerializeScriptProperties() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\Obj.cpp:1633]
UnrealEditor_CoreUObject!UObject::Serialize() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\Obj.cpp:1454]
UnrealEditor_CoreUObject!UObject::Serialize() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\Obj.cpp:1338]
UnrealEditor_Engine!AActor::Serialize() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\Actor.cpp:837]
UnrealEditor_UnrealEd!FTransaction::FObjectRecord::SerializeObject() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\EditorTransaction.cpp:183]
UnrealEditor_UnrealEd!FTransaction::FObjectRecord::FObjectRecord() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\EditorTransaction.cpp:73]
UnrealEditor_UnrealEd!FTransaction::SaveObject() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\EditorTransaction.cpp:627]
UnrealEditor_CoreUObject!SaveToTransactionBuffer() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\UObjectGlobals.cpp:2977]
UnrealEditor_CoreUObject!StaticConstructObject_Internal() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\UObjectGlobals.cpp:4216]
UnrealEditor_Engine!UWorld::SpawnActor() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\LevelActor.cpp:660]
UnrealEditor_Engine!UWorld::SpawnActor() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\LevelActor.cpp:440]
UnrealEditor_UnrealEd!UEditorEngine::AddActor() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\EditorEngine.cpp:6525]
UnrealEditor_UnrealEd!FLevelEditorViewportClient::TryPlacingActorFromObject() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\LevelEditorViewport.cpp:242]
UnrealEditor_UnrealEd!FLevelEditorViewportClient::DropObjectsOnActor() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\LevelEditorViewport.cpp:1123]
UnrealEditor_UnrealEd!FLevelEditorViewportClient::DropObjectsAtCoordinates() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\LevelEditorViewport.cpp:1566]
UnrealEditor_LevelEditor!SLevelViewport::HandlePlaceDraggedObjects() [D:\build\++UE5\Sync\Engine\Source\Editor\LevelEditor\Private\SLevelViewport.cpp:971]
UnrealEditor_LevelEditor!SLevelViewport::OnDrop() [D:\build\++UE5\Sync\Engine\Source\Editor\LevelEditor\Private\SLevelViewport.cpp:1049]
UnrealEditor_Slate!<lambda_471858b7e70a8b68bd65bc435c2a047c>::operator()() [D:\build\++UE5\Sync\Engine\Source\Runtime\Slate\Private\Framework\Application\SlateApplication.cpp:5088]
UnrealEditor_Slate!FEventRouter::Route<FReply,FEventRouter::FBubblePolicy,FPointerEvent,<lambda_471858b7e70a8b68bd65bc435c2a047c> >() [D:\build\++UE5\Sync\Engine\Source\Runtime\Slate\Private\Framework\Application\SlateApplication.cpp:412]
UnrealEditor_Slate!FSlateApplication::RoutePointerUpEvent() [D:\build\++UE5\Sync\Engine\Source\Runtime\Slate\Private\Framework\Application\SlateApplication.cpp:5083]
UnrealEditor_Slate!FSlateApplication::ProcessMouseButtonUpEvent() [D:\build\++UE5\Sync\Engine\Source\Runtime\Slate\Private\Framework\Application\SlateApplication.cpp:5601]
UnrealEditor_Slate!FSlateApplication::OnMouseUp() [D:\build\++UE5\Sync\Engine\Source\Runtime\Slate\Private\Framework\Application\SlateApplication.cpp:5566]
UnrealEditor_ApplicationCore!FWindowsApplication::ProcessDeferredMessage() [D:\build\++UE5\Sync\Engine\Source\Runtime\ApplicationCore\Private\Windows\WindowsApplication.cpp:2219]
UnrealEditor_ApplicationCore!FWindowsApplication::DeferMessage() [D:\build\++UE5\Sync\Engine\Source\Runtime\ApplicationCore\Private\Windows\WindowsApplication.cpp:2726]
UnrealEditor_ApplicationCore!FWindowsApplication::ProcessMessage() [D:\build\++UE5\Sync\Engine\Source\Runtime\ApplicationCore\Private\Windows\WindowsApplication.cpp:1895]
UnrealEditor_ApplicationCore!FWindowsApplication::AppWndProc() [D:\build\++UE5\Sync\Engine\Source\Runtime\ApplicationCore\Private\Windows\WindowsApplication.cpp:925]
user32
user32
InkObj
atlthunk
user32
user32
UnrealEditor_ApplicationCore!FWindowsPlatformApplicationMisc::PumpMessages() [D:\build\++UE5\Sync\Engine\Source\Runtime\ApplicationCore\Private\Windows\WindowsPlatformApplicationMisc.cpp:142]
UnrealEditor!FEngineLoop::Tick() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\LaunchEngineLoop.cpp:5291]
UnrealEditor!GuardedMain() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\Launch.cpp:202]
UnrealEditor!GuardedMainWrapper() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:107]
UnrealEditor!LaunchWindowsStartup() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:244]
UnrealEditor!WinMain() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:282]
UnrealEditor!__scrt_common_main_seh() [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288]
kernel32
ntdll
EDIT: Getting this error during runtime now when trying to call CaptureNonBlocking
Hey, thanks for the bump and sorry for not getting back to you earlier - you got lost in the Christmas holiday 🙈
I just clone the repo as is and updated my engine to UE 5.1.0. However, I cannot reproduce your crashes... I was able to get grab images in all data-types.
@agaertner Do you happen to make the call automatically, immediately in the very first tick of your game? Because I see the Tick() call in the trace... I once had that issue - for some reason you need to wait for some frames before the components are all ready.
@voxlz Can you check line 185 (where the color capture crashes) for me? Because strangely that is where Gamma is set and not an image grabbing section- maybe the SceneCapture is not connected correctly? :/
UnrealEditor_unreal_minirov_patch_0!ACaptureManager::CaptureNonBlocking() [I:\Repositories\MARUM\unreal-minirov\Source\unreal_minirov\Private\CaptureManager.cpp:61]
UnrealEditor_CoreUObject!UFunction::Invoke() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\Class.cpp:6455]
UnrealEditor_CoreUObject!UObject::CallFunction() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\ScriptCore.cpp:1118]
UnrealEditor_CoreUObject!UObject::ProcessContextOpcode() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\ScriptCore.cpp:3084]
UnrealEditor_CoreUObject!ProcessLocalScriptFunction() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\ScriptCore.cpp:1188]
UnrealEditor_CoreUObject!ProcessScriptFunction<void (__cdecl*)(UObject *,FFrame &,void *)>() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\ScriptCore.cpp:1018]
UnrealEditor_CoreUObject!ProcessLocalFunction() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\ScriptCore.cpp:1258]
UnrealEditor_CoreUObject!ProcessLocalScriptFunction() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\ScriptCore.cpp:1188]
UnrealEditor_CoreUObject!UObject::ProcessInternal() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\ScriptCore.cpp:1285]
UnrealEditor_CoreUObject!UFunction::Invoke() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\Class.cpp:6455]
UnrealEditor_CoreUObject!UObject::ProcessEvent() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\ScriptCore.cpp:2116]
UnrealEditor_Engine!AActor::ProcessEvent() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\Actor.cpp:1055]
UnrealEditor_Engine!AActor::ReceiveTick() [D:\build\++UE5\Sync\Engine\Intermediate\Build\Win64\UnrealEditor\Inc\Engine\UHT\Actor.gen.cpp:2161]
UnrealEditor_Engine!AActor::Tick() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\Actor.cpp:1430]
UnrealEditor_Engine!AActor::TickActor() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\Actor.cpp:1410]
UnrealEditor_Engine!FActorTickFunction::ExecuteTick() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\Actor.cpp:222]
UnrealEditor_Engine!FTickFunctionTask::DoTask() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\TickTaskManager.cpp:284]
UnrealEditor_Engine!TGraphTask<FTickFunctionTask>::ExecuteTask() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Public\Async\TaskGraphInterfaces.h:1348]
UnrealEditor_Core!FNamedTaskThread::ProcessTasksNamedThread() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Private\Async\TaskGraph.cpp:760]
UnrealEditor_Core!FNamedTaskThread::ProcessTasksUntilQuit() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Private\Async\TaskGraph.cpp:649]
UnrealEditor_Core!FTaskGraphCompatibilityImplementation::WaitUntilTasksComplete() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Private\Async\TaskGraph.cpp:2203]
UnrealEditor_Engine!FTickTaskSequencer::ReleaseTickGroup() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\TickTaskManager.cpp:565]
UnrealEditor_Engine!FTickTaskManager::RunTickGroup() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\TickTaskManager.cpp:1592]
UnrealEditor_Engine!UWorld::RunTickGroup() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\LevelTick.cpp:794]
UnrealEditor_Engine!UWorld::Tick() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\LevelTick.cpp:1537]
UnrealEditor_UnrealEd!UEditorEngine::Tick() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\EditorEngine.cpp:1890]
UnrealEditor_UnrealEd!UUnrealEdEngine::Tick() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\UnrealEdEngine.cpp:517]
UnrealEditor!FEngineLoop::Tick() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\LaunchEngineLoop.cpp:5367]
UnrealEditor!GuardedMain() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\Launch.cpp:202]
UnrealEditor!GuardedMainWrapper() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:107]
UnrealEditor!LaunchWindowsStartup() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:244]
UnrealEditor!WinMain() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:282]
UnrealEditor!__scrt_common_main_seh() [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288]
kernel32
ntdll
This is the line its referencing at the top:
void ACaptureManager::CaptureNonBlocking() {
if (!IsValid(CaptureComponent)) {
UE_LOG(LogTemp, Error, TEXT("CaptureColorNonBlocking: CaptureComponent was not valid!"));
return;
}
// reference in stacktrace
CaptureComponent->GetCaptureComponent2D()->TextureTarget->TargetGamma = GEngine->GetDisplayGamma();
[...]
My BP setup:

ObserverEnabled is set to true after SceneCapture2D has been created and assigned to the CaptureManager.
Okay, I can think of two things of the top of my head:
- as mentioned above - if this is executed very early in the game/simulation - you can try to either delay it or for testing's sake add a button event to trigger the capture manually from the keyboard. This is just to make sure it's not because of some random hiccups in the engine setting up components in the world.
- Do try a nullptr / Valid check on every part of the component chain here: CamptureComponent2D* TextureTarget*. If the code crashes here it really looks like a nullptr or otherwise invalid component sneaked into the setup..
I hope this does something for you :+1:
Okay, I can think of two things of the top of my head:
- as mentioned above - if this is executed very early in the game/simulation - you can try to either delay it or for testing's sake add a button event to trigger the capture manually from the keyboard. This is just to make sure it's not because of some random hiccups in the engine setting up components in the world.
- Do try a nullptr / Valid check on every part of the component chain here: CamptureComponent2D* TextureTarget*. If the code crashes here it really looks like a nullptr or otherwise invalid component sneaked into the setup..
I hope this does something for you 👍
It actually spawns the manager on startup and spawns the scenecapture on keyboard press.
I will try adding other checks then.
The issue was that the SceneCapture2D had no TextureTarget by default. I fixed that ~~by creating a child BP with a default render target.~~ (Edit: Scratched. I forgot about SetupCaptureComponent which creates a target texture on runtime.)
Now I have another crash further down with the following stacktrace (fixed, see below):
Assertion failed: RawSize < Height* InBytesPerRow [File:./Runtime/ImageWrapper/Private/ImageWrapperBase.cpp] [Line: 139]
libUnrealEditor-ImageWrapper.so!FImageWrapperBase::SetRaw(void const*, long long, int, int, ERGBFormat, int, int) [/mnt/horde/++UE5/Sync/Engine/Source/./Runtime/ImageWrapper/Private/ImageWrapperBase.cpp:139]
libUnrealEditor-unreal_minirov.so!ACaptureManager::Tick(float) [/home/agaertner/repos/unreal-minirov/Source/unreal_minirov/Private/CaptureManager.cpp:246]
libUnrealEditor-Engine.so!FActorTickFunction::ExecuteTick(float, ELevelTick, ENamedThreads::Type, TRefCountPtr<FGraphEvent> const&) [/mnt/horde/++UE5/Sync/Engine/Source/./Runtime/Engine/Private/Actor.cpp:222]
libUnrealEditor-Engine.so!FTickFunctionTask::DoTask(ENamedThreads::Type, TRefCountPtr<FGraphEvent> const&) [/mnt/horde/++UE5/Sync/Engine/Source/./Runtime/Engine/Private/TickTaskManager.cpp:284]
libUnrealEditor-Engine.so!TGraphTask<FTickFunctionTask>::ExecuteTask(TArray<FBaseGraphTask*, TSizedDefaultAllocator<32> >&, ENamedThreads::Type, bool) [/mnt/horde/++UE5/Sync/Engine/Source/Runtime/Core/Public/Async/TaskGraphInterfaces.h:1348]
libUnrealEditor-Core.so!FNamedTaskThread::ProcessTasksNamedThread(int, bool) [/mnt/horde/++UE5/Sync/Engine/Source/./Runtime/Core/Private/Async/TaskGraph.cpp:760]
libUnrealEditor-Core.so!FNamedTaskThread::ProcessTasksUntilQuit(int) [/mnt/horde/++UE5/Sync/Engine/Source/./Runtime/Core/Private/Async/TaskGraph.cpp:648]
libUnrealEditor-Core.so!FTaskGraphCompatibilityImplementation::ProcessThreadUntilRequestReturn(ENamedThreads::Type) [/mnt/horde/++UE5/Sync/Engine/Source/./Runtime/Core/Private/Async/TaskGraph.cpp:2149]
libUnrealEditor-Core.so!FTaskGraphCompatibilityImplementation::WaitUntilTasksComplete(TArray<TRefCountPtr<FGraphEvent>, TSizedInlineAllocator<4u, 32, TSizedDefaultAllocator<32> > > const&, ENamedThreads::Type) [/mnt/horde/++UE5/Sync/Engine/Source/./Runtime/Core/Private/Async/TaskGraph.cpp:2203]
libUnrealEditor-Engine.so!FTickTaskSequencer::ReleaseTickGroup(ETickingGroup, bool) [/mnt/horde/++UE5/Sync/Engine/Source/./Runtime/Engine/Private/TickTaskManager.cpp:564]
libUnrealEditor-Engine.so!FTickTaskManager::RunTickGroup(ETickingGroup, bool) [/mnt/horde/++UE5/Sync/Engine/Source/./Runtime/Engine/Private/TickTaskManager.cpp:1591]
libUnrealEditor-Engine.so!UWorld::Tick(ELevelTick, float) [/mnt/horde/++UE5/Sync/Engine/Source/./Runtime/Engine/Private/LevelTick.cpp:1537]
libUnrealEditor-UnrealEd.so!UEditorEngine::Tick(float, bool) [/mnt/horde/++UE5/Sync/Engine/Source/./Editor/UnrealEd/Private/EditorEngine.cpp:1888]
libUnrealEditor-UnrealEd.so!UUnrealEdEngine::Tick(float, bool) [/mnt/horde/++UE5/Sync/Engine/Source/./Editor/UnrealEd/Private/UnrealEdEngine.cpp:514]
UnrealEditor!FEngineLoop::Tick() [/mnt/horde/++UE5/Sync/Engine/Source/./Runtime/Launch/Private/LaunchEngineLoop.cpp:5361]
UnrealEditor!GuardedMain(char16_t const*) [/mnt/horde/++UE5/Sync/Engine/Source/./Runtime/Launch/Private/Launch.cpp:204]
libUnrealEditor-UnixCommonStartup.so!CommonUnixMain(int, char**, int (*)(char16_t const*), void (*)()) [/mnt/horde/++UE5/Sync/Engine/Source/Runtime/Unix/UnixCommonStartup/Private/UnixCommonStartup.cpp:269]
libc.so.6!UnknownFunction(0x29d8f)
libc.so.6!__libc_start_main(+0x7f)
UnrealEditor!_start()
FIXED
My setup is that I create a CaptureManager before I have a SceneCapture2D but SetupCaptureComponent is only called once after creation during BeginPlay. My SceneCapture2D can be created on runtime (after an arbitrary amount of time passed with the press of a key).
So what I had to do is make the scope of theSetupCaptureComponent method public and annotate it as BlueprintCallable so I can use it whenever I assign a new SceneCapture2D from within my BP. This gives the CaptureManager more flexibility anyway and I don't have to recreate it for the SetupCaptureComponent to be called.
Now it works perfectly. I will have to change the save directory to point to some other partition because FPaths::ProjectSavedDir()points to the home/ saved dir of UnrealEngine on my linux machine (ie. /home/user/.config/Epic/UnrealEngine/5.1/Saved/observer/)
Hopefully this little documentation will help some people with above problem.
Ah, nice! Indeed, there are still many quirks that I am unaware of - thanks for sharing!
I might create a fork someday and do some PRs if I can get to it (pretty busy right now). Though, what I can say is a feature that I needed was access to the TArrayTArray<uint8> CurrentFrame field and assigning it with the raw data before the Saving To Disk part. I also added a boolean SaveToDisk because the saving to disk is more like a debug helper for me.