Skip to content

Access Recordings

Learn how to get the recorded videos from the Result<CameraResult, CameraError> type in the Camera’s onDismiss closure.

Success

A Recording has a duration and contains an array of Videos. The array contains either one Video (for single camera recordings or a video that was reacted to) or two Videos (for dual camera recordings.)

Each Video has:

public struct Video: Equatable, Sendable {
/// The URL of the recorded video file.
public let url: URL
/// The position and size of the video.
public let rect: CGRect
}
  • A url to the video file that is stored in a temporary location. Make sure to copy the file to a permanent location if you want to access it later.
  • A rect that contains the position of each video as it was shown in the camera preview. For dual camera recordings, you can use these CGRects to arrange the videos as they were laid out in the camera.

Standard and Dual Camera

If the user has recorded videos, the .recording case will contain an array of Recordings, each representing a segment of the recorded video.

case let .success(.recording(recordings)):
for recording in recordings {
print(recording.duration)
for video in recording.videos {
print(video.url)
print(video.rect)
}
}

Video Reaction

If the user has recorded a reaction, the .reaction case will contain the video that was reacted to and an array of Recordings, each representing a segment of the recorded video.

case let .success(.reaction(video, reactionRecordings)):
print(video.duration)
for recording in reactionRecordings {
print(recording.duration)
for video in recording.videos {
print(video.url)
print(video.rect)
}
}

Failure

The .failure case has an associated value of CameraError, which is either .cancelled if the user has cancelled the camera without recording anything, or .permissionsMissing if the user has not allowed accessing their camera and/or microphone.

case let .failure(error):
print(error.localizedDescription)
isPresented = false

Full Code

Here’s the full code:

import IMGLYCamera
import SwiftUI
struct RecordingsCameraSolution: View {
let settings = EngineSettings(license: secrets.licenseKey,
userID: "<your unique user id>")
@State private var isPresented = false
var body: some View {
Button("Use the Camera") {
isPresented = true
}
.fullScreenCover(isPresented: $isPresented) {
Camera(settings) { result in
switch result {
case let .success(.recording(recordings)):
for recording in recordings {
print(recording.duration)
for video in recording.videos {
print(video.url)
print(video.rect)
}
}
case let .success(.reaction(video, reactionRecordings)):
print(video.duration)
for recording in reactionRecordings {
print(recording.duration)
for video in recording.videos {
print(video.url)
print(video.rect)
}
}
case let .failure(error):
print(error.localizedDescription)
isPresented = false
}
}
}
}
}