使用 Swift 播放随机音频文件

Posted

技术标签:

【中文标题】使用 Swift 播放随机音频文件【英文标题】:Playing Random Audio File using Swift 【发布时间】:2014-11-22 05:22:03 【问题描述】:

我在 iPhone 模拟器中使用 “摇动手势” 时不断收到以下错误:

致命错误:在展开可选值时意外发现 nil

这是我的相关代码:

import UIKit
import AVFoundation

class ViewController: UIViewController 

    var soundFiles = ["kidLaughing", "pewpew", "pingas", "runningfeet"]
    var player: AVAudioPlayer = AVAudioPlayer()

    override func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent) 
        if event.subtype == .MotionShake 
            var randomSoundFile = Int(arc4random_uniform(UInt32(soundFiles.count)))
            var fileLocation = NSString(string:NSBundle.mainBundle().pathForResource("sounds/" + soundFiles[randomSoundFile], ofType: "mp3")!)

            var error: NSError? = nil

            player = AVAudioPlayer(contentsOfURL: NSURL(string: fileLocation), error: &error)

            player.play()
        
    

我有一个名为 sounds 的文件夹,其中包含 4 个 mp3 文件。错误发生在这行代码上:

  var fileLocation = NSString(string:NSBundle.mainBundle().pathForResource("sounds/" + soundFiles[randomSoundFile], ofType: "mp3")!)

我已经尝试了所有我能想到的方法来让它发挥作用,但我所尝试的一切都没有奏效。任何帮助表示赞赏!

【问题讨论】:

【参考方案1】:

这意味着当您断言它不是时,存在一个值为 nil 的值。将崩溃的行分成其组件并找出究竟是什么:

var soundFile = soundFiles[randomSoundFile]
var path = "sounds/" + soundFile
var fullPath = NSBundle.mainBundle().pathForResource(path, ofType: "mp3")!
var fileLocation = NSString(string:fullPath) // fyi, this line is pointless, fullPath is already a string

我猜它在 pathForResource 行上崩溃了,因为实际上无法找到该文件。确保您实际上将“声音”目录链接到您的包中。

【讨论】:

【参考方案2】:

//你也可以试试这个随机播放声音。

import UIKit
import AVFoundation
class GameScene: SKScene 
var pinballVoiceArray = ["BS_PinballBounce1.mp3", "BS_PinballBounce2.mp3", "BS_PinballBounce3.mp3"]
var randomIndex = 0
override func didMoveToView(view: SKView) 
    //use the random sound function
    playPinballSound()
   
func playPinballSound () 
    randomIndex = Int(arc4random_uniform(UInt32(pinballVoiceArray.count)))
    var selectedFileName = pinballVoiceArray[randomIndex]
    runAction(SKAction.playSoundFileNamed(selectedFileName, waitForCompletion: false))
    

// 调用函数 playPinballSound 来播放随机声音。

【讨论】:

完美!谢谢! 欢迎您【参考方案3】:
    let path = NSBundle.mainBundle().pathForResource("Ring", ofType: "mp3")
    let fileURL = NSURL(fileURLWithPath: path!)
    play = AVAudioPlayer(contentsOfURL: fileURL, error: nil)
    play.prepareToPlay()
    play.delegate = self
    play.play()

这只是一个例子

【讨论】:

【参考方案4】:

我遇到了同样的问题。

在将带有声音文件的文件夹复制到项目时,我通过选择“创建文件夹引用”而不是“创建组”解决了这个问题。

希望这也适用于您。我对 Swift 和整个 ios 编程非常陌生,所以我不知道幕后究竟发生了什么。

【讨论】:

【参考方案5】:

我遇到了同样的问题。我所做的只是“将文件添加到 MyProject...”并添加整个声音文件夹。一旦 Swift 获得了对该文件夹的引用,就无需在 pathForResource 参数中包含该文件夹。

【讨论】:

以上是关于使用 Swift 播放随机音频文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 Swift 通过 iPhone 扬声器强制播放音频文件

使用不同的 swift 文件播放音频

使用 Swift for MacOS 播放音频文件

在 Swift 中使用 EZAudio 框架播放音频文件

Mac - Swift 3 - 排队音频文件和播放

如何在 Swift 3 中使用 AVAudioPlayer 播放 .ogg 音频文件?