Swift4 音视频采集

Swift4 音视频采集有需要涉及采集编码的伙伴复制粘贴,拿走不谢???

//
//  PushViewController.swift
//  SwiftLiveDemo
//
//  Created by BraveShine on 2017/11/7.
//  Copyright © 2017年 BraveShine. All rights reserved.
//

import UIKit
import AVFoundation

class PushViewController: UIViewController {

    /// 采集会话
    var session = AVCaptureSession()

    /// 前置摄像头输入
    var frontCamera : AVCaptureDeviceInput?
    
    /// 后置摄像头输入
    var backCamera : AVCaptureDeviceInput?
    
    /// 当前视频输入摄像头
    var videoInputDevice : AVCaptureDeviceInput?
    
    /// 麦克风
    var audioInputDevice : AVCaptureDeviceInput?
    
    /// 视频输出
    var videoDataOutput : AVCaptureVideoDataOutput?
    
    /// 音频输出
    var audioDataOutput : AVCaptureAudioDataOutput?
    
    /// 回话
    var captureSession : AVCaptureSession?
    
    /// 预览
    var previewLayer :  AVCaptureVideoPreviewLayer?
    
   
    
    override func viewDidLoad() {
        super.viewDidLoad()

        
        // MARK: 初始化输入设备
        let videoDevices = AVCaptureDevice.devices(for: .video)
        
        
        /// 前置摄像头
        let f = videoDevices.filter({ return $0.position == .front }).first
        
        /// 后置摄像头
        let b = videoDevices.filter({ return $0.position == .back }).first

        frontCamera = try? AVCaptureDeviceInput(device: f!)
        
        backCamera = try? AVCaptureDeviceInput(device: b!)
        
        /// 音频设备
        let audioDevice = AVCaptureDevice.default(for: .audio)
        
        audioInputDevice = try? AVCaptureDeviceInput.init(device: audioDevice!)

        
        
        //MARK: 初始化输出设备
        let captureQueue =  DispatchQueue.global(qos: .default)
        
        videoDataOutput = AVCaptureVideoDataOutput()
        
        videoDataOutput?.setSampleBufferDelegate(self, queue: captureQueue)
        
        ///保证实时性,放弃延迟祯
        videoDataOutput?.alwaysDiscardsLateVideoFrames = true
        
        ///设置输出格式为 yuv420
        videoDataOutput?.videoSettings = [kCVPixelBufferPixelFormatTypeKey as String : kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange]
        
        audioDataOutput = AVCaptureAudioDataOutput()
        
        audioDataOutput?.setSampleBufferDelegate(self, queue: captureQueue)

        ///设置当前摄像头为前置摄像头
        videoInputDevice = frontCamera
        
        //MARK: 创建会话
        captureSession = AVCaptureSession()
        
        ///开始配置
        captureSession?.beginConfiguration()

        ///将音视频输入输出设备添加到会话中
        if (captureSession?.canAddInput(videoInputDevice!))! {
            captureSession?.addInput(videoInputDevice!)
        }
        
        if (captureSession?.canAddInput(audioInputDevice!))!{
            captureSession?.addInput(audioInputDevice!)
        }
        
        if (captureSession?.canAddOutput(videoDataOutput!))!{
            captureSession?.addOutput(videoDataOutput!)
//            videoOutConfig()
        }
        
        if (captureSession?.canAddOutput(audioDataOutput!))!{
            captureSession?.addOutput(audioDataOutput!)
            
        }
        
       
        ///设置分辨率
        captureSession?.sessionPreset = .hd1280x720
        
        ///提交配置
        captureSession?.commitConfiguration()
        
        ///开始采集
        captureSession?.startRunning()
        
        //创建预览Layer
        previewLayer = AVCaptureVideoPreviewLayer.init(session: captureSession!)
        
        previewLayer?.frame = self.view.bounds
        
        view.layer.insertSublayer(previewLayer!, at: 0)
    }
    
    
    
    
   
    //切换摄像头
    @IBAction func switchCreame(_ sender: UIButton) {
        
        captureSession?.beginConfiguration()
        
        let currenInput = (videoInputDevice == frontCamera ? backCamera : frontCamera)
        
        captureSession?.removeInput(videoInputDevice!)
        
        captureSession?.addInput(currenInput!)
        
        captureSession?.commitConfiguration()
        
        videoInputDevice = currenInput
        
        
        
        
    }
    
    deinit {
        print("deinit")
    }

}

extension PushViewController : AVCaptureVideoDataOutputSampleBufferDelegate, AVCaptureAudioDataOutputSampleBufferDelegate
{
    func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
        print(sampleBuffer)
        
        
        if videoDataOutput == output {//视频输出
            
        }
        
        if audioDataOutput == output {//音频输出
            
        }
        
       
    }
}

复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值