使用实时预览录制视频的SwiftUI

使用实时预览录制视频的SwiftUI,swiftui,video-capture,avkit,uiviewrepresentable,Swiftui,Video Capture,Avkit,Uiviewrepresentable,试图制作一个屏幕,允许用户用30秒的定时器录制视频,然后我想把它发送到服务器上。问题是没有调用委托方法(参见第二部分代码) 我所做的是预览视图作为UIView、时间和会话设置。即使在我选中captureSession.isRecording时,其显示为false 已更新: 视图可表示性 struct VideoRecordingView: UIViewRepresentable { @Binding var timeLeft: Int @Binding var onComple

试图制作一个屏幕,允许用户用30秒的定时器录制视频,然后我想把它发送到服务器上。问题是没有调用委托方法(参见第二部分代码)

我所做的是预览视图作为UIView、时间和会话设置。即使在我选中captureSession.isRecording时,其显示为false

已更新

视图可表示性

struct VideoRecordingView: UIViewRepresentable {

    @Binding var timeLeft: Int
    @Binding var onComplete: Bool
    @Binding var recording: Bool
    func makeUIView(context: UIViewRepresentableContext<VideoRecordingView>) -> PreviewView {
        let recordingView = PreviewView()
        recordingView.onComplete = {
            self.onComplete = true
        }

        recordingView.onRecord = { timeLeft, totalShakes in
            self.timeLeft = timeLeft
            self.recording = true
        }

        recordingView.onReset = {
            self.recording = false
            self.timeLeft = 30
        }
        return recordingView
    }

    func updateUIView(_ uiViewController: PreviewView, context: UIViewRepresentableContext<VideoRecordingView>) {

    }
}
struct VideoRecordingView:UIViewRepresentable{
@绑定变量timeLeft:Int
@绑定变量onComplete:Bool
@绑定变量记录:Bool
func makeUIView(上下文:UIViewRepresentableContext)->PreviewView{
让recordingView=PreviewView()
recordingView.onComplete={
self.onComplete=true
}
recordingView.onRecord={timeLeft,totalShakes在
self.timeLeft=timeLeft
自记录=真
}
recordingView.onReset={
自我记录=错误
self.timeLeft=30
}
返回录制视图
}
func updateUIView(uViewController:PreviewView,context:UIViewRepresentableContext){
}
}
查看

扩展预览视图:AVCaptureFileOutputRecordingDelegate{
func fileOutput(uu输出:AVCaptureFileOutput,didFinishRecordingTo outputFileURL:URL,来自连接:[AVCaptureConnection],错误:error?){
打印(outputFileURL.absoluteString)//未调用
}
}
类预览视图:UIView{
专用var captureSession:AVCaptureSession?
私人倒计时:计时器?
让videoFileOutput=AVCaptureMovieFileOutput()
var recordingDelegate:AVCaptureFileOutputRecordingDelegate!
记录的var=0
var secondsToReachGoal=30
变量onRecord:((Int,Int)->())?
变量onReset:(()->())?
变量onComplete:(()->())?
init(){
super.init(帧:.0)
var allowedAccess=false
let blocker=DispatchGroup()
blocker.enter()
AVCaptureDevice.requestAccess(用于:。视频){中的标志
allowedAccess=标志
拦截器离开
}
拦截器,等等
如果!允许访问{
打印(!!!无法访问相机)
返回
}
//设置会话
let session=AVCaptureSession()
session.beginConfiguration()
设videoDevice=AVCaptureDevice.default(.builtInWideAngleCamera,
对于:。视频,位置:。前)
guard videoDevice!=nil,让videoDeviceInput=try?AVCaptureDeviceInput(设备:videoDevice!),会话。可以添加其他输入(videoDeviceInput){
打印(!!!未检测到摄像头)
返回
}
会话.添加输入(视频设备输入)
会议.委员会配置()
self.captureSession=会话
}
覆盖类var layerClass:AnyClass{
AVCaptureVideoPreviewLayer.self
}
必需初始化?(编码器:NSCoder){
fatalError(“初始化(编码者:)尚未实现”)
}
var videoPreviewLayer:AVCaptureVideoPreviewLayer{
将图层返回为!AVCaptureVideoPreviewLayer
}
重写func didmovetoserview(){
super.didMoveToSuperview()
recordingDelegate=self
startTimers()
startRecording()
如果nil!=self.superview{
self.videoPreviewLayer.session=self.captureSession
self.videoPreviewLayer.videoGravity=.resizeAspect
自我捕获会话?.startRunning()
}否则{
self.captureSession?.stopRunning()
}
}
私有函数onTimerFires(){

打印(在调用
开始录制()之前,您需要调用
self.captureSession?.startRunning()
,这里是一个录制的工作示例。点击
切换完成
停止录制

导入快捷界面
进口AVKit
结构记录视图:视图{
@状态专用变量计时器=5
@状态私有变量onComplete=false
@状态私有var记录=false
var body:一些观点{
ZStack{
VideoRecordingView(timeLeft:$timer,onComplete:$onComplete,recording:$recording)
VStack{
按钮(操作:{
self.recording.toggle()
},标签:{
文本(“切换录制”)
})
.foregroundColor(.白色)
.padding()
按钮(操作:{
自动定时器-=1
打印(自动定时器)
},标签:{
文本(“切换计时器”)
})
.foregroundColor(.白色)
.padding()
按钮(操作:{
self.onComplete.toggle()
},标签:{
文本(“切换完成”)
})
.foregroundColor(.白色)
.padding()
}
}
}
}
结构记录视图预览:预览提供程序{
静态var预览:一些视图{
RecordingView()
}
}
结构VideoRecordingView:UIViewRepresentable{
@绑定变量timeLeft:Int
@绑定变量onComplete:Bool
@绑定变量记录:Bool
func makeUIView(上下文:UIViewRepresentableContext)->PreviewView{
让recordingView=PreviewView()
recordingView.onComplete={
self.onComplete=true
}
recordingView.onRecord={timeLeft,totalShakes在
self.timeLeft=timeLeft
自记录=真
}
recordingView.onReset={
自我记录=错误
self.timeLeft=30
}
返回录制视图
}
func updateUIView(uViewController:PreviewView,context:UIViewRepresentableContext){
}
}
扩展预览视图:AVCapt