与AVFoundation有点混淆

时间:2015-05-17 00:12:54

标签: ios swift ios8 avfoundation

所以我现在已经和AVFoundation合作了几个星期,真是太痛苦了!

我已经在我的相机应用程序中找到了重点,我正在尝试将录制的视频保存到相册中。我在谷歌上看过这里,因为众所周知,Apple的文档对于AVFoundation来说很可怕。

我不确定如何将视频保存到相册。我已经阅读了很多关于如何使用图片的内容,但视频有点不同,因为它们需要一个URL。

我下面的代码并不是很有用。它确实到达println("Succesfully saved the video to the photo album")语句,但之后,它崩溃并出现错误

Succesfully saved the video to the photo album 2015-05-16 19:09:02.371 CopWatch[685:234398] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSURL initFileURLWithPath:]: nil string parameter' *** First throw call stack: (0x183e4e59c 0x19454c0e4 0x183e4e4dc 0x184c90528 0x184c90488 0x18eae665c 0x189f66090 0x100618e30 0x100618df0 0x100623854 0x10061c120 0x10062575c 0x100626f18 0x194d6d2e4 0x194d6cfa8) libc++abi.dylib: terminating with uncaught exception of type NSException

我无法在这里完全掌握逻辑。我想我的谷歌搜索技能并没有达到这个基础的标准,似乎很难找到这个东西的东西。有人可以帮帮我吗?

  

块引用

/**************************************************************************
    DID PRESS CAPTURE
    **************************************************************************/
    @IBAction func didPressCapture(sender: AnyObject) {

        if self.takingVideo == true {

            //------ MAKE SURE WE ARE NOT ALREADY RECORDING ------
            if self.weAreRecording == false {

                println("Taking a video")

                //------ MAKE SURE THE DEVICE IS AUTHORIZED TO TAKE A VIDEO ------
                if self.deviceAuthorized == AVAuthorizationStatus.Authorized {

                    println("Device is authorized to take video")

                    dispatch_async(self.sessionQueue) {

                        println("Getting Video Output Path")

                        //------ GRAB THE OUTPUT FILE URL TO SAVE TO PHOTO ALBUM ------
                        let outputPath = "\(self.documentsPath)/output.mov"

                        self.outputFileURL = NSURL(fileURLWithPath: outputPath)
                        self.session.startRunning()

                        println("Starting to record to output path")

                        self.movieFileOutput!.startRecordingToOutputFileURL(self.outputFileURL!, recordingDelegate: self)

                        self.isSessionRunning = true
                    }
                }
                else {

                    println("Device is not authorized to take video")

                }

                self.weAreRecording = true
            }
            else {

                //------ STOP THE VIDEO, PROCESS THE VIDEO HERE ------
                println("Stopping the video")

                dispatch_async(self.sessionQueue) {

                    println("Stopping the session from recording")

                    //------ STOP RECORDING AND SAVE TO VIDEO TO PHOTO ALBUM ------
                    self.session.stopRunning()
                    self.movieFileOutput!.stopRecording()

                    println("Saving the video to the photo albums")

                    UISaveVideoAtPathToSavedPhotosAlbum(String(contentsOfURL: self.outputFileURL!), nil, nil, nil)

                    println("Succesfully saved the video to the photo album")

                    self.isSessionRunning = false
                }

                self.weAreRecording = false
            }
        }
        else {

            //------ HANDLE TAKING A PICTURE HERE ------
            println("Taking a picture")
        }
    }

1 个答案:

答案 0 :(得分:2)

除了一种巧合之外,这与AV基金会没有任何关系。问题是异步方法的本质 - 几乎所有与AVFoundation相关的东西都是异步的。

因此,您按此顺序获取控制台消息的事实:

(1)成功将视频保存到相册

(2)2015-05-16 19:09:02.371 CopWatch [685:234398] *由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'* - [NSURL initFileURLWithPath:] :nil string parameter'

......毫无意义。 UISaveVideoAtPathToSavedPhotosAlbum是异步。这意味着它需要时间(实际上相当长的时间)并在后台线程上运行。与此同时,您的主要代码只是轻快地继续前进。 然后,在它的后台线程中,UISaveVideoAtPathToSavedPhotosAlbum崩溃并烧毁 - 大概是因为这种与线程的混淆。

要理顺这一点,首先回过头来修复你对UISaveVideoAtPathToSavedPhotosAlbum的调用,以便它有一个完成处理程序。除了完成处理程序之外什么都不做。因此,您的println将在完成处理程序中发生,因此您将真实地看到视频是否已成功保存。