1. 程式人生 > >iOS-音視訊採集 by GPUImage

iOS-音視訊採集 by GPUImage

iOS 呼叫相機採集視訊有兩種常見方式:

  • 使用系統自帶的 AVFoundation 框架
  • 使用第三方 GPUImage 框架

如果想通過原生框架 AVFoundation 採集視訊,請檢視:

GPUImage 是基於 OpenGL ES 的封裝,主要用於 iOS 影象處理,相比OpenGL ES 用起來更加簡潔

GPUImage的四大基礎輸入類
  • GPUImageVideoCamera —– 攝像頭-視訊流
  • GPUImageStillCamera ——– 攝像頭-照相
  • GPUImagePicture ————– 圖片
  • GPUImageMovie ————— 視訊

GPUImage 使用前的準備:

使用 cocoaPods 整合

target 'ProjectName' do

use_frameworks!

pod "GPUImage"

end

開啟相機和麥克風隱私許可權

  • Privacy - Camera Usage Description -> true
  • Privacy - Microphone Usage Description -> true

通過 GPUImageVideoCamera 採集視訊

新增檔案全域性屬性
/// 初始化相機
fileprivate lazy var videoCamera: GPUImageVideoCamera = GPUImageVideoCamera(sessionPreset: AVCaptureSessionPreset1280x720, cameraPosition: .front)
///
設定圖片預覽檢視
fileprivate var gpuImageView: GPUImageView? /// 懶載入高亮濾鏡 fileprivate lazy var filter = GPUImageBrightnessFilter()
配置相機相關屬性
// 設定視訊才採集的畫面樣式 - 豎屏
videoCamera.outputImageOrientation = .portrait

// 新增濾鏡(如果不新增濾鏡,無法看到影象)
videoCamera.addTarget(filter)

// 設定代理,監聽採集到的視訊
videoCamera.delegate = self

// 設定並新增用於實時顯示畫面的GPUImageView
gpuImageView = GPUImageView(frame: view.bounds) if let gpuImageView = gpuImageView { // 新增到最底層 view.insertSubview(gpuImageView, at: 0) // 給顯示畫面新增濾鏡 filter.addTarget(gpuImageView) }
開始採集視訊
// 開始採集
videoCamera.startCapture()
旋轉攝像頭
// 切換攝像頭,不需要判斷當前位於前置或者後置
videoCamera.rotateCamera()
暫停視訊採集
// 暫停視訊採集
videoCamera.pauseCapture()
恢復視訊採集
// 恢復上一次暫停的視訊採集
videoCamera.resumeCameraCapture()
停止視訊採集
// 停止視訊採集
videoCamera.stopCapture()
移除視訊採集
// 停止視訊採集
videoCamera.stopCapture()
// 移除輸入輸出源
videoCamera.removeInputsAndOutputs()
// 移除 預覽檢視
gpuImageView?.removeFromSuperview()
接收採集到的視訊 buffer
// MARK: - GPUImageVideoCameraDelegate
extension ViewController: GPUImageVideoCameraDelegate {
    // output video sampleBuffer,audio, CMSampleBuffer contain video, muxed, etc
    func willOutputSampleBuffer(_ sampleBuffer: CMSampleBuffer!) {
        print("採集到畫面") // sampleBuffer 包含音訊和視訊資源
    }
}