Skip to main content
Version: 2.4.1

Access RGB Camera and Record Video

Device Compatibility

Currently, the RGB Camera is only supported on the following devices:

  • XREAL Light

For those devices that do not support the RGB Camera, you can record the virtual content in the scene.

Developer Guide

Import the NRSDK

Import NRSDKForUnity.unitypackage.

Open the Sample Scene

Navigate to the Unity Project window and locate the CameraCaptureDemo sample in the following directory: Assets > NRSDK > Demos > RGBCamera-Record.

To integrate this functionality into your scene, instantiate the "VideoCaptureExample" GameObject as a prefab and add it to your scene hierarchy.

image-20241008170833720

Configure the Blend Mode parameter according to your specific requirements:

  • Blend: Captures both the RGB Camera feed and the real-world environment.
  • RGB Only: Records only the RGB Camera content.
  • Virtual Only: Captures exclusively the virtual content within the scene.

image-20241008170801451

Inspect the Sample Code

  • See CameraCaptureController.cs , located in Assets/NRSDK/Demos/RGBCamera/Scripts/CameraCaptureController.cs for an example on how to get the texture of RGB Camera.
public RawImage CaptureImage;

private void Start()
{
RGBCamTexture = new NRRGBCamTexture();
CaptureImage.texture = RGBCamTexture.GetTexture();
RGBCamTexture.Play();
}
  • See VideoCapture2LocalExample.cs, located in Assets/NRSDK/Demos/Record/Scriptsfor an example on how to implement video capture
// A video Capture Example
public class VideoCapture2LocalExample : MonoBehaviour
{
/// <summary> The previewer. </summary>
public NRPreviewer Previewer;
public VideoRecordConfigPanel m_ConfigPanel;

/// <summary> Save the video to Application.persistentDataPath. </summary>
/// <value> The full pathname of the video save file. </value>
public string VideoSavePath
{
get
{
string timeStamp = Time.time.ToString().Replace(".", "").Replace(":", "");
string filename = string.Format("Nreal_Record_{0}.mp4", timeStamp);
return Path.Combine(Application.persistentDataPath, filename);
}
}

/// <summary> The video capture. </summary>
NRVideoCapture m_VideoCapture = null;

/// <summary> Starts this object. </summary>
void Start()
{
CreateVideoCaptureTest();
}

/// <summary> Tests create video capture. </summary>
void CreateVideoCaptureTest()
{
NRVideoCapture.CreateAsync(false, delegate (NRVideoCapture videoCapture)
{
NRDebugger.Info("Created VideoCapture Instance!");
if (videoCapture != null)
{
m_VideoCapture = videoCapture;
}
else
{
NRDebugger.Error("Failed to create VideoCapture Instance!");
}
});
}

/// <summary> Starts video capture. </summary>
public void StartVideoCapture()
{
if (m_VideoCapture != null)
{
CameraParameters cameraParameters = new CameraParameters();
if (m_ConfigPanel == null)
{
Resolution cameraResolution = NRVideoCapture.SupportedResolutions.OrderByDescending((res) => res.width * res.height).First();
cameraParameters.hologramOpacity = 0.0f;
cameraParameters.frameRate = cameraResolution.refreshRate;
cameraParameters.cameraResolutionWidth = cameraResolution.width;
cameraParameters.cameraResolutionHeight = cameraResolution.height;
cameraParameters.pixelFormat = CapturePixelFormat.BGRA32;
// Set the blend mode.
cameraParameters.blendMode = BlendMode.Blend;
// Set audio state, audio record needs the permission of "android.permission.RECORD_AUDIO",
// Add it to your "AndroidManifest.xml" file in "Assets/Plugin".
cameraParameters.audioState = NRVideoCapture.AudioState.MicAudio;
}
else
{
cameraParameters = m_ConfigPanel.GetRecordConfigration();
}

m_VideoCapture.StartVideoModeAsync(cameraParameters, OnStartedVideoCaptureMode);
}
}

/// <summary> Stops video capture. </summary>
public void StopVideoCapture()
{
if (m_VideoCapture == null)
{
return;
}

NRDebugger.Info("Stop Video Capture!");
m_VideoCapture.StopRecordingAsync(OnStoppedRecordingVideo);
Previewer.SetData(m_VideoCapture.PreviewTexture, false);
}

/// <summary> Executes the 'started video capture mode' action. </summary>
/// <param name="result"> The result.</param>
void OnStartedVideoCaptureMode(NRVideoCapture.VideoCaptureResult result)
{
if (!result.success)
{
NRDebugger.Info("Started Video Capture Mode faild!");
return;
}

NRDebugger.Info("Started Video Capture Mode!");
m_VideoCapture.StartRecordingAsync(VideoSavePath, OnStartedRecordingVideo);
// Set preview texture.
Previewer.SetData(m_VideoCapture.PreviewTexture, true);
}

/// <summary> Executes the 'started recording video' action. </summary>
/// <param name="result"> The result.</param>
void OnStartedRecordingVideo(NRVideoCapture.VideoCaptureResult result)
{
if (!result.success)
{
NRDebugger.Info("Started Recording Video Faild!");
return;
}

NRDebugger.Info("Started Recording Video!");
if (m_ConfigPanel != null && m_ConfigPanel.UseGreenBackground)
{
// Set green background color.
m_VideoCapture.GetContext().GetBehaviour().SetBackGroundColor(Color.green);
}
}

/// <summary> Executes the 'stopped recording video' action. </summary>
/// <param name="result"> The result.</param>
void OnStoppedRecordingVideo(NRVideoCapture.VideoCaptureResult result)
{
if (!result.success)
{
NRDebugger.Info("Stopped Recording Video Faild!");
return;
}

NRDebugger.Info("Stopped Recording Video!");
m_VideoCapture.StopVideoModeAsync(OnStoppedVideoCaptureMode);
}

/// <summary> Executes the 'stopped video capture mode' action. </summary>
/// <param name="result"> The result.</param>
void OnStoppedVideoCaptureMode(NRVideoCapture.VideoCaptureResult result)
{
NRDebugger.Info("Stopped Video Capture Mode!");
}
}

Build and Run the Sample App

  • Audio record needs the permission of “android.permission.RECORD_AUDIO”, Add it to your “AndroidManifest.xml” file in “Assets/Plugin”.
  • The Previewer is used to preview live images in real time, for debugging purposes. Click the APP key of the controller to show or hide it.
  • Click the Start button to start video capture.
  • Click the Stop button to stop video capture. It will save the video file to “Application.persistentDataPath” path.