AVCaptureMovieFileOutput - 没有活动启用的连接

作者:编程家 分类: objective 时间:2024-07-26

在使用iOS开发中,有时我们需要使用摄像头来录制视频。AVCaptureMovieFileOutput是一个用于录制视频的类,它可以将摄像头的输出写入一个文件中。然而,在使用AVCaptureMovieFileOutput时,我们可能会遇到一个常见的问题,即"没有活动/启用的连接"的错误。

当我们使用AVCaptureMovieFileOutput进行录制时,我们需要先创建一个AVCaptureSession对象,并将其连接到摄像头和输出。然后,我们可以设置输出的属性,例如输出的文件URL、视频的压缩格式等。最后,我们调用startRecording(to:as:)方法来开始录制。

然而,有时候我们可能会在调用startRecording(to:as:)方法时遇到"没有活动/启用的连接"的错误。这通常是由于连接没有被正确地建立所致。为了解决这个问题,我们需要确保连接被正确地设置和启用。

接下来,让我们来看一个示例代码,以更好地理解如何使用AVCaptureMovieFileOutput来录制视频。

swift

import AVFoundation

class ViewController: UIViewController {

var captureSession: AVCaptureSession!

var movieOutput: AVCaptureMovieFileOutput!

var videoPreviewLayer: AVCaptureVideoPreviewLayer!

override func viewDidLoad() {

super.viewDidLoad()

// 创建捕捉会话

captureSession = AVCaptureSession()

// 设置摄像头

guard let videoDevice = AVCaptureDevice.default(for: .video) else { return }

guard let videoInput = try? AVCaptureDeviceInput(device: videoDevice) else { return }

// 添加输入设备到会话

if captureSession.canAddInput(videoInput) {

captureSession.addInput(videoInput)

}

// 设置输出

movieOutput = AVCaptureMovieFileOutput()

// 添加输出设备到会话

if captureSession.canAddOutput(movieOutput) {

captureSession.addOutput(movieOutput)

}

// 设置预览层

videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)

videoPreviewLayer.videoGravity = .resizeAspectFill

videoPreviewLayer.frame = view.bounds

view.layer.addSublayer(videoPreviewLayer)

// 启动会话

captureSession.startRunning()

}

// 开始录制视频

func startRecording() {

let outputURL = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("video.mov")

movieOutput.startRecording(to: outputURL, recordingDelegate: self)

}

// 停止录制视频

func stopRecording() {

movieOutput.stopRecording()

}

}

extension ViewController: AVCaptureFileOutputRecordingDelegate {

// 录制完成

func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) {

if let error = error {

print("录制视频出错:\(error.localizedDescription)")

} else {

print("视频录制完成:\(outputFileURL.absoluteString)")

}

}

}

在上面的代码中,我们创建了一个ViewController类,并在其中定义了一个AVCaptureSession对象、一个AVCaptureMovieFileOutput对象和一个AVCaptureVideoPreviewLayer对象。在viewDidLoad方法中,我们设置了摄像头和输出,并将它们添加到捕捉会话中。然后,我们创建了一个预览层,并将其添加到视图中。最后,我们启动了捕捉会话。

在开始录制和停止录制的方法中,我们使用AVCaptureMovieFileOutput的startRecording(to:as:)方法和stopRecording()方法来控制录制的开始和结束。并且我们还实现了AVCaptureFileOutputRecordingDelegate协议的fileOutput(_:didFinishRecordingTo:from:error:)方法来处理录制完成后的操作。

通过以上的代码和说明,我们可以更好地理解如何使用AVCaptureMovieFileOutput来录制视频,并且可以避免"没有活动/启用的连接"的错误。在实际开发中,我们可以根据自己的需求对录制的视频进行更多的处理和操作,例如添加滤镜、裁剪等。