簡體   English   中英

(Swift)將視頻輸出保存到文件

[英](Swift) Saving video output to file

我在一個視圖控制器中捕獲視頻,音頻和照片,理想情況下是一個捕獲會話。

我目前遇到的問題是錄制視頻。 它顯示輸出到我的預覽正常。 我啟用了AVCaptureFileOutputRecordingDelegate並實現了以下方法。

func captureOutput(captureOutput: AVCaptureFileOutput!, didFinishRecordingToOutputFileAtURL outputFileURL: NSURL!, fromConnections connections: [AnyObject]!, error: NSError!)

var outputUrl = NSURL(fileURLWithPath: NSTemporaryDirectory() + "test.mp4")
movieOutput?.startRecordingToOutputFileURL(outputUrl, recordingDelegate: self)

我在運行上面的代碼時遇到了這個錯誤:

'NSInvalidArgumentException', reason: '*** -[AVCaptureMovieFileOutput startRecordingToOutputFileURL:recordingDelegate:] - no active/enabled connections.'

我的配置:

func configureCaptureSession() {
    capturedPhoto.contentMode = .ScaleAspectFill
    capturedPhoto.clipsToBounds = true
    capturedPhoto.hidden = true

    captureSession = AVCaptureSession()

    captureSession!.beginConfiguration()

    captureSession!.sessionPreset = AVCaptureSessionPresetPhoto


    var error: NSError?

    AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryRecord, error: &error)
    AVAudioSession.sharedInstance().setActive(true, error: &error)

    var audioDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeAudio)
    var audioInput = AVCaptureDeviceInput(device: audioDevice, error: &error)

    if error == nil && captureSession!.canAddInput(audioInput) {
        captureSession!.addInput(audioInput)
    }

    photoCaptureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
    photoDeviceInput = AVCaptureDeviceInput(device: photoCaptureDevice, error: &error)

    if error == nil && captureSession!.canAddInput(photoDeviceInput) {
        captureSession!.addInput(photoDeviceInput)

        stillImageOutput = AVCaptureStillImageOutput()
        stillImageOutput!.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG]
        if captureSession!.canAddOutput(stillImageOutput) {
            captureSession!.addOutput(stillImageOutput)
        }

        movieOutput = AVCaptureMovieFileOutput()
        if captureSession!.canAddOutput(movieOutput) {
            captureSession!.addOutput(movieOutput)
        }

        photoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
        photoPreviewLayer!.videoGravity = AVLayerVideoGravityResizeAspectFill
        photoPreviewLayer!.connection?.videoOrientation = AVCaptureVideoOrientation.Portrait

        cameraView.layer.addSublayer(photoPreviewLayer)

        contentView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "focusPhoto:"))

    }

    captureSession!.commitConfiguration()
    captureSession!.startRunning()
}

我在你的代碼中發現了兩個問題。

重復的文件

根據Apple的startRecordingToOutputFileURL:recordingDelegate:文檔startRecordingToOutputFileURL:recordingDelegate: ::

開始錄制到給定的URL。 該方法設置接收器當前正在寫入輸出媒體的文件URL。 如果捕獲開始時已存在給定URL的文件,則記錄到新文件將失敗。

在iOS中,不支持此幀精確文件切換。 在再次調用此方法之前,必須調用stopRecording以避免任何錯誤。 通過調用stopRecording,通過使用此方法更改文件或由於錯誤停止記錄時,需要包含在文件中的剩余數據將在后台寫入。 因此,您必須指定一個委托,當使用captureOutput:didFinishRecordingToOutputFileAtURL:fromConnections:error:將所有數據寫入文件時將通知該captureOutput:didFinishRecordingToOutputFileAtURL:fromConnections:error: method。

在您的情況下,如果在開始新錄制時test.mp4已存在,則會失敗。 因此,最好每次都為錄制的文件指定一個唯一的名稱。 例如,使用當前時間戳。

會話預設

在您的代碼中,將sessionPreset設置為AVCaptureSessionPresetPhoto

captureSession!.sessionPreset = AVCaptureSessionPresetPhoto

但根據我的個人經驗,它不適合視頻輸出,並會導致您的錯誤。 切換到AVCaptureSessionPresetHigh並再試一次。 此外,建議調用canSetSessionPreset:並僅在canSetSessionPreset:返回YES應用預設。

示例代碼

Apple提供了一個關於AVFoundation使用的很好的示例代碼 ,您可能想要查看它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM