iOSAVCaptureSession+AVAssetWriter录制视频
在iOS开发中,我们经常需要使用摄像头来录制视频。AVCaptureSession是iOS中用于捕获音频和视频的核心类之一,而AVAssetWriter是一个简单易用的类,用于将音频和视频捕捉到的数据写入到一个文件中。本文将介绍如何使用AVCaptureSession和AVAssetWriter来录制视频,并提供相应的代码示例。
步骤一:设置AVCaptureSession
首先,我们需要创建一个AVCaptureSession实例,并配置其输入和输出。
// 初始化AVCaptureSession
let captureSession = AVCaptureSession()
// 设置摄像头设备
guard let videoDevice = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back) else { return }
guard let videoInput = try? AVCaptureDeviceInput(device: videoDevice) else { return }
if captureSession.canAddInput(videoInput) {
captureSession.addInput(videoInput)
}
// 设置音频设备
guard let audioDevice = AVCaptureDevice.default(for: .audio) else { return }
guard let audioInput = try? AVCaptureDeviceInput(device: audioDevice) else { return }
if captureSession.canAddInput(audioInput) {
captureSession.addInput(audioInput)
}
// 配置输出
let videoOutput = AVCaptureVideoDataOutput()
videoOutput.setSampleBufferDelegate(self, queue: DispatchQueue.global())
if captureSession.canAddOutput(videoOutput) {
captureSession.addOutput(videoOutput)
}
let audioOutput = AVCaptureAudioDataOutput()
audioOutput.setSampleBufferDelegate(self, queue: DispatchQueue.global())
if captureSession.canAddOutput(audioOutput) {
captureSession.addOutput(audioOutput)
}
在上述代码中,我们首先创建了一个AVCaptureSession实例,然后设置了视频和音频的输入设备,并将其添加到captureSession中。接下来,我们配置了视频和音频的输出,并将其添加到captureSession中。
步骤二:创建AVAssetWriter
接下来,我们需要创建一个AVAssetWriter实例,并设置其输出文件的路径和格式。
// 设置输出文件路径
let outputPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first! + "/output.mp4"
let outputURL = URL(fileURLWithPath: outputPath)
// 创建AVAssetWriter实例
guard let assetWriter = try? AVAssetWriter(url: outputURL, fileType: .mp4) else { return }
在上述代码中,我们首先使用NSSearchPathForDirectoriesInDomains方法获取了输出文件的路径,并创建了相应的URL。然后,我们使用AVAssetWriter的init(url:fileType:)方法创建了一个AVAssetWriter实例。
步骤三:配置AVAssetWriter输入
接下来,我们需要配置AVAssetWriter的输入,以便将捕获到的音视频数据写入到输出文件中。
// 配置视频输入
let videoSettings: [String: Any] = [
AVVideoCodecKey: AVVideoCodecType.h264,
AVVideoWidthKey: 1280,
AVVideoHeightKey: 720
]
let videoInput = AVAssetWriterInput(mediaType: .video, outputSettings: videoSettings)
videoInput.expectsMediaDataInRealTime = true
if assetWriter.canAdd(videoInput) {
assetWriter.add(videoInput)
}
// 配置音频输入
let audioSettings: [String: Any] = [
AVFormatIDKey: kAudioFormatMPEG4AAC,
AVNumberOfChannelsKey: 2,
AVSampleRateKey: 44100,
AVEncoderBitRateKey: 128000
]
let audioInput = AVAssetWriterInput(mediaType: .audio, outputSettings: audioSettings)
audioInput.expectsMediaDataInRealTime = true
if assetWriter.canAdd(audioInput) {
assetWriter.add(audioInput)
}
在上述代码中,我们首先配置了视频输入的输出设置,指定了视频编码格式、视频宽度和高度。然后,我们创建了一个AVAssetWriterInput实例,并将其添加到assetWriter中。接下来,我们配置了音频输入的输出设置,指定了音频格式、声道数、采样率和比特率,并将其添加到assetWriter中。
步骤四:开始录制和停止录制
最后,我们需要通过AVCaptureSession的startRunning()方法开始录制,并通过AVAssetWriter的finishWriting(completionHandler:)方法停止录制。
// 开始录制
captureSession.startRunning()
// 开始写入
assetWriter.startWriting()
// 停止写入
assetWriter.finishWriting { [weak self] in
if self?.assetWriter.status ==