visionOS: AVFoundation cannot deliver simultaneous video from two external (UVC) cameras; no public USB fallback exists

Area: visionOS 26.4 · AVFoundation · AVCapture · External/UVC video Classification: Suggestion / API Enhancement Request (also: Incorrect/Missing Documentation) Device / OS: Apple Vision Pro, visionOS 26.x. Xcode 26.4.1, XROS26.4.sdk.


Summary

On visionOS, a third-party app cannot display two UVC USB cameras (connected through a powered USB-C hub) at the same time. Every AVFoundation path that would enable this on iPadOS is either unavailable or fails at runtime on visionOS, and there is no public non-AVFoundation fallback (no IOUSBHost, no DriverKit, no usable CoreMediaIO, no MFi path for generic UVC devices). This is a real capability gap relative to iPadOS and macOS, and Camo Studio on iPadOS (App Store ID 6450313385) demonstrates the two-camera USB-hub use case is legitimate and valuable for spatial-video/hybrid-capture workflows on Vision Pro.


Steps to reproduce

  1. Connect a powered USB-C hub to Apple Vision Pro with two UVC webcams attached.
  2. Build a visionOS app that uses AVCaptureDevice.DiscoverySession(deviceTypes: [.external], …).
  3. Observe: both cameras are discovered and enumerate as distinct AVCaptureDevices.
  4. Attempt A — two independent sessions: Create two independent AVCaptureSessions, each with one AVCaptureDeviceInput and one AVCaptureVideoDataOutput, start both.
    • Result: only one session delivers sample buffers. The other stalls silently with no error and no interruption notification.
  5. Attempt B — AVCaptureMultiCamSession with manual connections (the pattern that works on iPadOS 18+):
    • Result: code does not compile. In XROS26.4.sdk:
      • AVCaptureInputPort is API_UNAVAILABLE(visionos) (AVCaptureInput.h)
      • AVCaptureInput.ports is API_UNAVAILABLE(visionos)
      • AVCaptureDeviceInput.portsWithMediaType:sourceDeviceType:sourceDevicePosition: is API_UNAVAILABLE(macos, visionos)
      • Therefore AVCaptureConnection(inputPorts:output:) cannot be constructed.
    • AVCaptureMultiCamSession itself is declared API_AVAILABLE(… visionos(2.1)), which is misleading because without input-port access the manual-connection path the class requires is unreachable.

Expected behavior

Either of the following would resolve this, in order of preference:

  1. Expose the missing API surface on visionOS. Make AVCaptureInputPort, AVCaptureInput.ports, and AVCaptureDeviceInput.portsWithMediaType:sourceDeviceType:sourceDevicePosition: available on visionOS so the documented iPadOS multi-cam pattern compiles and runs. AVCaptureMultiCamSession is already declared available — the supporting API surface should match.
  2. Allow two concurrent plain AVCaptureSessions to each own a distinct external AVCaptureDevice. Each session binds a different hardware device, and the current serialization appears to be a software policy rather than a hardware constraint (a powered hub has bandwidth for both).
  3. Document the limit explicitly and surface a clear error or interruption reason on the stalled session so apps can fail loudly instead of appearing to work.

Actual behavior

  • AVCaptureMultiCamSession advertises visionos(2.1) availability but the APIs required to wire its connections are marked unavailable on visionOS.
  • Two concurrent AVCaptureSessions silently deliver frames to only one session; no error is reported on the other.
  • There is no public alternative framework on visionOS for raw UVC access to work around this:
    • IOUSBHost.framework — not present in XROS26.4.sdk
    • DriverKit — not present in XROS26.4.sdk
    • IOKit — ships a stub (IOKit.tbd); no public USB device interfaces
    • CoreMediaIO — headers are an apinotes stub on visionOS
    • ExternalAccessory — MFi-only; generic UVC devices don't enumerate

This means there is no public path, AVFoundation or otherwise, for a third-party visionOS app to display two UVC cameras at once.


Impact / use cases

Apple Vision Pro is uniquely suited to multi-camera monitoring and capture workflows — spatial creators, broadcast/AV producers, multi-angle reference during immersive authoring, clinical and field-recording use cases, and apps that combine a primary UVC cinema camera with a secondary UVC reference/overview angle. iPadOS already supports this via AVCaptureMultiCamSession (demonstrated shipping by Camo Studio). The current visionOS limitation pushes these workflows back to iPad or macOS and undermines Vision Pro's positioning as a pro capture/monitor environment.


References

  • iPadOS reference implementation: Apple sample Displaying Video From Connected Devices + AVCaptureMultiCamSession with manual AVCaptureConnection wiring — works on iPadOS 18+ with two UVC cameras via a powered hub.
  • Shipping precedent: Camo Studio — two simultaneous UVC cameras via USB hub on iPad — https://apps.apple.com/us/app/camo-studio-stream-record/id6450313385
  • visionOS 26.4 SDK headers cited above (AVCaptureInput.h, AVCaptureSession.h).
visionOS: AVFoundation cannot deliver simultaneous video from two external (UVC) cameras; no public USB fallback exists
 
 
Q