facebook/camera-streaming
Stream, video frames, photo capture, resolution/frame rate configuration
npx skills add https://github.com/facebook/meta-wearables-dat-ios --skill camera-streaming
Guide for implementing camera streaming and photo capture with the DAT SDK.
.makeUIImage() to renderimport MWDATCamera
import MWDATCore
let wearables = Wearables.shared
let deviceSelector = AutoDeviceSelector(wearables: wearables)
// Or for a specific device: SpecificDeviceSelector(device: deviceId)
let deviceSession = try wearables.createSession(deviceSelector: deviceSelector)
try deviceSession.start()
// Wait for the device session to reach the started state
for await state in deviceSession.stateStream() {
if state == .started { break }
}
Once the DeviceSession is started, add a Camera capability and get its stream:
let config = StreamConfiguration(
videoCodec: .raw,
resolution: .medium, // 504x896
frameRate: 24
)
guard let camera = try deviceSession.addCamera(config: config) else {
// DeviceSession must be in the started state before adding a camera
return
}
let stream = camera.stream
| Resolution | Size |
|-----------|------|
| .high | 720 x 1280 |
| .medium | 504 x 896 |
| .low | 360 x 640 |
Valid values: 2, 7, 15, 24, 30 FPS.
Lower resolution and frame rate yield higher visual quality due to less Bluetooth compression.
StreamState transitions: stopping → stopped → waitingForDevice → starting → streaming → paused
let stateToken = stream.statePublisher.listen { state in
Task { @MainActor in
switch state {
case .streaming:
// Stream is active, frames are flowing
case .waitingForDevice:
// Waiting for glasses to connect
case .stopped:
// Stream ended — release resources
case .paused:
// Temporarily suspended — keep connection, wait
default:
break
}
}
}
let frameToken = stream.videoFramePublisher.listen { frame in
guard let image = frame.makeUIImage() else { return }
Task { @MainActor in
self.previewImage = image
}
}
// Start the stream capability
stream.start()
// Stop the camera (teardown cascades to the stream)
camera.stop()
// Stop the parent device session when you're done with all capabilities
deviceSession.stop()
Capture a still photo while streaming:
// Listen for photo data
let photoToken = stream.photoDataPublisher.listen { photoData in
let imageData = photoData.data
// Convert to UIImage or save
}
// Trigger capture
stream.capturePhoto(format: .jpeg)
Resolution and frame rate are constrained by Bluetooth Classic bandwidth. The SDK automatically reduces quality when bandwidth is limited:
Request lower settings for higher visual quality per frame.
Take facebook/camera-streaming from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.