web-dev-qa-db-ja.com

Swiftでavfoundationでビデオを録画する方法は?

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
}
_

そして、私がそれを正しく実装する方法を理解できないので、あなたが想像できるように何も起こりません。

21
Garret Kaye

あなたのコードを試しました。意味のある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)
15
liuyaodong