【问题标题】:Recording video to specific album将视频录制到特定专辑
【发布时间】:2017-05-04 23:11:24
【问题描述】:

我正在用户照片库中创建一个相册,现在我想在其中保存一个视频。我正在使用以下方式将视频保存到文件中:

let documentsURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0]
let filePath = documentsURL.URLByAppendingPathComponent("video")

现在我想拍摄视频并将其保存到相册中。我发现很多关于保存到相机胶卷的内容,但没有找到保存到相册的内容。可以做到吗,如果可以,怎么做?

【问题讨论】:

  • 您忘记附加 mime 类型(文件扩展名)
  • @LeoDabus - 虽然我确实忘记了这一点,但您的评论并不能回答我的问题。

标签: swift3 xcode8 ios10 photolibrary photo-management


【解决方案1】:

假设你有一个 PHAssetCollection 指定专辑,你可以使用这个 PHAssetCollection 扩展:

extension PHAssetCollection {

    private func isCameraRollAlbum() -> Bool
    {
        let query = PHAssetCollection.fetchAssetCollections(with: .smartAlbum,
                                                            subtype: .smartAlbumUserLibrary,
                                                            options: nil)
        let result: PHAssetCollection? = query.firstObject

        return self == result
    }

    func save(videoURL: URL, completion: @escaping (URL?, String?) -> ()) {

        let isCameraRoll = isCameraRollAlbum()

        DispatchQueue.global(qos: .userInteractive).asyncAfter(deadline: .now()) {

            PHPhotoLibrary.shared().performChanges({
                if let assetRequest = PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: videoURL) {
                    if isCameraRoll == false, let placeholder = assetRequest.placeholderForCreatedAsset {
                        let albumChangeRequest = PHAssetCollectionChangeRequest(for: self)
                        albumChangeRequest?.addAssets([placeholder] as NSArray)
                    }
                }
            }, completionHandler: { (success, error) in

                if success == false {
                    completion(nil, error?.localizedDescription)
                }
                else {
                    completion(videoURL, nil)
                }

            })
        }
    }
}

备注:

定义了方法'isCameraRollAlbum'是因为发现对整个相册使用占位符不起作用,只需要使用

PHAssetChangeRequest.creationRequestForAssetFromVideo

将视频保存到整个照片库。

不需要使用后台线程。

示例用法,假设名为“Video.mov”的视频位于应用的 Documents 目录中。这会将其保存到“相机胶卷”相册,但可以指定任何相册的 PHAssetCollection:

    let docsurl = try! FileManager.default.url(for:.documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)

    let videoURL = docsurl.appendingPathComponent("Video.mov")

    let fetchResult = PHAssetCollection.fetchAssetCollections(with:.smartAlbum,subtype:.smartAlbumUserLibrary,options: nil)

    if let allMediaAlbum = fetchResult.firstObject {

        allMediaAlbum.save(videoURL: videoURL) { (url, message) in
            print("message = \(String(describing: message))")
        }
    }

例如,您可以使用此扩展程序获取具有给定名称“标题”的专辑的 PHAssetCollection:

class func getAlbum(title: String, completionHandler: @escaping (PHAssetCollection?) -> ()) {

    DispatchQueue.global(qos: .userInteractive).asyncAfter(deadline: .now()) {
        let fetchOptions = PHFetchOptions()
        fetchOptions.predicate = NSPredicate(format: "title = %@", title)
        let collections = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .any, options: fetchOptions)

        if let album = collections.firstObject {
            completionHandler(album)
        } else {
            completionHandler(nil)
        }

    }

}

使用示例,将视频“Video.mov”保存到名为“My Umbrella”的相册中:

    let docsurl = try! FileManager.default.url(for:.documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)

    let albumName = "My Umbrella"

    let videoURL = docsurl.appendingPathComponent("Video.mov")

    PHAssetCollection.getAlbum(title: albumName) { (album) in
        if let album = album {
            album.save(videoURL: videoURL, completion: { (url, error) in
                if let url = url {
                    print("Video '\(url.lastPathComponent) saved to '\(albumName)'")
                }
                else {
                    print("Error: \(String(describing: error))")
                }
            })
        }
    }

(请记住,照片库可以有多个同名相册。)

【讨论】:

  • 终于,我这三天一直在寻找的答案!!!谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
  • 1970-01-01
  • 2017-03-18
  • 2023-03-19
  • 2015-01-10
  • 2013-02-03
相关资源
最近更新 更多