It actually required to be on the queue you set delegate to. It can be main queue/actor, though it’s not recommended practice.
By capture session and all other related parties being isolated to an actor, your accesses to it would be ensured to happen only on that actor and never leave it, which will eliminate sendability warnings and give you compile time safety for concurrency.
Roughly, that would be
actor Camera {
// don’t remember exactly naming for a custom executor, so that can be a little incorrect naming
nonisolated var unownedExecutor: UnownedSerialExecutor { cameraQueue }
// queue conformance to executor protocol available from iOS 17 IIRC, before that you need to implement it by yourself, but that’s easy
private var cameraQueue = DispatchSerialQueue(…)
// isolated to actor and ensure being called from cameraQueue
private let session = AVCaptureSession()
}