Vì vậy, gần đây tôi đã cố gắng thực hiện chức năng chuyển đổi chế độ xem máy ảnh từ quay lại camera trước trong Swift 3. Tuy nhiên, với không may mắn.Nhấn đúp hoặc sử dụng nút để chuyển đổi máy ảnh từ quay lại mặt trước (Xcode 8, Swift 3)
Hiện tại, chế độ xem mặc định của tôi là từ máy ảnh sau - tôi có thể chụp ảnh với máy ảnh và sau đó thực hiện lại. Nhưng bất cứ ai có thể giúp tôi và chỉ cho tôi cách nhấn đúp vào màn hình để chuyển đổi máy ảnh hoặc chỉ cần sử dụng nút được gán để chuyển đổi chúng? Cảm ơn bạn!
import UIKit
import AVFoundation
import FirebaseDatabase
class CameraView: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
override var prefersStatusBarHidden: Bool {
return true
}
var captureSession : AVCaptureSession!
var stillImageOutput : AVCaptureStillImageOutput!
var previewLayer : AVCaptureVideoPreviewLayer!
@IBOutlet var cameraView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
previewLayer?.frame = cameraView.bounds
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
captureSession = AVCaptureSession()
captureSession?.sessionPreset = AVCaptureSessionPreset1920x1080
var backCamera = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)
var error : NSError?
do {
var input = try! AVCaptureDeviceInput(device: backCamera)
if (error == nil && captureSession?.canAddInput(input) != nil) {
captureSession?.addInput(input)
stillImageOutput = AVCaptureStillImageOutput()
stillImageOutput.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG]
if (captureSession?.canAddOutput(stillImageOutput) != nil) {
captureSession?.addOutput(stillImageOutput)
previewLayer = AVCaptureVideoPreviewLayer (session: captureSession)
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.portrait
cameraView.layer.addSublayer(previewLayer)
captureSession?.startRunning() }
}
} catch {
}
}
@IBOutlet var tempImageView: UIImageView!
@IBAction func didPressTakePhoto(_ sender: UIButton) {
if let videoConnection = stillImageOutput.connection(withMediaType: AVMediaTypeVideo) {
videoConnection.videoOrientation = AVCaptureVideoOrientation.portrait
stillImageOutput.captureStillImageAsynchronously(from: videoConnection, completionHandler: {
(sampleBuffer, error) in
if sampleBuffer != nil {
var imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer)
var dataProvider = CGDataProvider.init(data: imageData as! CFData)
var cgImageRef = CGImage.init(jpegDataProviderSource: dataProvider!, decode: nil, shouldInterpolate: true, intent: .defaultIntent)
var image = UIImage (cgImage: cgImageRef!, scale: 1.0, orientation: UIImageOrientation.right)
self.tempImageView.image = image
self.tempImageView.isHidden = false
}
})
}
}
var didTakePhoto = Bool()
@IBAction func didPressTakeAnother(_ sender: UIButton) {
if didTakePhoto == true {
tempImageView.isHidden = true
didTakePhoto = false
} else {
captureSession?.startRunning()
didTakePhoto = true
}
}
}
Cảm ơn ví dụ này. Tuy nhiên, phương pháp này đã phá vỡ cách của tôi để chụp một ảnh tĩnh từ nguồn cấp dữ liệu. Làm thế nào tôi có thể lấy một khung từ mã này? Có thể đăng câu hỏi mới nếu điều đó tốt hơn .. – MattEm
sử dụng nếu để videoConnection = stillImageOutput.connection (withMediaType: AVMediaTypeVideo) { mà alwyas trả về false .. tại sao? – MattEm
Phương pháp này không thành công nếu captureSession! .canAddOutput (stillImageOutput) bất ngờ tìm thấy nil, tại sao điều này? – MattEm