AVFoundation 相机检查和翻转变量
AVFoundation Camera Check and Flip Variable
我创建了一个自定义相机工具。现在,我正在尝试检查是否存在摄像头,但是我只有模拟器(没有摄像头)和 iphone(两个摄像头)。我没有处理过相机,但我不明白它是如何在一个相机上工作的,所以我也不知道如何帮助用户翻转相机
目前我正在使用以下外部库 dojo custom camera
位置 .Back
和 .Front
有效,我没有处理相机,但我不知道如何
处理 1 个摄像头的检查
根据前后摄像头的存在分配一个变量来控制它们(这样我就可以在 VC 中创建一个 uibutton 并控制前后摄像头的翻转)。
// I call addVideoInput() while initializing
func addVideoInput() {
if let device: AVCaptureDevice = self.deviceWithMediaTypeWithPosition(AVMediaTypeVideo, position: AVCaptureDevicePosition.Front) {
do {
let input = try AVCaptureDeviceInput(device: device)
if self.session.canAddInput(input) {
self.session.addInput(input)
}
} catch {
print(error)
}
}
}
func deviceWithMediaTypeWithPosition(mediaType: NSString, position: AVCaptureDevicePosition) -> AVCaptureDevice? {
let devices: NSArray = AVCaptureDevice.devicesWithMediaType(mediaType as String)
if devices.count != 0 {
if var captureDevice: AVCaptureDevice = devices.firstObject as? AVCaptureDevice {
for device in devices {
let d = device as! AVCaptureDevice
if d.position == position {
captureDevice = d
break;
}
}
print(captureDevice)
return captureDevice
}
}
print("doesnt have any camera")
return nil
}
最好保留枚举 IMO。
private enum CameraPosition {
case Front, Back
}
然后当你按下按钮时有
var currentState: CameraPostition
切换到另一个相机位置。
然后在currentState的didSet上配置camera
var currentState: CameraPostition {
didSet {
configCamera(state: currentState)
}
}
编辑:提供更多信息后。
如果你改变
func addVideoInput() {
let device: AVCaptureDevice = self.deviceWithMediaTypeWithPosition(AVMediaTypeVideo, position: AVCaptureDevicePosition.Back)
do {
let input = try AVCaptureDeviceInput(device: device)
if self.session.canAddInput(input) {
self.session.addInput(input)
}
} catch {
print(error)
}
}
到
func addVideoInput(position: AVCaptureDevicePosition) {
let device: AVCaptureDevice = self.deviceWithMediaTypeWithPosition(AVMediaTypeVideo, position: position)
do {
let input = try AVCaptureDeviceInput(device: device)
if self.session.canAddInput(input) {
self.session.addInput(input)
}
} catch {
print(error)
}
}
然后当你的 "CurrentState" 在 currentState 的 didSet 上发生变化时,你可以调用该函数。
func configCamera(state: CameraState) {
switch state{
case .Back:
addVideoInput(.Back)
case .Front
addVideoInput(.Front)
}
}
您可以在第一次加载相机视图时使用布尔变量 isUsingFrontCamera,
设置,
isUsingFrontCamera = false;
然后点击相机切换按钮,
-(IBAction)switchCameras:(id)sender {
AVCaptureDevicePosition desiredPosition;
if (isUsingFrontFacingCamera)
desiredPosition = AVCaptureDevicePositionBack;
else
desiredPosition = AVCaptureDevicePositionFront;
for (AVCaptureDevice *d in [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]) {
if ([d position] == desiredPosition) {
[[captureVideoPreviewLayer session] beginConfiguration];
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:d error:nil];
for (AVCaptureInput *oldInput in [[captureVideoPreviewLayer session] inputs]) {
[[captureVideoPreviewLayer session] removeInput:oldInput];
}
[[captureVideoPreviewLayer session] addInput:input];
[[captureVideoPreviewLayer session] commitConfiguration];
break;
}
}
isUsingFrontFacingCamera = !isUsingFrontFacingCamera;
}
其中captureVideoPreviewLayer是,
AVCaptureVideoPreviewLayer *captureVideoPreviewLayer
此外,您可以使用
获取相机的数量
[[AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo] count]
然后相应地显示和隐藏按钮
您需要删除该对象并使用少量值和布尔值创建新对象。
这里我post创建相机位置的代码AVCaptureDevicePosition
。
在 class 的顶部添加 enum
。
enum CameraType {
case Front
case Back
}
初始化变量。
var cameraCheck = CameraType.Back
只需更改以下功能即可。
func addVideoInput() {
if cameraCheck == CameraType.Front {
cameraCheck = CameraType.Back
let device: AVCaptureDevice = self.deviceWithMediaTypeWithPosition(AVMediaTypeVideo, position: AVCaptureDevicePosition.Front)
do {
let input = try AVCaptureDeviceInput(device: device)
if self.session.canAddInput(input) {
self.session.addInput(input)
}
} catch {
print(error)
}
}else{
cameraCheck = CameraType.Front
let device: AVCaptureDevice = self.deviceWithMediaTypeWithPosition(AVMediaTypeVideo, position: AVCaptureDevicePosition.Back)
do {
let input = try AVCaptureDeviceInput(device: device)
if self.session.canAddInput(input) {
self.session.addInput(input)
}
} catch {
print(error)
}
}
}
在您的 storyboard
中创建一个按钮。
现在进入你的 viewcontroller
创建一个 @IBAction
函数。
@IBAction func changeCamera(){
self.camera = nil
self.initializeCamera()
self.establishVideoPreviewArea()
if isBackCamera == true {
isBackCamera = false
self.camera?.cameraCheck = CameraType.Front
}else{
isBackCamera = true
self.camera?.cameraCheck = CameraType.Back
}
}
这就是您的目标。
我创建了一个自定义相机工具。现在,我正在尝试检查是否存在摄像头,但是我只有模拟器(没有摄像头)和 iphone(两个摄像头)。我没有处理过相机,但我不明白它是如何在一个相机上工作的,所以我也不知道如何帮助用户翻转相机
目前我正在使用以下外部库 dojo custom camera
位置 .Back
和 .Front
有效,我没有处理相机,但我不知道如何
处理 1 个摄像头的检查
根据前后摄像头的存在分配一个变量来控制它们(这样我就可以在 VC 中创建一个 uibutton 并控制前后摄像头的翻转)。
// I call addVideoInput() while initializing
func addVideoInput() {
if let device: AVCaptureDevice = self.deviceWithMediaTypeWithPosition(AVMediaTypeVideo, position: AVCaptureDevicePosition.Front) {
do {
let input = try AVCaptureDeviceInput(device: device)
if self.session.canAddInput(input) {
self.session.addInput(input)
}
} catch {
print(error)
}
}
}
func deviceWithMediaTypeWithPosition(mediaType: NSString, position: AVCaptureDevicePosition) -> AVCaptureDevice? {
let devices: NSArray = AVCaptureDevice.devicesWithMediaType(mediaType as String)
if devices.count != 0 {
if var captureDevice: AVCaptureDevice = devices.firstObject as? AVCaptureDevice {
for device in devices {
let d = device as! AVCaptureDevice
if d.position == position {
captureDevice = d
break;
}
}
print(captureDevice)
return captureDevice
}
}
print("doesnt have any camera")
return nil
}
最好保留枚举 IMO。
private enum CameraPosition {
case Front, Back
}
然后当你按下按钮时有
var currentState: CameraPostition
切换到另一个相机位置。
然后在currentState的didSet上配置camera
var currentState: CameraPostition {
didSet {
configCamera(state: currentState)
}
}
编辑:提供更多信息后。
如果你改变
func addVideoInput() {
let device: AVCaptureDevice = self.deviceWithMediaTypeWithPosition(AVMediaTypeVideo, position: AVCaptureDevicePosition.Back)
do {
let input = try AVCaptureDeviceInput(device: device)
if self.session.canAddInput(input) {
self.session.addInput(input)
}
} catch {
print(error)
}
}
到
func addVideoInput(position: AVCaptureDevicePosition) {
let device: AVCaptureDevice = self.deviceWithMediaTypeWithPosition(AVMediaTypeVideo, position: position)
do {
let input = try AVCaptureDeviceInput(device: device)
if self.session.canAddInput(input) {
self.session.addInput(input)
}
} catch {
print(error)
}
}
然后当你的 "CurrentState" 在 currentState 的 didSet 上发生变化时,你可以调用该函数。
func configCamera(state: CameraState) {
switch state{
case .Back:
addVideoInput(.Back)
case .Front
addVideoInput(.Front)
}
}
您可以在第一次加载相机视图时使用布尔变量 isUsingFrontCamera,
设置,
isUsingFrontCamera = false;
然后点击相机切换按钮,
-(IBAction)switchCameras:(id)sender {
AVCaptureDevicePosition desiredPosition;
if (isUsingFrontFacingCamera)
desiredPosition = AVCaptureDevicePositionBack;
else
desiredPosition = AVCaptureDevicePositionFront;
for (AVCaptureDevice *d in [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]) {
if ([d position] == desiredPosition) {
[[captureVideoPreviewLayer session] beginConfiguration];
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:d error:nil];
for (AVCaptureInput *oldInput in [[captureVideoPreviewLayer session] inputs]) {
[[captureVideoPreviewLayer session] removeInput:oldInput];
}
[[captureVideoPreviewLayer session] addInput:input];
[[captureVideoPreviewLayer session] commitConfiguration];
break;
}
}
isUsingFrontFacingCamera = !isUsingFrontFacingCamera;
}
其中captureVideoPreviewLayer是,
AVCaptureVideoPreviewLayer *captureVideoPreviewLayer
此外,您可以使用
获取相机的数量[[AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo] count]
然后相应地显示和隐藏按钮
您需要删除该对象并使用少量值和布尔值创建新对象。
这里我post创建相机位置的代码AVCaptureDevicePosition
。
在 class 的顶部添加 enum
。
enum CameraType {
case Front
case Back
}
初始化变量。
var cameraCheck = CameraType.Back
只需更改以下功能即可。
func addVideoInput() {
if cameraCheck == CameraType.Front {
cameraCheck = CameraType.Back
let device: AVCaptureDevice = self.deviceWithMediaTypeWithPosition(AVMediaTypeVideo, position: AVCaptureDevicePosition.Front)
do {
let input = try AVCaptureDeviceInput(device: device)
if self.session.canAddInput(input) {
self.session.addInput(input)
}
} catch {
print(error)
}
}else{
cameraCheck = CameraType.Front
let device: AVCaptureDevice = self.deviceWithMediaTypeWithPosition(AVMediaTypeVideo, position: AVCaptureDevicePosition.Back)
do {
let input = try AVCaptureDeviceInput(device: device)
if self.session.canAddInput(input) {
self.session.addInput(input)
}
} catch {
print(error)
}
}
}
在您的 storyboard
中创建一个按钮。
现在进入你的 viewcontroller
创建一个 @IBAction
函数。
@IBAction func changeCamera(){
self.camera = nil
self.initializeCamera()
self.establishVideoPreviewArea()
if isBackCamera == true {
isBackCamera = false
self.camera?.cameraCheck = CameraType.Front
}else{
isBackCamera = true
self.camera?.cameraCheck = CameraType.Back
}
}
这就是您的目标。