gpt4 book ai didi

ios - FileManager 找不到音频文件

转载 作者:搜寻专家 更新时间:2023-11-01 06:28:35 26 4
gpt4 key购买 nike

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

录音和回放在一次录音中运行良好,设置如下:

// 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 中重新计算了 documentsDirectory,但是也没有成功:

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

最佳答案

您不能保存沙盒文件 URL 或路径字符串供以后使用,因为沙盒可以移动。您需要成功地完成之前所做的事情:计算文档目录 URL,然后检查它。您应该完全使用 URL,并且根本不要调用 absoluteString;这完全是错误的决定,让你失望了。

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

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

关于ios - FileManager 找不到音频文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50419641/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com