在swift 3.0中自动使用自定义相机录制视频

man*_*dra 3 ios swift

如何在iOS中自动录制视频而无需用户在相机控件上进行交互?要求是在打开视图时从前置摄像头录制视频,但条件是摄像机控制被禁用,视频记录并从该视图中自动保存.

man*_*dra 9

Swift 3.0

最后我解决问题只需复制并粘贴整个代码并连接插座,这个工作正常.

class TestViewController: UIViewController {

        @IBOutlet weak var myView: UIView!

        var session: AVCaptureSession?
        var userreponsevideoData = NSData()
        var userreponsethumbimageData = NSData()

        override func viewDidLoad() {
            super.viewDidLoad()
            createSession()
        }

        override func viewDidAppear(animated: Bool) {
            super.viewDidAppear(animated)
        }

        func createSession() {

            var input: AVCaptureDeviceInput?
            let  movieFileOutput = AVCaptureMovieFileOutput()
            var prevLayer: AVCaptureVideoPreviewLayer?
            prevLayer?.frame.size = myView.frame.size
            session = AVCaptureSession()
            let error: NSError? = nil
            do { input = try AVCaptureDeviceInput(device: self.cameraWithPosition(.Front)!) } catch {return}
            if error == nil {
                session?.addInput(input)
            } else {
                print("camera input error: \(error)")
            }
            prevLayer = AVCaptureVideoPreviewLayer(session: session)
            prevLayer?.frame.size = myView.frame.size
            prevLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill
            prevLayer?.connection.videoOrientation = .Portrait
            myView.layer.addSublayer(prevLayer!)
            let documentsURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0]
            let  filemainurl = NSURL(string: ("\(documentsURL.URLByAppendingPathComponent("temp")!)" + ".mov"))


            let maxDuration: CMTime = CMTimeMake(600, 10)
            movieFileOutput.maxRecordedDuration = maxDuration
            movieFileOutput.minFreeDiskSpaceLimit = 1024 * 1024
            if self.session!.canAddOutput(movieFileOutput) {
                self.session!.addOutput(movieFileOutput)
            }
            session?.startRunning()
            movieFileOutput.startRecordingToOutputFileURL(filemainurl, recordingDelegate: self)

        }
        func cameraWithPosition(position: AVCaptureDevicePosition) -> AVCaptureDevice? {
            let devices = AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo)
            for device in devices {
                if device.position == position {
                    return device as? AVCaptureDevice
                }
            }
            return nil
        }
        @IBAction func pressbackbutton(sender: AnyObject) {
            session?.stopRunning()

        }

    }
    extension TestViewController: AVCaptureFileOutputRecordingDelegate
    {
        func captureOutput(captureOutput: AVCaptureFileOutput!, didStartRecordingToOutputFileAtURL fileURL: NSURL!, fromConnections connections: [AnyObject]!) {
            print(fileURL)
        }

        func captureOutput(captureOutput: AVCaptureFileOutput!, didFinishRecordingToOutputFileAtURL outputFileURL: NSURL!, fromConnections connections: [AnyObject]!, error: NSError!) {
            print(outputFileURL)
            let filemainurl = outputFileURL

            do
            {
                let asset = AVURLAsset(URL: filemainurl, options: nil)
                print(asset)
                let imgGenerator = AVAssetImageGenerator(asset: asset)
                imgGenerator.appliesPreferredTrackTransform = true
                let cgImage = try imgGenerator.copyCGImageAtTime(CMTimeMake(0, 1), actualTime: nil)
                let uiImage = UIImage(CGImage: cgImage)
                userreponsethumbimageData = NSData(contentsOfURL: filemainurl)!
                print(userreponsethumbimageData.length)
                print(uiImage)
                // imageData = UIImageJPEGRepresentation(uiImage, 0.1)
            }
            catch let error as NSError
            {
                print(error)
                return
            }

            SVProgressHUD.showWithMaskType(SVProgressHUDMaskType.Clear)
            let VideoFilePath = NSURL(fileURLWithPath: NSTemporaryDirectory()).URLByAppendingPathComponent("mergeVideo\(arc4random()%1000)d")!.URLByAppendingPathExtension("mp4")!.absoluteString

            if NSFileManager.defaultManager().fileExistsAtPath(VideoFilePath!)

            {
                do

                {
                    try NSFileManager.defaultManager().removeItemAtPath(VideoFilePath!)
                }
                catch { }

            }
            let tempfilemainurl =  NSURL(string: VideoFilePath!)!
            let sourceAsset = AVURLAsset(URL: filemainurl!, options: nil)
            let assetExport: AVAssetExportSession = AVAssetExportSession(asset: sourceAsset, presetName: AVAssetExportPresetMediumQuality)!
            assetExport.outputFileType = AVFileTypeQuickTimeMovie
            assetExport.outputURL = tempfilemainurl
            assetExport.exportAsynchronouslyWithCompletionHandler { () -> Void in
                switch assetExport.status
                {
                case AVAssetExportSessionStatus.Completed:
                    dispatch_async(dispatch_get_main_queue(),
                        {
                            do
                            {
                                SVProgressHUD .dismiss()
                                self.userreponsevideoData = try NSData(contentsOfURL: tempfilemainurl, options: NSDataReadingOptions())
                                print("MB - \(self.userreponsevideoData.length) byte")


                            }
                            catch
                            {
                                SVProgressHUD .dismiss()
                                print(error)
                            }
                    })
                case  AVAssetExportSessionStatus.Failed:
                    print("failed \(assetExport.error)")
                case AVAssetExportSessionStatus.Cancelled:
                    print("cancelled \(assetExport.error)")
                default:
                    print("complete")
                    SVProgressHUD .dismiss()
                }

            }
        }

    }
Run Code Online (Sandbox Code Playgroud)