iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
AVFoundationを使って、録画されたサンプリング・データをファイルに保存するサンプルを作成している。
前面と背面、そしてマイクのdeviceを取得する。
var frontVideoDevice: AVCaptureDevice? = nil
var backVideoDevice: AVCaptureDevice? = nil
var audioDevice: AVCaptureDevice? = nil
captureSession.sessionPreset = AVCaptureSessionPresetLow
let devices = AVCaptureDevice.devices()
for device in devices {
if device.hasMediaType(AVMediaTypeVideo) {
if device.position == AVCaptureDevicePosition.Back {
backVideoDevice = device as? AVCaptureDevice
}
else {
frontVideoDevice = device as? AVCaptureDevice
}
}
else if device.hasMediaType(AVMediaTypeAudio) {
audioDevice = device as? AVCaptureDevice
}
}
デフォルトのdeviceでいいのなら、以下のコードで対応できる。
let videoDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
let audioDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeAudio)
sessionを準備する。
var error: NSError? = nil;
if let device = frontVideoDevice {
frontFacingCameraDeviceInput = AVCaptureDeviceInput.deviceInputWithDevice(device, error: &error) as? AVCaptureDeviceInput
}
if let device = backVideoDevice {
backFacingCameraDeviceInput = AVCaptureDeviceInput.deviceInputWithDevice(device, error: &error) as? AVCaptureDeviceInput
}
if let device = audioDevice {
audioDeviceInput = AVCaptureDeviceInput.deviceInputWithDevice(device, error: &error) as? AVCaptureDeviceInput
}
if let deviceInput = backFacingCameraDeviceInput {
if captureSession.canAddInput(deviceInput) {
captureSession.addInput(deviceInput)
}
}
else if let deviceInput = frontFacingCameraDeviceInput {
if captureSession.canAddInput(deviceInput) {
captureSession.addInput(deviceInput)
}
}
if let deviceInput = audioDeviceInput {
if captureSession.canAddInput(deviceInput) {
captureSession.addInput(deviceInput)
}
}
録画を始めるための準備。
videoDataOutput.videoSettings = [kCVPixelBufferPixelFormatTypeKey:kCVPixelFormatType_32BGRA]
videoDataOutput.alwaysDiscardsLateVideoFrames = true
videoDataOutput.setSampleBufferDelegate(self, queue: videoAudioDataOutputQueue)
if captureSession.canAddOutput(videoDataOutput) {
captureSession.addOutput(videoDataOutput)
}
audioDataOutput.setSampleBufferDelegate(self, queue: videoAudioDataOutputQueue)
if captureSession.canAddOutput(audioDataOutput) {
captureSession.addOutput(audioDataOutput)
}