SwiftでAVFoundationを使用してビデオを録画する方法を見つけようとしています。カスタムカメラを作成することはできましたが、それで静止画を撮る方法しかわからず、ビデオを録画する方法がわかりません。私が理解していることから、あなたはAVCaptureVideoDataOutput
を使用して記録からデータを取得する必要がありますが、記録を開始してデリゲートメソッドを実装する方法がわかりません。
AVFoundation Programing Guide/Still and Video Media Capture全体はObjective-Cにあり、解読することはできないようです。このタスクを達成するための私の試みは次のとおりです。
最初にカメラ/キャプチャセッションを設定します
_override func viewDidLoad() {
super.viewDidLoad()
captureSession.sessionPreset = AVCaptureSessionPresetHigh
let devices = AVCaptureDevice.devices()
for device in devices {
if (device.hasMediaType(AVMediaTypeVideo)) {
if(device.position == AVCaptureDevicePosition.Back) {
captureDevice = device as? AVCaptureDevice
if captureDevice != nil {
beginSession()
}
}
}
}
}
_
次に、beginSession()が呼び出されたら、ライブフィードを設定します
_func beginSession() {
var err : NSError? = nil
captureSession.addInput(AVCaptureDeviceInput(device: captureDevice, error: &err))
if err != nil {
println("error: \(err?.localizedDescription)")
}
previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
self.cameraView.layer.addSublayer(previewLayer)
self.cameraView.bringSubviewToFront(takePhotoButton)
self.cameraView.bringSubviewToFront(self.snappedPicture)
self.cameraView.bringSubviewToFront(self.backButton)
previewLayer?.frame = self.cameraView.layer.frame
captureSession.startRunning()
}
_
ユーザーが記録を押して実際にビデオを記録およびキャプチャする場所で私が立ち往生しているのは次のとおりです:
_@IBAction func takeVideoAction(sender: AnyObject) {
var recordingDelegate:AVCaptureFileOutputRecordingDelegate? = self
var videoFileOutput = AVCaptureMovieFileOutput()
self.captureSession.addOutput(videoFileOutput)
let filePath = NSURL(fileURLWithPath: "filePath")
videoFileOutput.startRecordingToOutputFileURL(filePath, recordingDelegate: recordingDelegate)
}
_
次に、self.videoFileOutput.stopRecording()
を呼び出します。
最後にデリゲートメソッド
_func captureOutput(captureOutput: AVCaptureFileOutput!, didFinishRecordingToOutputFileAtURL outputFileURL: NSURL!, fromConnections connections: [AnyObject]!, error: NSError!) {
return
}
func captureOutput(captureOutput: AVCaptureFileOutput!, didStartRecordingToOutputFileAtURL fileURL: NSURL!, fromConnections connections: [AnyObject]!) {
return
}
_
そして、私がそれを正しく実装する方法を理解できないので、あなたが想像できるように何も起こりません。
あなたのコードを試しました。意味のあるfilePath
を設定すると、すべてうまくいきます。 filePath
を次のように変更すると、デリゲートメソッドが呼び出されます。
let documentsURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0]
let filePath = documentsURL.URLByAppendingPathComponent("temp")
// Do recording and save the output to the `filePath`
videoFileOutput.startRecordingToOutputFileURL(filePath, recordingDelegate: recordingDelegate)