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 {//音频输出
}
}
}
复制代码