视频采集需要用到的类GPUImageVideoCamera
要实现的功能:
1、实现视频的录制
2、实现录制过程中对视频的美颜
3、实现对视频的硬编码
4、实现视频写入文件,并且拿到视频路径
5、拿到视频的第一帧,并且展示在屏幕上
代码
//
// ViewController.swift
// GPUImage_视频采集
//
// Created by liyang on 16/12/29.
// Copyright © 2016年 liyang. All rights reserved.
//
/*
1、实现视频的录制
2、实现录制过程中对视频的美颜
3、实现对视频的软编码
4、实现视频写入文件,并且拿到视频路径
5、拿到视频的第一帧,并且展示在屏幕上
*/
/*
问题:第二次写入失败,导致异常出现
不能有限的对视频进行编码
*/
import UIKit
import GPUImage
import AVKit
class ViewController: UIViewController {
@IBOutlet weak var bjImage: UIImageView!
// MARK:- 创建视频源
fileprivate lazy var camera: GPUImageVideoCamera = GPUImageVideoCamera(sessionPreset: AVCaptureSessionPresetHigh, cameraPosition: .back)
// MARK:- 创建预览图层
fileprivate lazy var preView: GPUImageView = GPUImageView(frame: self.view.bounds)
fileprivate lazy var fileGroup: GPUImageFilterGroup = {
// 1、创建滤镜组
let fileterGroup = GPUImageFilterGroup()
// 2、创建滤镜(设置滤镜的引用关系)
// 2-1、 初始化滤镜
let bilateralFilter = GPUImageBilateralFilter() // 磨皮
let exposureFilter = GPUImageExposureFilter() // 曝光
let brightnessFilter = GPUImageBrightnessFilter() // 美白
let satureationFilter = GPUImageSaturationFilter() // 饱和
// 2-2、设置滤镜的引用关系
bilateralFilter.addTarget(brightnessFilter)
brightnessFilter.addTarget(exposureFilter)
exposureFilter.addTarget(satureationFilter)
// 3、设置滤镜组链的起点&&终点
fileterGroup.initialFilters = [bilateralFilter]
fileterGroup.terminalFilter = satureationFilter
return fileterGroup
}()
// MARK:- 视频写入文件的路径
var fileURL: URL {
return URL(fileURLWithPath: "\(NSTemporaryDirectory())liyang_demo3.mp4")
}
// MARK:- 创建写入对象
fileprivate lazy var movieWrite: GPUImageMovieWriter = { [unowned self] in
let writer = GPUImageMovieWriter(movieURL: self.fileURL, size: self.view.bounds.size)
return writer!
}()
override func viewDidLoad() {
super.viewDidLoad()
//1、设置camera方向
camera.outputImageOrientation = .portrait // 输出是竖直方向
camera.horizontallyMirrorFrontFacingCamera = true // 使用前置
camera.delegate = self
camera.audioEncodingTarget = movieWrite
//2、创建预览图层
view.insertSubview(preView, at: 0)
//3、给视频源添加上滤镜组
camera.addTarget(fileGroup)
fileGroup.addTarget(preView)
//4、设置writer属性
movieWrite.encodingLiveVideo = true // 对视频进行编码
fileGroup.addTarget(movieWrite) // 给写入的视频添加滤镜
}
@IBAction func startRecord(_ sender: Any) {
// 开始采集画面
camera.startCapture()
// 开始录制
movieWrite.startRecording()
}
@IBAction func endRecord(_ sender: Any) {
// 结束采集画面
camera.stopCapture()
// 结束录制
movieWrite.finishRecording()
}
@IBAction func rotateCamera(_ sender: Any) {
camera.rotateCamera()
}
@IBAction func playVideo(_ sender: Any) {
// 播放视频
let playerVc = AVPlayerViewController()
playerVc.player = AVPlayer(url: fileURL)
present(playerVc, animated: true, completion: nil)
}
}
extension ViewController: GPUImageVideoCameraDelegate {
func willOutputSampleBuffer(_ sampleBuffer: CMSampleBuffer!) {
print("采集到画面")
}
}
代码中存在两个问题:1、没有实现对视频的编码,结果导致视频体积很大 2、当第二次点击的录制视频的时候,会抛出异常,楼主现在去学习克服这两个bug了,学会了,再回来更新