繁体   English   中英

如何通过AVCaptureVideoDataOutput()和AVCaptureSession()快速录制视频

[英]how to record video via AVCaptureVideoDataOutput() and AVCaptureSession() in swift

这是我的代码,我想单击startVideoRecording按钮方法记录视频,单击stopVideoRecording按钮时应将其保存在文档目录中,请帮助。

我已经导入UIKit导入MediaPlayer和MobileCoreServices导入

AVFoundation class VideoDelegate : NSObject, AVCaptureFileOutputRecordingDelegate {
    func captureOutput(captureOutput: AVCaptureFileOutput!, didFinishRecordingToOutputFileAtURL outputFileURL: NSURL!, fromConnections connections: [AnyObject]!, error: NSError!) {
        println("capture output : finish recording to \(outputFileURL)")
    }
    func captureOutput(captureOutput: AVCaptureFileOutput!, didStartRecordingToOutputFileAtURL fileURL: NSURL!, fromConnections connections: [AnyObject]!) {
        println("capture output: started recording to \(fileURL)")

    }
     } class ViewController: UIViewController ,AVCaptureVideoDataOutputSampleBufferDelegate,AVCaptureFileOutputRecordingDelegate{

    var previewLayer : AVCaptureVideoPreviewLayer?
    var captureDevice : AVCaptureDevice?
    var videoCaptureOutput = AVCaptureVideoDataOutput()
    let captureSession = AVCaptureSession()    // var videoCaptureOutputF = AVCaptureFileOutput()

    override func viewDidLoad() {
        super.viewDidLoad()
        captureSession.sessionPreset = AVCaptureSessionPreset640x480
        let devices = AVCaptureDevice.devices()
        for device in devices {

            if (device.hasMediaType(AVMediaTypeVideo)) {
                if device.position == AVCaptureDevicePosition.Back {
                    captureDevice = device as? AVCaptureDevice
                    if captureDevice != nil {
                        beginSession()
                    }

                }

            }

        }

    }

    func beginSession() {
        var err : NSError? = nil
        captureSession.addInput(AVCaptureDeviceInput(device: captureDevice, error: &err))
        if err != nil {
            println("Error: \(err?.localizedDescription)")
        }
        videoCaptureOutput.videoSettings = [kCVPixelBufferPixelFormatTypeKey:kCVPixelFormatType_32BGRA]
        //videoCaptureOutput.sampleBufferDelegate=self
        videoCaptureOutput.alwaysDiscardsLateVideoFrames = true
        captureSession.addOutput(videoCaptureOutput)
        previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
        self.view.layer.addSublayer(previewLayer)
        previewLayer?.frame = CGRectMake(0, 20, self.view.bounds.width,  self.view.bounds.height)
        var startVideoBtn = UIButton(frame: CGRectMake(10,40, 40, 40))
        startVideoBtn.backgroundColor=UIColor.greenColor()
        startVideoBtn.addTarget(self, action: "startVideoRecording", forControlEvents:
            UIControlEvents.TouchUpInside)
        self.view.addSubview(startVideoBtn)
        var stopVideoBtn = UIButton(frame: CGRectMake(200, 40, 40, 40))
        stopVideoBtn.backgroundColor=UIColor.redColor()
        stopVideoBtn.addTarget(self, action: "stopVideoRecording", forControlEvents: UIControlEvents.TouchUpInside)
        self.view.addSubview(stopVideoBtn)
    }
    func startVideoRecording(){
        captureSession.startRunning()
        //        AVCaptureMovieFileOutput *aMovieFileOutput = <#Get a movie file output#>;

        //        NSURL *fileURL = <#A file URL that identifies the output location#>;

        //        [aMovieFileOutput startRecordingToOutputFileURL:fileURL recordingDelegate:<#The delegate#>];
       }
    func stopVideoRecording(){
        captureSession.stopRunning()
        print(videoCaptureOutput)

        // here i am getting problems that how to save recorded   video
        **let videoDelegate = VideoDelegate()
        let fileOutput = AVCaptureMovieFileOutput()
       // captureSession.addOutput(videoCaptureOutput)
        let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as! NSString
        let outputPath = "\(documentsPath)/output.mp4"
        let outputFileUrl = NSURL(fileURLWithPath: outputPath)
     fileOutput.startRecordingToOutputFileURL(outputFileUrl, recordingDelegate: videoDelegate)**

斯威夫特-4

func startVideoRecording(){
    captureSession.startRunning()
    let fileOutput = AVCaptureMovieFileOutput()
    captureSession.addOutput(fileOutput)
    let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as! NSString
    let outputPath = "\(documentsPath)/output.mp4"
    let outputFileUrl = NSURL(fileURLWithPath: outputPath)
    fileOutput.startRecording(to: outputFileUrl, recordingDelegate: self)
   }
func stopVideoRecording(){
    fileOutput.stopRecording()
 }

func captureOutput(captureOutput: AVCaptureFileOutput!, didFinishRecordingToOutputFileAtURL outputFileURL: NSURL!, fromConnections connections: [AnyObject]!, error: NSError!) {
    println("capture output : finish recording to \(outputFileURL)”)
    UISaveVideoAtPathToSavedPhotosAlbum(outputFileURL.path, nil, nil, nil)
}
func captureOutput(captureOutput: AVCaptureFileOutput!, didStartRecordingToOutputFileAtURL fileURL: NSURL!, fromConnections connections: [AnyObject]!) {
    println("capture output: started recording to \(fileURL)")
}

暂无
暂无

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

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