我终于开始学习播放声音,但是我没有成功在我的应用程序中播放声音。我仍在使用Xcode 10.1 / Swift4(不是4.2),因为我还不能升级到Mojave / Catalina。我读了很多关于.setCategory(.playback, mode: .default)
带有Xcode 10.1错误的文章,但是找到的解决方案是针对Swift 4.2的。另外category:
和mode:
的类型应为String
,但在docs上,该函数的解释为:
func setCategory(_类别:AVAudioSession.Category,模式:AVAudioSession.Mode,选项:AVAudioSession.CategoryOptions = [])抛出
并且它们不是String
类型。我在这里迷路了。
我的代码没有引发任何编译错误,但是在控制台上运行时,我得到了:
AVAudioSessionUtilities.mm:106:getUInt32:-类别值转换器找不到与字符串“环境”匹配的内容]
我在这里想念什么?能否请您指出正确的方向以理解此类别问题?一如既往,非常感谢您的时间和帮助。
这是应该播放声音的功能:
static func playOnceSound(soundToPlay: String) {
var player: AVAudioPlayer?
guard let url = Bundle.main.url(forResource: soundToPlay, withExtension: "mp3") else { return }
do {
// try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default) // Error: Type 'String' has no member 'playback'
try AVAudioSession.sharedInstance().setCategory("ambient", mode: "default", options: .defaultToSpeaker)
try AVAudioSession.sharedInstance().setActive(true)
/* The following line is required for the player to work on iOS 11. Change the file type accordingly*/
player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.mp3.rawValue)
/* iOS 10 and earlier require the following line:
player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileTypeMPEGLayer3) */
guard let player = player else { return }
player.numberOfLoops = 1
player.volume = 1.0
player.play()
} catch let error {
print(error.localizedDescription)
}
}
您是否尝试过以这种方式输入环境和默认值,而不是使用字符串?同样,在setCategory之前实例化音频会话对象:
var audioSession: AVAudioSession?
func setup() {
audioSession = AVAudioSession.sharedInstance()
do {
try audioSession.setCategory(AVAudioSession.Category.ambient, mode: .default, options: .defaultToSpeaker)
try audioSession.setActive(true)
}
catch {
print("Failed to set category", error.localizedDescription)
}
}
@IBAction func doPlay1(_ sender: AnyObject) {
do{
self.audioPlayer = try AVAudioPlayer(contentsOf: URL.init(string: url)!)
self.audioPlayer.prepareToPlay()
self.audioPlayer.delegate = self
self.audioPlayer.play()
}catch{
print(error.localizedDescription)
}
}