개요

업데이트 됨

Reincubate의 Camo SDK는 응용 프로그램에서 macOS 및 Windows의 Camo Studio로 실시간 시청각 데이터를 보내는 기능을 제공합니다. USB를 통해 작동하며 짧은 대기 시간과 성능에 최적화되어 있습니다. 앱에서 가능한 한 적은 리소스를 사용합니다.

현재 SDK는 iOS 12 이상의 물리적 iOS 또는 iPadOS 기기(시뮬레이터 및 Mac Catalyst 제외)에서 실행되는 iOS 애플리케이션만 지원합니다. Camo SDK는 기본적으로 Objective-C와 호환되지 않으므로 앱이 주로 Objective-C인 경우 래퍼를 만들어야 할 수 있습니다.


API 참조

바로 들어가고 싶다면 Camo SDK에서 제공하는 모든 기호를 문서화 하는 전체 API 참조를 볼 수 있습니다. 그렇지 않으면 이 문서에서 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. 프로젝트 네비게이터에서 애플리케이션의 프로젝트를 선택하십시오.
  2. 프로젝트의 대상 사이드바에서 애플리케이션의 대상을 선택합니다. 사이드바가 표시되지 않으면 페이지 상단의 드롭다운에 있을 수 있습니다.
  3. '일반' 탭에 있는지 확인하고 '프레임워크, 라이브러리 및 포함된 콘텐츠' 헤더까지 아래로 스크롤합니다.
  4. CamoProducerKit.xcframework 파일을 끌어서 해당 헤더 아래의 파일 목록에 놓습니다.
  5. SDK가 "Embed & Sign"으로 설정되어 있는지 확인하십시오.

완료되면 그림과 같은 프레임워크가 표시되어야 합니다.

앱과 통합

Camo 서비스 제어

CamoProducerKit의 핵심은 앱에 Camo SDK를 제어하기 위한 중앙 집중식 인터페이스를 제공 하는 CamoController 입니다.

앱에서 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 속성을 제공합니다. 이 열거형 은 UI에 표시할 연결된 컴퓨터의 이름과 같이 앱에 유용한 정보를 제공합니다.

다음은 연결 상태를 반영하도록 UI를 업데이트하는 방법의 예입니다.

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)
    }
}

비디오 프레임을 보낼 때 다음을 확인하십시오.

  • 프레임 지속 시간은 30FPS입니다.
  • 픽셀 형식은 kCVPixelFormatType_32BGRA 입니다.

API 참조 에서 자세한 내용을 볼 수 있습니다.

오디오 보내기

오디오 전송은 비디오와 유사하지만 애플리케이션에서 오디오를 수신하는 방식에 따라 몇 가지 단계가 더 필요할 수 있습니다. 샘플 구현은 Camo SDK에 포함된 데모 앱을 참조하십시오.

오디오 데이터를 보낼 때 다음을 확인하십시오.

  • 샘플 속도는 48kHz입니다.
  • 오디오 코덱은 LPCM입니다.
  • 채널 수는 2입니다.
  • 비트 깊이는 32입니다.
  • 오디오 패킷당 샘플 수는 Studio(macOS 또는 Windows)에 따라 다르며 CamoController.audioSamplesRequired 에서 가져올 수 있습니다.

API 참조 에서 자세한 내용을 볼 수 있습니다.

어떻게 도와 드릴까요?

지원 팀이 도와 드리겠습니다!

근무 시간은 월요일부터 금요일, 오전 9 시부 터 오후 5시 (그리니치 표준시)입니다. 시간은 현재 4:15 오전 GMT입니다.

우리는 1 일 이내에 모든 메시지에 답장하고자합니다.

우리의 멋진 지원 팀

커뮤니티 가입

사용자 연결을 중심으로 커뮤니티에 가입하십시오! Camo 커뮤니티는 우리가 성장함에 따라 토론 및 지원, 비디오 스트림, 게임, 경품 등을 위한 포럼을 제공할 것입니다.

다음 이벤트에 대한 최신 업데이트를 받으려면 여기에서 등록하세요.

© 2008 - 2021 Reincubate Ltd. 판권 소유. 영국과 웨일즈에 등록 #5189175, VAT GB151788978. Reincubate® 및 Camo®는 등록 상표입니다. 개인 정보 정책 & 자귀. 런던에서 Built로 지어졌습니다.