It looks like [AVCaptureDevice devices] returns an empty list if a AVCaptureSession is not running. Modified code to always init a session before trying to list video capture devices