简体   繁体   English

在iOS Swift3中使用自定义摄像头捕获视频

[英]Capture video using custom camera in ios swift3

I am able to capturing video by using the below code. 我可以使用以下代码捕获视频。 In My task, I need to capture the video continuously but I need to save outputFileURL of every 5 seconds.First 5 seconds its working fine but continuous looping is not happening.Could any one guide me to do this task? 在我的任务中,我需要连续捕获视频,但是我需要每5秒保存一次outputFileURL。前5秒可以正常工作,但没有发生连续循环。有人可以指导我执行此任务吗?

func VideoCaptureMethod() {
    //self.cameraView = self.view

  //  self.cameraManager.resumeCaptureSession()


    let devices = AVCaptureDevice.devices(for: AVMediaType.video)


    for device in devices {
        if (device as AnyObject).position == AVCaptureDevice.Position.back{


            do{

                let input = try AVCaptureDeviceInput(device: device )

                if captureSession.canAddInput(input){

                    captureSession.addInput(input)
                    sessionOutput.outputSettings = [AVVideoCodecKey : AVVideoCodecJPEG]

                    if captureSession.canAddOutput(sessionOutput){

                        captureSession.addOutput(sessionOutput)

                        previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
                        previewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
                        previewLayer.connection?.videoOrientation = AVCaptureVideoOrientation.portrait
                        cameraView.layer.addSublayer(previewLayer)

                        previewLayer.position = CGPoint(x: self.cameraView.frame.width / 2, y: self.cameraView.frame.height / 2)
                        previewLayer.bounds = cameraView.frame


                    }

                    captureSession.addOutput(movieOutput)

                    captureSession.startRunning()

                    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
                    let fileUrl = paths[0].appendingPathComponent("output.mov")
                    try? FileManager.default.removeItem(at: fileUrl)
                    movieOutput.startRecording(to: fileUrl, recordingDelegate: self)




                    let delayTime = DispatchTime.now() + 5
                    DispatchQueue.main.asyncAfter(deadline: delayTime) {
                        print("stopping")
                        self.movieOutput.stopRecording()

                    }


                }

            }
            catch{

                print("Error")
            }

        }
    }

}



func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) {

        print(outputFileURL)

        self.VideoCaptureMethod()

    }

Here is the code sample : 这是代码示例:

import UIKit
import AVFoundation

class ViewController: UIViewController, AVCaptureFileOutputRecordingDelegate
{
    var captureSession = AVCaptureSession()
    var sessionOutput = AVCaptureStillImageOutput()
    var movieOutput = AVCaptureMovieFileOutput()
    var previewLayer = AVCaptureVideoPreviewLayer()
    var timer = Timer()

    @IBOutlet var cameraView: UIView!

    override func viewWillAppear(_ animated: Bool) {
        self.cameraView = self.view

        let session = AVCaptureDevice.DiscoverySession.init(deviceTypes: [.builtInWideAngleCamera], mediaType: AVMediaType.video, position: .back)
        let devices = session.devices
        guard let audioDevice = AVCaptureDevice.default(for: .audio) else { return }
        for device in devices
        {
            if device.position == AVCaptureDevice.Position.back
            {
                do{
                    let input = try AVCaptureDeviceInput(device: device )
                    let audioDeviceInput = try AVCaptureDeviceInput(device: audioDevice)
                    if captureSession.canAddInput(input){

                        captureSession.addInput(input)
                        captureSession.addInput(audioDeviceInput)
                        sessionOutput.outputSettings = [AVVideoCodecKey : AVVideoCodecType.jpeg]

                        if captureSession.canAddOutput(sessionOutput)
                        {
                            captureSession.addOutput(sessionOutput)

                            previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
                            previewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
                            previewLayer.connection?.videoOrientation = AVCaptureVideoOrientation.portrait
                            cameraView.layer.addSublayer(previewLayer)
                            previewLayer.position = CGPoint(x: self.cameraView.frame.width / 2, y: self.cameraView.frame.height / 2)
                            previewLayer.bounds = cameraView.frame

                        }
                        captureSession.addOutput(movieOutput)
                        captureSession.startRunning()
                        self.handleCaptureSession()

                    }

                }
                catch{

                    print("Error")
                }

            }
        }

    }

    func handleCaptureSession()
    {
        print("-----------Starting-----------")
        let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
        let dateFormatter : DateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MMM-dd HH:mm:ss"
        let date = Date()
        let dateString = dateFormatter.string(from: date)
        let fileName = dateString + "output.mov"
        let fileUrl = paths[0].appendingPathComponent(fileName)
        try? FileManager.default.removeItem(at: fileUrl)
        self.movieOutput.startRecording(to: fileUrl, recordingDelegate: self)
        DispatchQueue.main.asyncAfter(deadline: .now() + 5.0, execute:
            {
                print("-----------Stopping-----------")
                self.movieOutput.stopRecording()
        })
    }


    func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) {
        print("FINISHED \(error )")
        // save video to camera roll
        if error == nil {
            print("---------------FilePath--------------\(outputFileURL.path)")
            UISaveVideoAtPathToSavedPhotosAlbum(outputFileURL.path, nil, nil, nil)

            self.handleCaptureSession()
        }
    }   
}
func videoPreviewUiimage(fileName:URL) -> UIImage? {
    // let filePath = NSString(string: "~/").expandingTildeInPath.appending("/Documents/").appending(fileName)

    // let vidURL = NSURL(fileURLWithPath:filePath)
    let asset = AVURLAsset(url: fileName as URL)
    let generator = AVAssetImageGenerator(asset: asset)
    generator.appliesPreferredTrackTransform = true

    let timestamp = CMTime(seconds: 2, preferredTimescale: 60)

    do {
        let imageRef = try generator.copyCGImage(at: timestamp, actualTime: nil)
        return UIImage(cgImage: imageRef)
    }
    catch let error as NSError
    {
        print("Image generation failed with error \(error)")
        return nil
    }
}

// For Capturing image while video recording //用于在录制视频时捕获图像

func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) {
    print("FINISHED \(String(describing: error ))")
    // save video to camera roll
    if error == nil {
        print("---------------FilePath--------------\(outputFileURL.path)")
        UISaveVideoAtPathToSavedPhotosAlbum(outputFileURL.path, nil, nil, nil)

        //let asset = AVURLAsset(URL: fileUrl)


        print(self.videoPreviewUiimage(fileName: outputFileURL)!)

       // self.iconImage.isHidden = true



        self.iconImage.image  = self.videoPreviewUiimage(fileName: outputFileURL)!


        let imageData: Data? = UIImageJPEGRepresentation(self.videoPreviewUiimage(fileName: outputFileURL)!, 0.4)
        let imageStr = imageData?.base64EncodedString(options: .lineLength64Characters) ?? ""

      //  print(strBase64)



        print("imageStr\(imageStr)")

        //  MyAwesomeAlbum.shared.

        self.handleCaptureSession()
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM