在Swift3里面实现点击不同按钮播放不同声音的一种实现方法

以下代码使用AVAudioPlayer(需要import AVFundation库并为相应的controller添加AVAudioPlayerDelegate,记得在viewDidLoad的时候还要把delegate设为self)

import UIKit
import AVFoundation

class GameViewController: UIViewController, AVAudioPlayerDelegate {

。。。。。。

// declare a AVAudioPlayer object
var audioPlayer: AVAudioPlayer?

override func viewDidLoad() {
super.viewDidLoad()

// Set the delegate of AVAudioPlayer to self
audioPlayer?.delegate = self

// Play the first audio
audioPlay(audioName: "end1")
audioPlayer?.play()

。。。。。。

}

@IBAction func btnMiddleClicked(_ sender: UIButton) {
switch gameStep {
case 0:


// Set the audio
audioPlay(audioName: "tianhei")
// Play the audio
audioPlayer?.play()
gameStep += 1
case 1:

audioPlay(audioName: "jingzhang")
// Play the audio
audioPlayer?.play()
// Set the timer
self.timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(GameViewController.update), userInfo: nil, repeats: true)
RunLoop.current.add(timer, forMode: RunLoopMode.commonModes)

。。。。。。

}

// ----------------------------------------------------------
// Audio Playing part

func audioPlay(audioName: String) {
let url = URL.init(fileURLWithPath: Bundle.main.path(forResource: audioName, ofType: "mp3")!)
do {
try audioPlayer = AVAudioPlayer(contentsOf: url)
audioPlayer?.prepareToPlay()
} catch {
NSLog("Failed to set audio session category. Error: \(error)")
}
}

func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully
flag: Bool) {
}

func audioPlayerDecodeErrorDidOccur(_ player: AVAudioPlayer,
error: Error?) {
}

func audioPlayerBeginInterruption(_ player: AVAudioPlayer) {
}

func audioPlayerEndInterruption(player: AVAudioPlayer) {
}

。。。。。。

}

另外这里需要提到一个比较严重的问题:

在做项目的时候,我曾发现同样的代码在多台机器上会反复在播放声音的时候出错,而且没有任何错误提示。而在另外一些机器上却永远不出错。

出错截屏如下:

后来发现原因是部分Mac的音频输出没有设置成使用音频,而是用扬声器(speaker),这样就需要音频的比特率不得高于28kbps。

而在另一些机器上,只要设置了是用音频,就可以正常播放。

解决办法就是把我的mp3资源的比特率降到28kbps或以下。不过我现在选择就不管它了,因为手机上是可以播的,就是模拟器上可能会crash。无所谓

posted on 2017-02-07 21:16  锅仔排骨  阅读(368)  评论(0编辑  收藏  举报