Swift开启权限并且拍摄视频

引入AVFoundation 框架

 fileprivate lazy var queue = DispatchQueue.global();
    fileprivate lazy var audioqueue = DispatchQueue.global();
    fileprivate lazy var session = AVCaptureSession();
    fileprivate lazy var previewLayer = AVCaptureVideoPreviewLayer(session: session)
    fileprivate var videoOutPut : AVCaptureVideoDataOutput?
    fileprivate var videoInput:AVCaptureDeviceInput?
    fileprivate var movieOutPut: AVCaptureMovieFileOutput?

  extension ViewController  {
    
    
    
    //视频采集
    func startCapture(){
        
        
        let movieOutPut = AVCaptureMovieFileOutput();
        
        self.movieOutPut = movieOutPut
        session.addOutput( self.movieOutPut!)
        
        
        
        
        
        
        
        
        
        //将input添加到会话中
        //        guard let devices:AVCaptureDevice = AVCaptureDevice.default(for: AVMediaType.video) else{
        //            print("摄像头不可用")
        //            return;
        //        };
        //
        
        
        //        AVCaptureDeviceDiscoverySession *devicesIOS10 = [AVCaptureDeviceDiscoverySession  discoverySessionWithDeviceTypes:@[AVCaptureDeviceTypeBuiltInWideAngleCamera] mediaType:AVMediaTypeVideo position];
        //
        //        NSArray *devicesIOS  = devicesIOS10.devices;
        //        for (AVCaptureDevice *device in devicesIOS) {
        //            if ([device position] == position) {
        //                return device;
        //            }
        //        }
        
        let discover =  AVCaptureDevice.DiscoverySession(deviceTypes: [AVCaptureDevice.DeviceType.builtInWideAngleCamera], mediaType: AVMediaType.video, position: AVCaptureDevice.Position.front)
        
        let devices =   discover.devices.filter { (device) -> Bool in
            return device.position==AVCaptureDevice.Position.front
        }.first
        
        
        
        
        let input =  (try?  AVCaptureDeviceInput(device: devices!))
        
        
        
        session.addInput(input!)
        
        self.videoInput = input;
        
        
        
        
        //设置捕捉会话输出源
        let outPut = AVCaptureVideoDataOutput();
        outPut.setSampleBufferDelegate(self, queue: queue)
        session.addOutput(outPut)
        
        
        //给用户看到一个预览图层
        
        previewLayer.frame = view.bounds
        //        view.layer.addSublayer(previewLayer)
        view.layer.insertSublayer(previewLayer, at: 0)
        
        //开始采集
        session.startRunning()
        
        //获取视频的videoConnect
        
        
        
        //将开始采集的画面,写入到文件中
        let path = (NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first! + "/abc.mp4")
        
        
        
        print("路径",path)
        
        
        
        videoOutPut = outPut;
        //         videoConnect = outPut.connection(with:  AVMediaType.video)
        
        
        //添加写入文件的OutPut
        
        
        
        
        
        //设置写入的稳定性
        let connection = self.movieOutPut!.connection(with: AVMediaType.video)
        connection?.preferredVideoStabilizationMode = .auto
        
        self.movieOutPut!.startRecording(to: URL(fileURLWithPath: path), recordingDelegate: self)
        
        
        
    }
    
    @IBAction  func stopCapture()  {
        
        self.movieOutPut?.stopRecording()
        
        
        
        session.stopRunning()
        previewLayer.removeFromSuperlayer()
    }
    
    
    
    
    //音频采集
    func startAudio(){
        
        guard let devices:AVCaptureDevice = AVCaptureDevice.default(for: AVMediaType.audio) else{
            print("话筒不可用")
            return;};
        
        let input =  (try?  AVCaptureDeviceInput(device: devices))!
        
        session.addInput(input)
        
        //设置捕捉会话输出源
        let outPut = AVCaptureAudioDataOutput();
        
        outPut.setSampleBufferDelegate(self, queue: audioqueue)
        
        session.addOutput(outPut)
    }
    
    
    //切换镜头
    @IBAction  func switchScene(){
        
        
        //获取之前的镜头
        guard var position =  self.videoInput?.device.position else
        {
            return;
        }
        
        
        
        
        //
        //
        //        //获取当前应该显示的镜头
        //
        position = ((position == AVCaptureDevice.Position.front) ? AVCaptureDevice.Position.back : AVCaptureDevice.Position.front)
        //
        //        //根据当前镜头创建新的device
        //
        //
        //
        //        guard let devices:AVCaptureDevice = AVCaptureDevice.default(for: AVMediaType.video) else{
        //                print("摄像头不可用")
        //                return;
        //            };
        
        //根据新的device创建新的input
        
        
        let discover =  AVCaptureDevice.DiscoverySession(deviceTypes: [AVCaptureDevice.DeviceType.builtInWideAngleCamera], mediaType: AVMediaType.video, position:position)
        
        let devices =   discover.devices.filter { (device) -> Bool in
            return device.position==position
        }.first!
        
        
        
        
        let input =  (try?  AVCaptureDeviceInput(device: devices))
        
        
        
        
        
        //在session中切换input
        
        session.beginConfiguration();
        
        session.removeInput(self.videoInput!)
        
        
        
        session.addInput(input!)
        
        session.commitConfiguration()
        
        self.videoInput = input;
        
        
        
    }
    
    
    
}


extension ViewController: AVCaptureVideoDataOutputSampleBufferDelegate,AVCaptureAudioDataOutputSampleBufferDelegate{
    
    func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
        
        
        if connection==self.videoOutPut!.connection(with:  AVMediaType.video){
            print("已经采集到视频画面")
        }else
        {
            print("已经采集音频画面")
        }
    }
    
    
    
}



//写入文件到目录的方法
extension ViewController: AVCaptureFileOutputRecordingDelegate
{
    
    func fileOutput(_ output: AVCaptureFileOutput, didStartRecordingTo fileURL: URL, from connections: [AVCaptureConnection])
    {
        print("开始写入文件")
    }
    
    
    
    func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?)
    {
        
        print("结束写入文件",error?.localizedDescription ?? "")
    }
    
    
    
    
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值