Snapchat только что выпустил настольное приложение ( ссылка ), которое предназначено для создания в системе видеоустройства, которое будет использоваться любым видеоприложением, таким как Skype, Google Hangouts, Apple Photobooth и даже OBS для прямой трансляции. , Он отлично работает в других приложениях, поскольку они, кажется, обнаруживают устройство с привязкой камеры вместе с «FaceTime HD Camera».
Итак, я попытался создать приложение OSX, используя Xcode. Надеюсь, я смогу получить видео-канал. Я использую следующий пример кода, который я взял из этого github: AcceCamera Demo
Приложение прекрасно работает при отображении канала с «FacetimeHD Camera», но не работает (так как в нем ничего не отображается) при выборе устройства SnapCam.
вот код (вы также можете использовать ссылку выше, единственное отличие от этой - выбор устройства SnapCam):
import Cocoa
import AVFoundation
class ViewController: NSViewController {
@IBOutlet weak var camera: NSView!
let captureSession = AVCaptureSession()
var captureDevice : AVCaptureDevice?
var previewLayer : AVCaptureVideoPreviewLayer?
override func viewDidLoad() {
super.viewDidLoad()
camera.layer = CALayer()
// Do any additional setup after loading the view, typically from a nib.
captureSession.sessionPreset = AVCaptureSessionPresetLow
// Get all audio and video devices on this machine
let devices = AVCaptureDevice.devices()
// Find the FaceTime HD camera object
for device in devices! {
// print(device)
// Camera object found and assign it to captureDevice
if ((device as AnyObject).hasMediaType(AVMediaTypeVideo)) {
print(device)
let d = device as? AVCaptureDevice
print("\(d?.manufacturer)")
if(d?.manufacturer == "SnapVendor"){
captureDevice = device as? AVCaptureDevice
break;
}
}
}
if captureDevice != nil {
do {
try captureSession.addInput(AVCaptureDeviceInput(device: captureDevice))
previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
previewLayer?.frame = (self.camera.layer?.frame)!
// Add previewLayer into custom view
self.camera.layer?.addSublayer(previewLayer!)
// Start camera
captureSession.startRunning()
} catch {
print(AVCaptureSessionErrorKey.description)
}
}
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
}
Мне очень странно, что другие приложения, такие как OBS, не имеют проблем с получением канала.