web-dev-qa-db-ja.com

Swift-遠くのURLからビデオをダウンロードし、フォトアルバムに保存する

現在、アプリで動画を表示していますが、ユーザーがその動画をデバイスギャラリー/アルバム写真/カメラロールに保存できるようにしたいと考えています。これは私がやっていることですが、ビデオはアルバムに保存されません:/

    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」はゼロです。 URLが有効であることがわかりません。ブラウザでURLにアクセスすると、Quick Timeファイルがダウンロードされます。

誰もが私を助けることができれば、それはありがたいです!私はSwiftを使用し、iOS 8.0をターゲットにしています。

14
Melanie Journe

更新

Swift 3のURLSessionを使用して回答を更新し、関連するトピックに回答が既に存在することがわかった 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!")
                }
            }
        }
    }
}
26
Nimble

@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!")
                }
            }
        }
    }
}
12
Yuval Tal
PHPhotoLibrary.shared().performChanges({
     PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: video.url!)}) {
     saved, error in
     if saved {
          print("Save status SUCCESS")
     }
}
0