用 AVAudioPlayer 播放声音

我试着用 AVAudioPlayer播放一个声音,但是它不工作。

编辑1: 仍然不工作。

编辑2 : 这个代码可以工作。我的设备处于静默模式。

import UIKit
import AVFoundation


class ViewController: UIViewController {


var audioPlayer = AVAudioPlayer()


override func viewDidLoad() {
super.viewDidLoad()


var alertSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("button-09", ofType: "wav"))
println(alertSound)


var error:NSError?
audioPlayer = AVAudioPlayer(contentsOfURL: alertSound, error: &error)
audioPlayer.prepareToPlay()
audioPlayer.play()
}
}
102884 次浏览

您的音频播放将被释放后,viewDidLoad 完成,因为您分配给一个本地变量。您需要为它创建一个属性来保存它。

对代码进行了修改:

import UIKit
import AVFoundation


class ViewController: UIViewController {


var audioPlayer = AVAudioPlayer()


override func viewDidLoad() {
super.viewDidLoad()


var alertSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("button-09", ofType: "wav"))
println(alertSound)


// Removed deprecated use of AVAudioSessionDelegate protocol
AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, error: nil)
AVAudioSession.sharedInstance().setActive(true, error: nil)


var error:NSError?
audioPlayer = AVAudioPlayer(contentsOfURL: alertSound, error: &error)
audioPlayer.prepareToPlay()
audioPlayer.play()
}


}

Swift 3和 Swift 4.1:

import UIKit
import AVFoundation


class ViewController: UIViewController {
private var audioPlayer: AVAudioPlayer?


override func viewDidLoad() {
super.viewDidLoad()


let alertSound = URL(fileURLWithPath: Bundle.main.path(forResource: "button-09", ofType: "wav")!)
print(alertSound)


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


try! audioPlayer = AVAudioPlayer(contentsOf: alertSound)
audioPlayer!.prepareToPlay()
audioPlayer!.play()
}
}

这会有用的。

import UIKit
import AVFoundation


class ViewController: UIViewController {


var ding:AVAudioPlayer = AVAudioPlayer()


override func viewDidLoad() {
super.viewDidLoad()


prepareAudios()
ding.play()
}


func prepareAudios() {


var path = NSBundle.mainBundle().pathForResource("ding", ofType: "mp3")
ding = AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: path!), error: nil)
ding.prepareToPlay()
}
}

根据 Swift 2,代码应该是

var audioPlayer : AVAudioPlayer!


func playSound(soundName: String)
{
let coinSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource(soundName, ofType: "m4a")!)
do{
audioPlayer = try AVAudioPlayer(contentsOfURL:coinSound)
audioPlayer.prepareToPlay()//there is also an async version
audioPlayer.play()
}catch {
print("Error getting the audio file")
}
}

解决方案是 AudioPlayer,它在导航栏中将播放/暂停/停止按钮作为条形按钮项

在 Swift 2.1中,您可以使用以下代码

import UIKit
import AVFoundation


class ViewController: UIViewController {


var player:AVAudioPlayer = AVAudioPlayer()


override func viewDidLoad() {
super.viewDidLoad()


let audioPath = NSBundle.mainBundle().pathForResource("ARRehman", ofType: "mp3")
var error:NSError? = nil
do {
player = try AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: audioPath!))
}
catch {
print("Something bad happened. Try catching specific errors to narrow things down")
}


}


@IBAction func play(sender: UIBarButtonItem) {
player.play()


}




@IBAction func stop(sender: UIBarButtonItem) {
player.stop()
print(player.currentTime)
player.currentTime = 0
}




@IBAction func pause(sender: UIBarButtonItem) {


player.pause()
}




@IBOutlet weak var sliderval: UISlider!




@IBAction func slidermov(sender: UISlider) {


player.volume = sliderval.value
print(player.volume)
}


}

使用这个函数在 Swift 中发声(你可以在你想发声的地方使用这个函数。)

首次添加 SpriteKit 和 AVFoundation 框架。

import SpriteKit
import AVFoundation
func playEffectSound(filename: String){
runAction(SKAction.playSoundFileNamed("\(filename)", waitForCompletion: false))
}// use this function to play sound


playEffectSound("Sound File Name With Extension")
// Example :- playEffectSound("BS_SpiderWeb_CollectEgg_SFX.mp3")

这是一个相当老的问题,但我没有看到一个与 Swift 3.0一起工作的答案,所以我现代化的代码,并增加了一些安全检查,以防止崩溃。

我还采取了一种方法,将玩家的角色提升到自己的功能中,以帮助任何遇到这个问题的人进行重用。

import UIKit
import AVFoundation


class ViewController: UIViewController {
var audioPlayer: AVAudioPlayer?


override func viewDidLoad() {
super.viewDidLoad()


play(for: "button-09", type: "wav")
}


func play(for resource: String, type: String) {
// Prevent a crash in the event that the resource or type is invalid
guard let path = Bundle.main.path(forResource: resource, ofType: type) else { return }
// Convert path to URL for audio player
let sound = URL(fileURLWithPath: path)
do {
audioPlayer = try AVAudioPlayer(contentsOf: sound)
audioPlayer?.prepareToPlay()
audioPlayer?.play()
} catch {
// Create an assertion crash in the event that the app fails to play the sound
assert(false, error.localizedDescription)
}
}
}

从 Swift 4.2开始,AudioSession 类别设置选项已经更改

import UIKit
import AVFoundation




class ViewController: UIViewController {




var audioPlayer: AVAudioPlayer?


override func viewDidLoad() {
super.viewDidLoad()
prepareAudioSession()
}




func prepareAudioSession() -> Void {
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback, mode: AVAudioSession.Mode.default, options: AVAudioSession.CategoryOptions.defaultToSpeaker)
try AVAudioSession.sharedInstance().setActive(true)


prepareAudioPlayer()


} catch {
print("Issue with Audio Session")
}
}




func prepareAudioPlayer() -> Void {


let audioFileName = "test"
let audioFileExtension = "mp3"


guard let filePath = Bundle.main.path(forResource: audioFileName, ofType: audioFileExtension) else {
print("Audio file not found at specified path")
return
}


let alertSound = URL(fileURLWithPath: filePath)
try? audioPlayer = AVAudioPlayer(contentsOf: alertSound)
audioPlayer?.prepareToPlay()
}




func playAudioPlayer() -> Void {
audioPlayer?.play()
}




func pauseAudioPlayer() -> Void {
if audioPlayer?.isPlaying ?? false {
audioPlayer?.pause()
}
}




func stopAudioPlayer() -> Void {
if audioPlayer?.isPlaying ?? false {
audioPlayer?.stop()
}
}


func resetAudioPlayer() -> Void {
stopAudioPlayer()
audioPlayer?.currentTime = 0
playAudioPlayer()
}


}