обзор
Camo SDK Reincubate предоставляет возможность отправлять аудиовизуальные данные в режиме реального времени из вашего приложения в Camo Studio на macOS и Windows. Он работает через USB или по беспроводной сети. USB оптимизирован для низкой задержки и производительности, потребляя как можно меньше ресурсов в вашем приложении. Беспроводная связь дает свободу от кабелей.
Camo SDK доступен для использования коммерческими партнерами и соавторами. Для получения дополнительной информации свяжитесь с вашей командой по адресу enterprise@reincubate.com .
В настоящее время SDK поддерживает только приложения iOS, работающие на физическом устройстве iOS или iPadOS (за исключением симуляторов и Mac Catalyst) на iOS 12 или выше. Camo SDK не имеет стандартной совместимости с Objective-C, поэтому, если ваше приложение в первую очередь является Objective-C, вам может потребоваться создать оболочку.
Справочник по API
Если вы хотите сразу перейти к делу, вы можете просмотреть полную справку по API , в которой документируется каждый символ, предоставляемый Camo SDK. В противном случае этот документ проведет вас через образец интеграции с SDK.
Установка Camo SDK
Когда вы получите Camo SDK, вы получите файл с именем CamoProducerKit.xcframework
. В этом автономном фреймворке есть все, что вам нужно, без внешних зависимостей, поэтому установка проста.
- Выберите проект вашего приложения в Project Navigator.
- Выберите цель вашего приложения на боковой панели цели проекта. Если вы не видите боковую панель, возможно, она находится в раскрывающемся списке вверху страницы.
- Убедитесь, что вы находитесь на вкладке «Общие», и прокрутите вниз до заголовка «Платформы, библиотеки и встроенное содержимое».
- Перетащите
CamoProducerKit.xcframework
в список файлов под этим заголовком. - Убедитесь, что для SDK установлено значение «Вставить и подписать».
Когда вы закончите, вы должны увидеть структуру, как показано на рисунке:
Интеграция с вашим приложением
Управление камуфляжным сервисом
В основе CamoProducerKit лежит CamoController , который предоставляет вашему приложению единый централизованный интерфейс для управления Camo SDK.
В своем приложении вы должны инициализировать экземпляр CamoController . Вы можете сделать это при запуске приложения или сохранить на потом. До явного запуска с помощью start()
контроллер Camo будет использовать очень мало ресурсов. Однако после инициализации он подготовится к кодированию аудио и видео.
import CamoProducerKit class MyVideoManager { let controller = CamoController() // ... }
Если вы хотите активировать интеграцию Camo в своем приложении, запуская службу Camo для облегчения подключений, вы можете вызвать start()
. Когда вы закончите с этим, вы можете остановить его, вызвав stop()
.
controller.start() // ... controller.stop()
Этот код является началом, но он по-прежнему не может принимать новые подключения от Camo Studio.
Ответ на новые связи
Прежде чем ваше приложение сможет принимать новые подключения от Camo Studio, вам необходимо реализовать CamoControllerDelegate . Реализуя эти два метода делегата, вы можете получать уведомления об изменениях в состоянии соединения и решать, принимать или отклонять соединение.
extension MyVideoManager: CamoControllerDelegate { // Upon receiving a connection request, you can decide whether or not to accept it. func camoControllerShouldAcceptIncomingConnection(_ controller: CamoController) -> Bool { // You could return false if you aren't ready to accept connections, such as during onboarding. return true } // Called whenever the connection state changes, such as if the Camo service starts or stops, or if a new connection is made. func camoController(_ controller: CamoController, stateDidChangeTo state: CamoControllerState?) { // From here, you can update your UI and other state print("New state:", state) } }
После этого вы сможете открыть свое приложение, подключиться к USB и просмотреть свое устройство в Camo Studio.
Беспроводные соединения
Для использования беспроводных подключений пользователям необходимо предоставить доступ к локальной сети. Службы Bonjour должны быть добавлены как NSBonjourServices в Info.plist:
_camo._tcp
-
_camopairing._tcp
При вызове camoController.start()
SDK готов к сопряжению и установлению сетевых соединений с Camo Studio.
Сопряжение
Когда пользователь нажимает кнопку «+» в Camo Studio, начинается процесс сопряжения. Camo Studio показывает QR-код, который нужно отсканировать на стороне приложения.
Шаги для сопряжения:
- Нажмите «+» в Camo Studio, чтобы показать QR-код.
- Отсканируйте QR-код и получите его данные в виде строки
- Передайте эти данные в SDK, вызвав
camoController.pairStudioWithQRCodeData(codeData) { success in }
-
pairStudioWithQRCodeData
имеет обратный вызов, который сообщит вам, было ли сопряжение успешным. - SDK выполнит сопряжение с Camo Studio, и соединение будет установлено автоматически.
Если вам нужно отменить сопряжение (например, если пользователь закрыл QR-сканер или приложение), вы должны вызвать camoController.cancelPairing()
Сопряжение имеет тайм-аут 30 секунд. Обратный вызов для pairStudioWithQRCodeData
будет вызван со значением success
false
, если сопряжение не произошло в течение 30 секунд после pairStudioWithQRCodeData
.
Сопряженные устройства
После завершения сопряжения SDK сохранит данные сопряжения в списке сопряженных устройств. CamoController
имеет 2 метода для работы с этим списком:
pairedDevices
, чтобы получить список (если вы хотите показать этот список в пользовательском интерфейсе)-
removePairedDevice
, чтобы забыть устройство
Чтобы установить беспроводное соединение с Camo Studio в следующий раз, просто нажмите кнопку «+» в Camo Studio и подождите, пока соединение будет установлено, не нужно снова сканировать QR-код.
Определение состояния подключения
CamoController предоставляет свойство CamoControllerState , которое также включено в метод делегата изменения состояния, как показано выше. Это перечисление предоставляет информацию, полезную для вашего приложения, например имя подключенного компьютера для отображения в пользовательском интерфейсе.
Вот пример того, как вы можете обновить свой пользовательский интерфейс, чтобы отразить состояние подключения:
func camoController(_ controller: CamoController, stateDidChangeTo state: CamoControllerState?) { let statusText = { () -> String in guard case let .running(serviceState) = state else { return "Camo service not running" } switch serviceState { case .active(let connection): return "Connected to \(connection.name)" case .paused(let connection): return "Paused, but connected to \(connection.name)" case .notConnected: return "Camo service running, but no connection" } }() DispatchQueue.main.async { self.statusTextLabel.text = statusText } }
Отправка аудиовизуальных данных
Чтобы предоставить клиентам максимальную гибкость, Camo SDK не предоставляет и не контролирует захват. Вместо этого вы несете ответственность за предоставление CamoController аудио- и видеоданных. Это можно сделать с помощью двух простых вызовов API:
// upon receiving video from the camera or elsewhere camoController.enqueueVideo(sampleBuffer: sampleBuffer) // upon receiving audio from the microphone or elsewhere camoController.enqueuePCMAudio(data: chunk)
Отправка видео
Если у вас есть доступ к CMSampleBuffer в вашем конвейере видео, несложно передать эти данные в Camo SDK.
Из-за этого настроить его с помощью базового видео AVCaptureSession чрезвычайно просто. Вот пример этого в действии.
class CaptureController: AVCaptureVideoDataOutputSampleBufferDelegate { // ... func startSession() throws { guard let camera = AVCaptureDevice.default(for: .video) else { fatalError("No camera found") } let input = try AVCaptureDeviceInput(device: camera) captureSession.addInput(input) let output = AVCaptureVideoDataOutput() output.alwaysDiscardsLateVideoFrames = true output.setSampleBufferDelegate(self, queue: videoDataOutputQueue) captureSession.addOutput(output) captureSession.startRunning() } // ... func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) { camoController.enqueueVideo(sampleBuffer: sampleBuffer) } }
При отправке видеокадров убедитесь, что:
- Длительность кадра 30 кадров в секунду.
- Формат пикселей -
kCVPixelFormatType_32BGRA
.
Вы можете просмотреть более подробную информацию в справочнике по API.
Отправка аудио
Отправка звука аналогична отправке видео, но может потребоваться еще несколько шагов в зависимости от того, как ваше приложение его получает. Пример реализации см. В демонстрационном приложении, включенном в Camo SDK.
При отправке аудиоданных убедитесь, что:
- Ваша частота дискретизации 48 кГц.
- Аудиокодек - LPCM.
- Количество каналов - 2.
- Разрядность 32.
- Количество сэмплов в аудиопакете зависит от Studio (macOS или Windows), вы можете получить его из CamoController.audioSamplesRequired .
Вы можете просмотреть более подробную информацию в справочнике по API.