iOS-音視訊採集 by GPUImage
阿新 • • 發佈:2019-02-15
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 包含音訊和視訊資源
}
}