如何在 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 防止我的应用程序屏幕锁定