我们可以使用以下代码示例解决此问题:
在SwiftUI中添加一个自定义视图,用于捕获视频并将其保存到设备的本地文件中。
import SwiftUI
import AVFoundation
struct CameraView: View {
@StateObject var viewModel: CameraViewModel
var body: some View {
ZStack {
CameraPreviewView(session: viewModel.session)
VStack {
Spacer()
HStack {
RecordButtonView(viewModel: viewModel)
.padding()
Spacer()
}
}
}
}
}
class CameraViewModel: NSObject, ObservableObject, AVCaptureFileOutputRecordingDelegate {
let session: AVCaptureSession
var videoFileOutput: AVCaptureMovieFileOutput?
var recording = false
var videoURL: URL?
init(session: AVCaptureSession) {
self.session = session
super.init()
self.videoFileOutput = AVCaptureMovieFileOutput()
if self.session.canAddOutput(self.videoFileOutput!) {
self.session.addOutput(self.videoFileOutput!)
}
}
func startRecording() {
let fileURL = URL(fileURLWithPath: NSTemporaryDirectory() + "output.mov")
self.videoFileOutput?.startRecording(to: fileURL, recordingDelegate: self)
self.recording = true
self.videoURL = fileURL
}
func stopRecording() {
self.videoFileOutput?.stopRecording()
self.recording = false
}
func fileOutput(_ output: AVCaptureFileOutput,
didFinishRecordingTo outputFileURL: URL,
from connections: [AVCaptureConnection],
error: Error?) {
if let error = error {
print(error.localizedDescription)
} else {
UISaveVideoAtPathToSavedPhotosAlbum(outputFileURL.path, nil, nil, nil)
}
}
}
struct CameraPreviewView: UIViewRepresentable {
let session: AVCaptureSession
func makeUIView(context: Context) -> UIView {
let view = UIView(frame: .zero)
if let previewLayer = AVCaptureVideoPreviewLayer(session: session) {
previewLayer.videoGravity = .resizeAspectFill
previewLayer.connection?.videoOrientation = .portrait
view