如何在 Swift 2 的 iOS 应用程序中使用音频?

Posted

技术标签:

【中文标题】如何在 Swift 2 的 iOS 应用程序中使用音频?【英文标题】:How to use audio in iOS application with Swift 2? 【发布时间】:2015-09-01 13:30:45 【问题描述】:

我使用 SpriteKit 和 Swift 在 Xcode 7 测试版上制作了一个游戏,我尝试将音频放入其中,但由于 Xcode 发现 3 个错误,我是初学者,不知道如何修复它们。

p>
import AVFoundation

    var audioPlayer = AVAudioPlayer()


    func playAudio() 
        // Set the sound file name & extension
        var alertSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Flip 02", ofType: "wav")!)

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

        // Play the sound
        var error: NSError?
        audioPlayer = AVAudioPlayer(contentsOfURL: alertSound, error: &error)
        audioPlayer.prepareToPlay()
        audioPlayer.play()

代码的错误在这里:

代码 1:

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

错误 1:

调用中的额外参数“错误”

代码 2:

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

错误 2:

调用中的额外参数“错误”

代码 3:

audioPlayer = AVAudioPlayer(contentsOfURL: alertSound, error: &error)

错误 3:

找不到接受“(contentsOfURL: NSURL, error: inout NSError?)”类型参数列表的“AVAudioPlayer”类型的初始化程序

您的贡献可能会对我有所帮助。谢谢。

【问题讨论】:

Swift do-try-catch syntax的可能重复 【参考方案1】:

使用do catch 中的函数并使用try 进行投掷:

var audioPlayer = AVAudioPlayer()

func playAudio() 
    do 
        if let bundle = NSBundle.mainBundle().pathForResource("Flip 02", ofType: "wav") 
            let alertSound = NSURL(fileURLWithPath: bundle)
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            try AVAudioSession.sharedInstance().setActive(true)
            try audioPlayer = AVAudioPlayer(contentsOfURL: alertSound)
            audioPlayer.prepareToPlay()
            audioPlayer.play()
        
     catch 
        print(error)
    

有关完整的 Swift 2 错误处理说明,请参阅 this answer。

【讨论】:

它工作正常,但你没有展示如何让音频一直由它自己重播。 我自己找到了解决方案。而对于重复只需要添加:audioPlayer.numberOfLoops = -1。感谢您的贡献。【参考方案2】:

在 Swift 2.0 中处理错误已更改。 Foundation 和其他系统框架现在使用使用 try 和 catch 机制的新型错误处理。

在 Cocoa 中,产生错误的方法采用 NSError 指针参数作为最后一个参数,如果发生错误,它会使用 NSError 对象填充其参数。根据 Swift 的原生错误处理功能,Swift 会自动将产生错误的 Objective-C 方法转换为抛出错误的方法。

如果您查看您使用的函数的定义,您会发现它们现在抛出异常。例如:

public func setActive(active: Bool) throws

您可以看到没有错误参数,因为函数抛出错误。这大大减少了 NSError 处理的痛苦,也减少了你需要编写的代码量。

因此,无论您在函数中看到 error 作为最后一个参数的什么地方,都将其删除并编写 try!在它面前。一个例子是这样的:

try! AVAudioSession.sharedInstance().setActive(true)

由于错误处理不是这个问题的范围,你可以阅读更多关于它here。

这是您编写的代码的更正版本:

import AVFoundation

var audioPlayer = AVAudioPlayer()

func playAudio() 
    // Set the sound file name & extension
    let alertSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Flip 02", ofType: "wav")!)

    // Preperation
    try! AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, withOptions: [])
    try! AVAudioSession.sharedInstance().setActive(true)

    // Play the sound
    do 
        try audioPlayer = AVAudioPlayer(contentsOfURL: alertSound)
        audioPlayer.prepareToPlay()
        audioPlayer.play()
     catch 
        print("there is \(error)")
    

【讨论】:

【参考方案3】:

这个想法是对 AVAudioPlayer 进行扩展,并使用一个方法来调用任何类。

1) 创建一个名为“AppExtensions”的空 swift 类。添加以下内容。

 //  AppExtensions.swift

    import Foundation
    import UIKit
    import SpriteKit
    import AVFoundation   

    //Audio
    var audioPlayer = AVAudioPlayer()

    extension AVAudioPlayer 

        func playMusic(audioFileName:String,audioFileType:String)
            
            do 

            let alertSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource(audioFileName, ofType: audioFileType)!)

           // Removed deprecated use of AVAudioSessionDelegate protocol
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            try AVAudioSession.sharedInstance().setActive(true)
            try audioPlayer = AVAudioPlayer(contentsOfURL: alertSound)
            audioPlayer.prepareToPlay()
            audioPlayer.play()

            
            catch 
                print(error)
            
    
    

2) 在任何类中调用扩展方法。

var audioPlayer1 = AVAudioPlayer()
audioPlayer1.playMusic(audioFileName:"tik",audioFileType:"wav")

【讨论】:

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

在 iOS 中使用 Swift 保存 PDF 文件并显示它们

在 iOS SWIFT 2 中取消获取请求 [关闭]

如何使用Swift在iOS 8上显示带有文本的活动指示器?

如何在 iOS 上使用 swift 防止我的​​应用程序屏幕锁定

如何使用 Swift 在 iOS 应用中接收/导入共享数据? [复制]

ios - 如何在 Web 视图中使用 javascript 打开 swift 视图?