如何使用AVAudioPlayerNode从资产目录中播放声音?

时间:2017-08-12 05:55:42

标签: swift avfoundation avaudioplayer avaudioplayernode avaudiofile

我正在尝试使用AVAudioPlayerNode播放Assets.xcassets资产目录中的声音,但我无法弄清楚如何操作。

我一直在使用AVAudioPlayer,可以使用NSDataAsset进行初始化,如下所示:

let sound = NSDataAsset(name: "beep")!
do {
    let player = try AVAudioPlayer(data: sound.data, fileTypeHint: AVFileTypeWAVE)
    player.prepareToPlay()
    player.play()
} catch {
    print("Failed to create AVAudioPlayer")
}

我想改用AVAudioPlayerNode(用于音高变换和其他原因)。我可以创建引擎并连接节点OK:

var engine = AVAudioEngine()
func playSound(named name: String) {
    let mixer = engine.mainMixerNode
    let playerNode = AVAudioPlayerNode()
    engine.attach(playerNode)
    engine.connect(playerNode, to: mixer, format: mixer.outputFormat(forBus: 0))

    // play the file (this is what I don't know how to do)
}

看起来用于播放文件的方法是playerNode.scheduleFile()。它需要AVAudioFile,所以我想我会尝试制作一个。但AVAudioFile的初始化程序需要一个URL。据我所知,资产目录中的资产不能通过URL获得。我可以使用NSDataAsset直接获取数据,但似乎没有任何方法可以使用它来填充AVAudioFile

是否可以使用AVAudioPlayerNode播放资产目录中的声音?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:0)

好的,您的问题是您希望从资产目录中的文件中获取address吗?

我环顾四周但发现this answer

正如它所说

  

它基本上只从资源获取图像,将其数据保存到磁盘并返回文件URL

您应该更改它以查找MP3文件(或WAV或您喜欢的任何内容,也许这可能是输入参数)

所以你最终会得到类似的东西:

URL

也许有点牵强,但我还没有找到任何其他选择。

希望对你有所帮助。