обзор

обновленный

Camo SDK Reincubate предоставляет возможность отправлять аудиовизуальные данные в реальном времени из вашего приложения в Camo Studio на macOS и Windows. Он работает через USB и оптимизирован для малой задержки и производительности; потребляя как можно меньше ресурсов в вашем приложении.

В настоящее время SDK поддерживает только приложения iOS, работающие на физическом устройстве iOS или iPadOS (за исключением симуляторов и Mac Catalyst) на iOS 12 или выше. Camo SDK не имеет стандартной совместимости с Objective-C, поэтому, если ваше приложение в первую очередь является Objective-C, вам может потребоваться создать оболочку.


Справочник по API

Если вы хотите сразу перейти к делу, вы можете просмотреть полную справку по API , в которой документируется каждый символ, предоставляемый Camo SDK. В противном случае этот документ проведет вас через образец интеграции с SDK.


Установка Camo SDK

When you receive the Camo SDK, you will have received a file called CamoProducerKit.xcframework. This self-contained framework has everything you need with no external dependencies, so installation is easy.

  1. Выберите проект вашего приложения в Project Navigator.
  2. Выберите цель вашего приложения на боковой панели цели проекта. Если вы не видите боковую панель, возможно, она находится в раскрывающемся списке вверху страницы.
  3. Убедитесь, что вы находитесь на вкладке «Общие», и прокрутите вниз до заголовка «Платформы, библиотеки и встроенное содержимое».
  4. Перетащите CamoProducerKit.xcframework в список файлов под этим заголовком.
  5. Убедитесь, что для 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.

Определение состояния подключения

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.

Как мы можем помочь?

Наша служба поддержки здесь, чтобы помочь!

Наш офис работает с понедельника по пятницу с 9:00 до 17:00 по Гринвичу. Время в настоящее время 4:13 ДП с GMT.

Мы стремимся отвечать на все сообщения в течение одного рабочего дня.

Наша отличная команда поддержки

Присоединяйтесь к сообществу

Присоединяйтесь к сообществу, которое объединяет наших пользователей! Сообщество Camo будет предлагать форумы для обсуждения и поддержки, видеопотоки, игры, раздачи подарков и многое другое по мере нашего роста.

Подпишитесь здесь, чтобы получать последние новости о наших следующих мероприятиях.

© 2008 - 2021 Reincubate Ltd. Все права защищены. Зарегистрировано в Англии и Уэльсе #5189175, VAT GB151788978. Reincubate® и Camo® являются зарегистрированными товарными знаками. Политика конфиденциальности & условия. Построен с в Лондоне.