【问题标题】:FileManager cannot find audio fileFileManager 找不到音频文件
【发布时间】:2018-10-29 09:16:17
【问题描述】:

你好!我的最终目标是创建一个UITableViewController,其中包含应用内录制的内容,使用FileManager 遍历/Documents/ 目录并列出在那里找到的所有录音。

使用以下设置,录制和播放功能正常,只需一次录制:

// In VC#1

 func setupRecorder(){
    let audioSession:AVAudioSession = AVAudioSession.sharedInstance()
    do {
        try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord)
    } catch {
        print("Audio Setup Error: \(error)")
    }
    do {
        try audioSession.setActive(true)
    } catch {
        print("Audio Setup Error: \(error)")
    }

    let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]

    audioFileName = "test.caf"
    audioFileUrl = documentsDirectory.appendingPathComponent(audioFileName)

    print("\n\nrecording url :\(audioFileUrl.absoluteString)\n\n")

    let recordSettings = [
        AVFormatIDKey: Int(kAudioFormatAppleLossless),
        AVEncoderAudioQualityKey : AVAudioQuality.max.rawValue,
        AVEncoderBitRateKey : 320000,
        AVNumberOfChannelsKey: 2,
        AVSampleRateKey : 44100.0
        ] as [String : Any]

    do {
        audioRecorder = try AVAudioRecorder(url: audioFileUrl, settings: recordSettings)
    } catch let error as NSError{
        print("Audio Setup Error: \(error)")
        audioRecorder = nil
    }
    audioRecorder.delegate = self
    audioRecorder.isMeteringEnabled = true
    audioRecorder.prepareToRecord()
}

...



 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == GraphViewController.getEntrySegue() {
        let navController = segue.destination as! UINavigationController
        let destination = navController.topViewController as! GraphViewController
        destination.audioFileName = audioFileName
        destination.audioFileUrl = audioFileUrl
    }

// In VC#2
func setupAudioPlayer() {
    do {
        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
    } catch {
        print(error)
    }
    do {
        try AVAudioSession.sharedInstance().setActive(true)
    } catch {
        print(error)
    }
    do {
        audioPlayer = try AVAudioPlayer(contentsOf: audioFileUrl)
    } catch {
        print("Audio Player Setup Error: \(error)")
    }
    audioPlayer.prepareToPlay()
}

这一切都很好,花花公子;它播放录制的音频文件没有任何问题。但是,当我尝试通过 FileManager 查找文件时,FileManager 找不到它。下面列出了我尝试查找此文件的过程。

        print("\(FileManager.default.fileExists(atPath: audioFileUrl.absoluteString))") // -> False

        print("\(FileManager.default.contents(atPath: audioFileUrl.absoluteString))") // -> nil

显然我一定遗漏了一些东西...特别是考虑到AVAudioPlayer 正在成功读取具有完全相同 url 的音频文件。路径打印为:

file:///var/mobile/Containers/Data/Application/1DA6BD0F-5A23-4228-92A9-A083E55ACE21/Documents/test.caf

有什么想法吗? ??????????

非常感谢!

编辑:在将 url 存储为属性之前,我正在执行以下操作,在 VC#2 中重新计算文档目录但也没有成功:

let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let results = try? FileManager.default.contentsOfDirectory(atPath: documentsDirectory.absoluteString)

【问题讨论】:

  • 回复您的编辑:absoluteString 是那里的问题。文件 URL 的 absoluteString 不是 文件路径字符串。

标签: ios swift avaudioplayer nsfilemanager avaudiorecorder


【解决方案1】:

您无法保存沙盒文件 URL 或路径字符串以供以后使用,因为沙盒可以移动。您需要成功地执行您之前所做的事情:计算文档目录 URL,然后对其进行检查。您应该完全使用 URL,并且永远不要调用 absoluteString;这完全是一个错误的电话,让你失望了。

在这个例子中,我检查文档目录中的任何文件:

let documentsDirectory = 
    FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let results = 
    try? FileManager.default.contentsOfDirectory(at: documentsDirectory, 
                                                 includingPropertiesForKeys: nil)

【讨论】:

  • 是的。 absoluteString 有时会返回不正确的信息,是不是因为沙盒位置的瞬态特性?
  • 不,这是因为这完全是错误的调用。你想要path,而不是absoluteString
  • 啊哈!问题就在于此。谢谢楼主!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多