iOS 采集音视频及写入文件
生活随笔
收集整理的這篇文章主要介紹了
iOS 采集音视频及写入文件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
音視頻采集包括兩部分:視頻采集和音頻采集。在iOS中可以同步采集視頻與音頻,通過系統框架AVFoundation,可以幫助我們采集音頻與視頻,對于視頻還可以進行切換前后攝像頭,最終我們將錄制好的視頻寫入沙盒中
音視頻數據的采集與展示
一、初始化視頻的輸入與輸出
// 懶加載一個session,所有的操作都需要session來執行 fileprivate lazy var session: AVCaptureSession = AVCaptureSession() // 保存視頻輸出 fileprivate var videoOutput: AVCaptureVideoDataOutput? // 保存視頻輸入 fileprivate var videoInput: AVCaptureDeviceInput? // 保存預覽圖層 fileprivate var previewLayer: AVCaptureVideoPreviewLayer? 復制代碼設置視頻輸入源與輸出源
// 設置視頻輸入源 guard let devices = AVCaptureDevice.devices() as? [AVCaptureDevice] else { return } // 獲取我們的前置攝像頭(后置為.back) guard let device = devices.filter({ $0.position == .front }).first else { return } guard let input = try? AVCaptureDeviceInput(device: device) else { return } self.videoInput = input// 設置視頻輸出源 let output = AVCaptureVideoDataOutput() let queue = DispatchQueue.global() // 設置代理,并在代理中獲取采集到的數據,需要遵守 AVCaptureVideoDataOutputSampleBufferDelegate output.setSampleBufferDelegate(self, queue: queue) self.videoOutput = output 復制代碼設置音頻的輸入源與輸出源
// 設置音頻的輸入源 guard let device = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeAudio) else { return } guard let input = try? AVCaptureDeviceInput(device: device) else {return}// 設置音頻輸出源 let output = AVCaptureAudioDataOutput() let queue = DispatchQueue.global() // 需要遵守 AVCaptureAudioDataOutputSampleBufferDelegate output.setSampleBufferDelegate(self, queue: queue) 復制代碼添加音頻與視頻的輸入與輸出到session中,但是每次添加之前需要先判斷是否可以添加
// 添加輸入與輸出// 注意:每次對session進行設置之前都需要調用session的【beginConfiguration】方法 // 來告訴系統你現在要開始進行配置,結束配置后再調用【commitConfiguration】方法來提交配置 session.beginConfiguration() if session.canAddInput(input) {session.addInput(input) } if session.canAddOutput(output) {session.addOutput(output) } session.commitConfiguration() 復制代碼二、實現音視頻的采集代理
音視頻雖然需要遵守的代理名稱不一樣,但是需要實現的方法是一致的,所以要拿到音頻或者視頻就得先進行判斷,需要用到AVCaptureOutput的這個方法
// This convenience method returns the first AVCaptureConnection in the receiver's // connections array that has an AVCaptureInputPort of the specified mediaType. If // no connection with the specified mediaType is found, nil is returned.open func connection(withMediaType mediaType: String!) -> AVCaptureConnection! 復制代碼extension ViewController: AVCaptureVideoDataOutputSampleBufferDelegate, AVCaptureAudioDataOutputSampleBufferDelegate {func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!) {if videoOutput?.connection(withMediaType: AVMediaTypeVideo) == connection {print("視頻數據")} else {print("音頻數據")}} } 復制代碼三、初始化一個預覽圖層用來顯示采集到的視頻(非采集所必須的步驟)
// 創建預覽圖層 guard let previewLayer = AVCaptureVideoPreviewLayer(session: session) else {return} previewLayer.frame = view.bounds// 將圖層添加到控制器的view的layer中 view.layer.insertSublayer(previewLayer, at: 0) self.previewLayer = previewLayer 復制代碼現在基本功能都有了,如果想要開始采集音視頻只需要調用
// 開始錄制 session.startRunning() // 結束錄制 session.stopRunning() 復制代碼切換鏡頭
其實就是換掉當前的視頻輸入法制,這里的過程跟上面的設置輸入源一樣。
// 1.取出之前鏡頭的方向 guard let videoInput = videoInput else { return } let position: AVCaptureDevicePosition = videoInput.device.position == .front ? .back : .frontguard let devices = AVCaptureDevice.devices() as? [AVCaptureDevice] else { return } guard let device = devices.filter({ $0.position == position }).first else { return } guard let newInput = try? AVCaptureDeviceInput(device: device) else { return }// 2.移除之前的input,添加新的input session.beginConfiguration() session.removeInput(videoInput) if session.canAddInput(newInput) {session.addInput(newInput) } session.commitConfiguration()// 3.保存最新的input self.videoInput = newInput 復制代碼錄制視頻寫入文件
fileprivate var movieOutput: AVCaptureMovieFileOutput? 復制代碼在開始采集音視頻的時候就要開始寫入文件
// 開始寫入文件 // 1、創建寫入文件的輸出 let fileOutput = AVCaptureMovieFileOutput() self.movieOutput = fileOutput // 保存起來,用于停止寫入文件// 設置類型,不然報錯(這兩句很重要) let connection = fileOutput.connection(withMediaType: AVMediaTypeVideo) connection?.automaticallyAdjustsVideoMirroring = trueif session.canAddOutput(fileOutput) {session.addOutput(fileOutput) }// 2、直接開始寫入文件 let filePath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first! + "/abc.mp4" let fileUrl = URL(fileURLWithPath: filePath) fileOutput.startRecording(toOutputFileURL: fileUrl, recordingDelegate: self) 復制代碼在停止采集音視頻的時候停止寫入文件
// 停止寫入文件 movieOutput?.stopRecording() 復制代碼詳情請看 DEMO
總結
以上是生活随笔為你收集整理的iOS 采集音视频及写入文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第二章 Python数据类型详解
- 下一篇: 韩研究人员声称:创造出了一块“不可破坏”