[英](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.