簡體   English   中英

獲取用於上傳視頻的視頻(PHAsset)的網址-Swift

[英]Getting the url of a video (PHAsset) for video uploading - swift

我創建了兩個不同的函數來將PHASSets上傳到我的后端-

uploadImageAsset()上傳所有圖像資源:

func uploadImageAsset(asset: PHAsset, projectRef: String) {
    let userID = Auth.auth().currentUser?.uid
    let db = Firestore.firestore()
    let dbRef = db.collection("projects").document(projectRef)
    let manager = PHImageManager.default()
    let option = PHImageRequestOptions()
    option.isSynchronous = false
    option.isNetworkAccessAllowed = true
    option.resizeMode = .exact
    option.version = .original
    option.deliveryMode = .highQualityFormat
    let imageSize = CGSize(width: asset.pixelWidth, height: asset.pixelHeight)
    let uniqueImageID = NSUUID().uuidString
    let storageRef = Storage.storage().reference().child("project-images").child("\(uniqueImageID).jpeg")

    manager.requestImage(for: asset, targetSize: imageSize, contentMode: .aspectFill, options: option) { (image, info) in
        let uploadData = image?.jpegData(compressionQuality: 0.6)
        storageRef.putData(uploadData!, metadata: nil, completion: {
            (metadata, error) in

            if error != nil {
                return
            } else {
                storageRef.getMetadata(completion: { (metadata, err) in
                    if let error = err {
                        print(error)
                    } else {
                        storageRef.downloadURL(completion: { (url, err) in
                            if let error = err {
                                print(error)
                            } else {
                                self.imageURLs.append((url?.absoluteString)!)
                                dbRef.updateData(["image": self.imageURLs], completion: { (err) in
                                    if err != nil {
                                        print(err)
                                    } else {
                                        SVProgressHUD.dismiss(withDelay: 0.3)
                                        self.dismiss(animated: true, completion: nil)
                                    }
                                })
                            }
                        })
                    }
                })
            }
        })
    }
}

然后uploadProjectVideos()上傳視頻的所有資產:

func uploadVideoAsset(asset: PHAsset, projectRef: String) {
    let userID = Auth.auth().currentUser?.uid
    let db = Firestore.firestore()
    let dbRef = db.collection("projects").document(projectRef)
    let manager = PHImageManager.default()
    let option = PHVideoRequestOptions()
    option.isNetworkAccessAllowed = true
    option.deliveryMode = PHVideoRequestOptionsDeliveryMode.highQualityFormat

    manager.requestAVAsset(forVideo: asset, options: option) { (video, videoAudio, nil) in
        let avurlAsset = video as! AVURLAsset
        let fileURL = avurlAsset.url.absoluteString as! URL
        let fileName = NSUUID().uuidString + ".mov"
        let uploadTask = Storage.storage().reference().child(fileName).putFile(from: fileURL, metadata: nil, completion: { (metaData, error) in
            if error != nil {
                print("Failed upload of video", error)
                return
            }

            Storage.storage().reference().child(fileName).downloadURL { (url, error) in
                self.imageURLs.append("\(url)")
                dbRef.updateData(["image": self.imageURLs], completion: { (err) in
                    if err != nil {
                        print(err)
                    } else {
                        SVProgressHUD.dismiss(withDelay: 0.3)
                        self.dismiss(animated: true, completion: nil)
                    }
                })
            }
        })
    }
}

在上傳圖片時,我的功能非常完美。 但是,我上傳視頻的功能返回nil。 視頻根本沒有上傳到后端。

這是我第一次與PHAssets合作,而Im對於如何獲取階段集的視頻網址並上傳它真的感到困惑

您可以使用requestAVAsset(forVideo:options:resultHandler :)方法,如文檔中所示: https : //developer.apple.com/documentation/photokit/phimagemanager/1616935-requestavasset 這是由@iMHitesh Surani最初進行的一些方便擴展,由@diegomen更新為快速擴展:

extension PHAsset {

func getURL(completionHandler : @escaping ((_ responseURL : URL?) -> Void)){
    if self.mediaType == .image {
        let options: PHContentEditingInputRequestOptions = PHContentEditingInputRequestOptions()
        options.canHandleAdjustmentData = {(adjustmeta: PHAdjustmentData) -> Bool in
            return true
        }
        self.requestContentEditingInput(with: options, completionHandler: {(contentEditingInput: PHContentEditingInput?, info: [AnyHashable : Any]) -> Void in
            completionHandler(contentEditingInput!.fullSizeImageURL as URL?)
        })
    } else if self.mediaType == .video {
        let options: PHVideoRequestOptions = PHVideoRequestOptions()
        options.version = .original
        PHImageManager.default().requestAVAsset(forVideo: self, options: options, resultHandler: {(asset: AVAsset?, audioMix: AVAudioMix?, info: [AnyHashable : Any]?) -> Void in
            if let urlAsset = asset as? AVURLAsset {
                let localVideoUrl: URL = urlAsset.url as URL
                completionHandler(localVideoUrl)
            } else {
                completionHandler(nil)
            }
        })
      }
    }
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM