AVKit 与 Swift 一起使用,但没有创建文件。为啥?

Posted

技术标签:

【中文标题】AVKit 与 Swift 一起使用,但没有创建文件。为啥?【英文标题】:AVKit used with Swift, yet no file created. Why?AVKit 与 Swift 一起使用,但没有创建文件。为什么? 【发布时间】:2021-08-14 19:35:20 【问题描述】:

这里有一些简化的代码,它尝试在 Swift 中使用 AVKit 将视频录制到文件中。没有抛出错误,但检查时不存在文件。我遗漏了什么?

我尝试了几种不同的变体,结果都一样。没有创建文件。

extension UIViewController:AVCaptureFileOutputRecordingDelegate
    public func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) 
        if let error = error
            print(error.localizedDescription)
        
        print("checking if \(outputFileURL.absoluteString) exists: \(FileManager.default.fileExists(atPath: outputFileURL.absoluteString))")
    


class ViewController: UIViewController 

    var captureSession = AVCaptureSession()
    var movieOutput = AVCaptureMovieFileOutput()
    var previewLayer = AVCaptureVideoPreviewLayer()

    @IBOutlet var cameraView: UIView!

    override func viewWillAppear(_ animated: Bool) 
        self.cameraView = self.view

        guard let camera = AVCaptureDevice.default(.builtInWideAngleCamera, for: AVMediaType.video, position: .front) else
                return
            
        
        do
            let input = try AVCaptureDeviceInput(device: camera)
            if captureSession.canAddInput(input)

                captureSession.addInput(input)

                if captureSession.canAddOutput(movieOutput)

                    captureSession.addOutput(movieOutput)

                    previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
                    previewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
                    previewLayer.connection?.videoOrientation = AVCaptureVideoOrientation.portrait
                    cameraView.layer.addSublayer(previewLayer)

                    previewLayer.position = CGPoint(x: self.cameraView.frame.width / 2, y: self.cameraView.frame.height / 2)
                    previewLayer.bounds = cameraView.frame
               

                    captureSession.startRunning()
                    
                    let fileUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("output.mov")
                    try? FileManager.default.removeItem(at: fileUrl)
                    
                    print("recording to: \(fileUrl.absoluteString)")
                    movieOutput.startRecording(to: fileUrl, recordingDelegate: self)
                    DispatchQueue.main.asyncAfter(deadline: .now() + 5) 
                        self.movieOutput.stopRecording()
                        
                    
                
            
        
        catch
            print("Error")
        
    

【问题讨论】:

我不确定这是否有帮助,但如果我没记错的话,请尝试删除文件扩展名“.mov”,这是 Windows 的东西。 ios 和 macOS 使用 .mp4 我使用过各种扩展,但没有一个。没有不同。 mov 扩展名只是我尝试的最后一个。 【参考方案1】:

我找到了。问题出在我正在做的检查中。线

print("checking if \(outputFileURL.absoluteString) exists: \(FileManager.default.fileExists(atPath: outputFileURL.absoluteString))")

应该阅读

print("checking if \(outputFileURL.absoluteString) exists: \(FileManager.default.fileExists(atPath: outputFileURL.path))")

【讨论】:

以上是关于AVKit 与 Swift 一起使用,但没有创建文件。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

Airplay 不能与 Swift 的 AVRoutePicker 一起使用,但可以与 Objective C 一起使用

视频播放(AVPlayer ViewController、AVkit)不工作(不出现)

使用 avkit 流式传输视频时出现黑屏

使用 xcode 5 在可可中找不到 AVKit

AVKit 无法流式传输 Dropbox 链接视频

无法使用带有 Swift 的 AVPlayer 播放视频