Swift - 从远程URL下载视频并将其保存在相册中

时间:2016-02-18 11:15:44

标签: ios iphone swift ipad

我目前正在我的应用中显示视频,并希望用户能够将其保存到其设备库/相册/相机胶卷中。 这就是我正在做的事情,但视频没有保存在相册中:/

    func downloadVideo(videoImageUrl:String)
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
        //All stuff here

        print("downloadVideo");
        let url=NSURL(string: videoImageUrl);
        let urlData=NSData(contentsOfURL: url!);

        if((urlData) != nil)
        {
            let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0];

            let fileName = videoImageUrl; //.stringByDeletingPathExtension

            let filePath="\(documentsPath)/\(fileName)";

            //saving is done on main thread

            dispatch_async(dispatch_get_main_queue(), { () -> Void in

                urlData?.writeToFile(filePath, atomically: true);
                print("videoSaved");
            })

        }
    })

}

我也会看到这个:

let url:NSURL = NSURL(string: fileURL)!;

    PHPhotoLibrary.sharedPhotoLibrary().performChanges({
        let assetChangeRequest = PHAssetChangeRequest.creationRequestForAssetFromVideoAtFileURL(url);
        let assetPlaceHolder = assetChangeRequest!.placeholderForCreatedAsset;
        let albumChangeRequest = PHAssetCollectionChangeRequest(forAssetCollection: self.assetCollection)
        albumChangeRequest!.addAssets([assetPlaceHolder!])
        }, completionHandler: saveVideoCallBack)

但我有错误"无法从文件(null)"创建数据。我的" assetChangeRequest"没有。我不明白,因为我的网址是有效的,当我使用浏览器访问它时,它会下载一个快速时间文件。

如果有人可以帮助我,我们将不胜感激!我使用Swift并定位iOS 8.0分钟。

3 个答案:

答案 0 :(得分:24)

<强>更新

想要使用URLSession更新Swift 3的答案,并发现答案已存在于相关主题here中。使用它。

原始答案

以下代码将视频文件保存到相机胶卷。我重复使用了您的代码 - 我删除了let fileName = videoImageUrl;因为它导致了错误的文件路径。

我测试了这段代码并将资产保存到相机胶卷中。您询问了creationRequestForAssetFromVideoAtFileURL中的内容 - 为下载的视频文件添加了一个链接,如下例所示。

let videoImageUrl = "http://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_1mb.mp4"

DispatchQueue.global(qos: .background).async {
    if let url = URL(string: urlString),
        let urlData = NSData(contentsOf: url) {
        let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0];
        let filePath="\(documentsPath)/tempFile.mp4"
        DispatchQueue.main.async {
            urlData.write(toFile: filePath, atomically: true)
            PHPhotoLibrary.shared().performChanges({
                PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: URL(fileURLWithPath: filePath))
            }) { completed, error in
                if completed {
                    print("Video is saved!")
                }
            }
        }
    }
}

答案 1 :(得分:11)

来自@Nimble的Swift 3版本代码:

DispatchQueue.global(qos: .background).async {
    if let url = URL(string: urlString),
        let urlData = NSData(contentsOf: url)
    {
        let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0];
        let filePath="\(documentsPath)/tempFile.mp4"
        DispatchQueue.main.async {
            urlData.write(toFile: filePath, atomically: true)
            PHPhotoLibrary.shared().performChanges({
                PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: URL(fileURLWithPath: filePath))
            }) { completed, error in
                if completed {
                    print("Video is saved!")
                }
            }
        }
    }
}

答案 2 :(得分:0)

PHPhotoLibrary.shared()。performChanges({

PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL:video.url!)}){

保存,输入错误

如果已保存{

打印(“保存状态成功”)

}

}