如何在 Swift 应用程序中访问声音文件

Posted

技术标签:

【中文标题】如何在 Swift 应用程序中访问声音文件【英文标题】:How to access sound files in Swift app 【发布时间】:2015-04-22 22:11:26 【问题描述】:

所以我正在创建一个在 Swift 中下载声音文件的 iPhone 应用程序,我有一个问题。使用 Xcode 和 ios 模拟器,我能够成功地将所需的音频文件下载到模拟器上。我发现正在下载的文件在我的 OSx 机器上的这个目录中:

OS X -> 用户 -> “我的名字” -> 库 -> 开发人员 -> CoreSimulator -> 设备 -> 96CDD... -> 数据 -> 6B742... -> 文档

现在我的问题是,我知道我在应用程序内部的设备上拥有音频文件,但我如何访问它们然后从应用程序本身播放它们?我试图只使用 AVAudioPlayer,但我无法成功访问该文件。这是我试图运行的代码,它位于 viewDidLoad 函数内部:

    var playYoda = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Documents/do_or_do_not", ofType: "wav")!)
    println(playYoda)

    AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, error: nil)
    AVAudioSession.sharedInstance().setActive(true, error: nil)

    var error:NSError?
    audioPlayer = AVAudioPlayer(contentsOfURL: playYoda, error: &error)
    audioPlayer.prepareToPlay()
    audioPlayer.play()

我的所有代码都编译了,但是当我启动模拟器时,我收到了这个错误:fatal error: unexpectedly found nil while unwrapping an Optional value就在我的第一行代码链接(var playYoda = ...)。

我不知道这是因为我的音频文件路径错误,还是我在使用 AVAudioPlayer 时做错了什么。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

怎么样:

let fileManager = NSFileManager.defaultManager()

let urls = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)

if let documentDirectoryURL: NSURL = urls.first as? NSURL 
    let playYoda = documentDirectoryURL.URLByAppendingPathComponent("do_or_do_not.wav")

    println("playYoda is \(playYoda)")

【讨论】:

所以 URL 提供了文件的正确路径,但是我将如何在 AVAudioPlayer 中使用这个新 URL 来播放文件? 和以前一样:audioPlayer = AVAudioPlayer(contentsOfURL: playYoda, error: &error) 非常感谢。这对我很有帮助 不知道文件名怎么办?即你想展示一个可用文件的列表,然后当用户点击一个你播放它? 您必须向display the list of available files and then let the user choose 编写一些代码(我在此处包含的链接应该可以帮助您入门)。用户选择后,您可以获取结果并将其传递给我在回答中提出的 API。【参考方案2】:

您还可以这样做:

打开您的 Xcode 项目,在项目导航器中选择您的音频文件,然后点击删除(确保将它们移动到垃圾箱,而不仅仅是删除引用)。

然后转到文件 > 将文件添加到“您的应用”。

选择您要导入的音频文件,并确保选中默认设置(“如果需要,复制项目”、“创建组”和“将文件添加到目标:您的应用”)。

对于文件路径写入:

var playYoda = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("do_or_do_not", ofType: "wav")!)

【讨论】:

以上是关于如何在 Swift 应用程序中访问声音文件的主要内容,如果未能解决你的问题,请参考以下文章

Swift AVAudioPlayer 不播放声音

如何在 Swift 2 中播放声音文件

如何让背景音乐继续播放而我的应用程序在使用 Swift 时仍然播放其声音

在 Swift 中重复播放声音文件?

我可以在 xcode 的不同文件夹中使用相同的文件名以及如何在 ios Swift 语言中访问它

如何在 Xcode11 中的 Swift 中随机播放数组中的音频文件?