【问题标题】:Export files from Music Library to Documents directory (Swift 5)将文件从音乐库导出到 Documents 目录 (Swift 5)
【发布时间】:2021-01-10 14:44:24
【问题描述】:

在我的应用程序中,我想从音乐库中导出文件并将它们保存到 Documents 目录。我已经从音乐库中获取了文件列表,并且得到了每个文件的 url。但是我还有两个问题:

  1. 我只能以“m4a”格式导出文件,但我想以音乐库中的文件格式(mp3、wav、aac 或其他)导出文件

  2. 如何使用 url 将音乐库中的文件保存到 Documents 目录? 我的代码现在看起来像这样:

     private func exportFile(with assetURL: URL, completionHandler: @escaping (_ fileURL: URL?, _ error: Error?) -> ()) {
         let asset = AVURLAsset(url: assetURL)
         guard let exporter = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetAppleM4A) else {
             completionHandler(nil, nil)
             return
         }
    
         let fileURL = URL(fileURLWithPath: NSTemporaryDirectory())
             .appendingPathComponent(NSUUID().uuidString)
             .appendingPathExtension("m4a")
    
         exporter.outputURL = fileURL
         exporter.outputFileType = AVFileType.m4a
    
         exporter.exportAsynchronously {
             if exporter.status == .completed {
                 completionHandler(fileURL, nil)
             } else {
                 completionHandler(nil, exporter.error)
             }
         }
    
    func downloadFile(file: MPMediaItem?, callback: @escaping () -> ()) {
         guard let file = file,
               let url = file.url
         else { return }
         exportFile(with: url) { fileURL, error in
             guard let fileURL = fileURL, error == nil else {
                 print(error?.localizedDescription)
                 return
             }
    
             //Here I'd like to save file to Documents dir
             print("\(fileURL)")
         }
         callback()
       }
    

【问题讨论】:

    标签: ios swift apple-musickit


    【解决方案1】:

    第二个问题的解答。

    我将代码放在一种方法中,直接保存到 Documents 文件夹,而不是临时文件夹:

    func downloadFile(file: MPMediaItem?, callback: @escaping () -> ()) {
            guard let file = file,
                  let url = file.assetURL
            else { return }
            let exportSession = AVAssetExportSession(asset: AVAsset(url: url), presetName: AVAssetExportPresetAppleM4A)
            exportSession?.shouldOptimizeForNetworkUse = true
            exportSession?.outputFileType = AVFileType.m4a
            
            let documentURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
            let outputURL = documentURL.appendingPathComponent("\(file.title!).m4a")
            //        //Delete Existing file if needs
            //        do {
            //              try FileManager.default.removeItem(at: outputURL)
            //        } catch let error as NSError {
            //              print(error.debugDescription)
            //        }
            exportSession?.outputURL = outputURL
            exportSession?.exportAsynchronously(completionHandler: { () -> () in
                
                if exportSession!.status == AVAssetExportSession.Status.completed  {
                    print("Export Successful")
                    DispatchQueue.main.async {
                        //Update IU
                        callback()
                    }
                } else {
                    print("Export failed")
                }
            })
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      相关资源
      最近更新 更多