ios - 将视频保存在图库中并存储视频的路径

标签 ios swift video path photo-gallery

我有一个应用程序,用户可以在其中录制视频,该视频保存在照片库中,我存储视频的路径,以便将来用户可以在应用程序中再次看到该视频。问题是我认为我使用的方法给了我某种临时路径,几天后,视频仍在画廊中,但路径不再有效并使应用程序崩溃。这是我正在使用的代码:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {
    let mediaType: String = info["UIImagePickerControllerMediaType"] as! String
    if mediaType == "public.movie" {
        let tempImageURL = info[UIImagePickerControllerMediaURL] as! NSURL!
        let pathString = tempImageURL.relativeString
        self.dismissViewControllerAnimated(true, completion: {})
        if picker.sourceType == UIImagePickerControllerSourceType.PhotoLibrary {
            self.videoPath = pathString
            // Save the path in the DB
        } else {
            VideoManager.saveVideo(tempImageURL, onComplete: { (path) -> Void in
                self.videoPath = path
                // Save the path in the DB
            })
            var fileManager: NSFileManager = NSFileManager()
            fileManager.removeItemAtPath(pathString!, error: nil)
        }
    }
}

VideoManager.saveVideo方法代码如下:

func saveVideo(videoURL: NSURL, onComplete:((path: String) -> Void)) {
    var assetsLibrary: ALAssetsLibrary = ALAssetsLibrary()
    assetsLibrary.writeVideoAtPathToSavedPhotosAlbum(videoURL, completionBlock: { (assetURL: NSURL!, error: NSError!) -> Void in
        var path: String = error == nil ? "\(assetURL)" : kEmptyString
        onComplete(path: path)
    })
}

我不知道自己做错了什么,我已经尝试使用 UISaveVideoAtPathToSavedPhotosAlbum 方法但没有成功。有什么想法吗?

为了提供更多信息,当从图库中选择视频时,我得到的 url 如下所示:

file:///private/var/mobile/Containers/Data/Application/D2E8E31B-CEA0-43B0-8EF9-1820F6BDE4A9/tmp/trim.AD855155-AB78-4A16-9AA8-DF2B3F39824E.MOV

当我使用相机录制新视频时,首先我有这个 URL:

file:///private/var/mobile/Containers/Data/Application/D2E8E31B-CEA0-43B0-8EF9-1820F6BDE4A9/tmp/capture/capturedvideo.MOV

当我执行 writeVideoAtPathToSavedPhotosAlbum 时,它会返回如下 URL:

assets-library://asset/asset.MOV?id=958507B5-1353-4DDC-BC07-D9CBC6126657&ext=MOV

它们都可以工作,但几天后停止工作。

最佳答案

好吧,我终于找到了解决方案,问题是您无法使用存储的 URL 直接访问照片库,您必须使用我缺少的 assetLibrary.assetForURL 方法。最后imagepickercontroller委托(delegate)方法是这样的:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {
    let mediaType: String = info["UIImagePickerControllerMediaType"] as! String
    if mediaType == "public.movie" {
        self.dismissViewControllerAnimated(true, completion: {})
        if picker.sourceType == UIImagePickerControllerSourceType.PhotoLibrary {
            let tempImageURL = info[UIImagePickerControllerReferenceURL] as! NSURL!
            self.videoPath = tempImageURL.absoluteString
        } else {
            let tempImageURL = info[UIImagePickerControllerMediaURL] as! NSURL!
            VideoManager.saveVideo(tempImageURL, onComplete: { (path) -> Void in
                self.videoPath = path
            })
        }
    } 
}

我还遗漏了当你录制视频时,你必须使用以下方法获取 url:

let tempImageURL = info[UIImagePickerControllerMediaURL] as! NSURL!

但是当您获得视频后,您必须:

let tempImageURL = info[UIImagePickerControllerReferenceURL] as! NSURL!

希望对您有所帮助!

关于ios - 将视频保存在图库中并存储视频的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32870711/

相关文章:

ios - 以编程方式快速使图像适合 CALayer 内容的正确方法?

ios - 在 iOS 图表中使用自定义颜色 labelTextColor

ios - 如何在 iOS 中的圆形 UIView 中获取 CGPoint?

ios - 直到滚动才显示 uitableview 标题背景

swift - 如何在具有 100% 代码覆盖率的 Xcode 单元测试中编写 do {} catch {}

testing - 如何对视频流服务器进行压力测试?

Linux 中的 JavaFX WebEngine 视频播放

android - 为什么我们必须为所有设备屏幕尺寸(移动开发)提供图像?

ios - 核心数据中带有 NSPredicate 的 NSFetchRequest

java - 从 ffmpeg 的标准输出读取的图像有时确实会变得困惑。为什么?